python學習筆記4-爬取一系列網頁的相關圖片

在上一篇python學習筆記3-爬取指定網頁的圖片 文章中,我提到了用 python 爬取一個頁面的所有圖片。

但是,萬一一篇文字的內容被分頁了,如何把這一系列的圖片都爬完呢?

分頁就是個攔路虎啊~~  T.0

一、要精準找到對應的圖片 和 分頁,我們首先要分析頁面的結構

1. 不是頁面中所有的圖片都需要的,我們只想要主體內容的圖片。

打開瀏覽器 F12 ,可以看到,圖片都是放在一個 div.content 裏面的。記下來,這個要考的~!!

2. 我們要把翻頁的所有的圖片都要下下來,所以還要分析翻頁的結構。

可以看到,翻頁的地址是相對地址,不是完全地址。所以,要記住這個頁面的根路徑。同時可以看到,這個頁面的當前頁面類名是 thisclass

3. 直接點擊最後一頁

可以看到,最後一頁的後面沒有內容了。當前頁面 thisclass 就已經是最後了。也就是說,我們爬頁面的時候,要判斷後面還有沒有內容,沒有內容就要停止爬數據。

分析完畢,開幹~!!

二、開始編碼

接觸爬蟲技術剛開始,還是用最基本的爬蟲模塊,requests+BS4+lxml。

1. 引入各種模塊。要額外安裝 requests,bs4 以及 lxml 模塊。安裝方法,見上一篇文章。

# -*- coding:utf-8 -*-
"""
    爬蟲基礎練習:
    爬指定網頁的內容 以及抓取其分頁的內容
"""
import os
import requests   # requests 模塊
import re   # 正則
from bs4 import BeautifulSoup  # 解析 HTML 的模塊 導入 BS ,版本 4。
import lxml   # bs4的解析插件模塊

2. 定義變量

# 定義網址。具體網址就不透露了,相信大家想爬的網址比我多~ (紳士笑...)
weburl = r"https://www.xxx.com/2019/1211/1.html"     # 開始的網址,也就是第一頁
webRoot = r"https://www.xxx.com/2019/1211/"          # 翻頁網址的根目錄,這裏存放了翻頁指定的頁面

# 翻頁的類, 當前頁面class
pageRe = "thisclass"

# 設置本地文件夾路徑,這裏要提前建好文件夾。
localURL = r"images/"

# 設置請求 headers,僞裝瀏覽器並接受中文數據
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
    'Accept-Language': "zh-CN,zh;q=0.9"
}

3. 定義主函數

因爲要爬的頁面 很多,肯定要用到循環。而“上一頁,下一頁,1,2,3頁”的網址又不一定有規律(雖然大多翻頁都是有規律的,但是也不排除特殊情況)。

所以,我想到的是,用函數遞歸循環。爬取一個頁面後,就爬翻頁代碼,進入下一頁繼續爬,直到最後一頁爲止。

(爲了說明思路,我把函數代碼,分段解釋。)

def getWebImages( weburl ):
    if not weburl:
        print("頁面內容已經加載完畢")
        return False

每次爬的頁面不一樣,所以要把頁面地址寫成參數。 

函數裏,首先判斷這個參數是否正確,不正確,就說明已經爬完內容了,這個就是就要終止遞歸循環,return 終止當前函數就可以~

    # 請求網址
    webReq = requests.get(weburl, headers=headers)
    webReq.encoding = webReq.apparent_encoding  # 防止中文亂碼

    # 獲取請求的HTML代碼,字符串格式
    webHTML = webReq.text

    # 用 BeautifulSoup 解析 HTML 字符串
    bs = BeautifulSoup(webHTML, "lxml")

    #  用 BeautifulSoup 獲取頁面中指定位置的圖片
    imgs = bs.select(".content img")

用 requests 請求頁面HTML 代碼。並且,用 BS4  解析HTML 字符串,從裏面獲取 內容圖片。

    # 遍歷圖片 list
    for item in imgs:
        imgSrc = item.get("src")  # 獲取每張圖片的路徑
        print( "準備下載"+ imgSrc )

        # 用 requests 下載圖片,圖片名字保留成網絡的名字
        imgReq = requests.get( imgSrc )
        with open( localURL+imgSrc.split("/")[-1] ,"wb+") as f:
            f.write( imgReq.content )  # 把網絡圖片保存在本地
            print("圖片下載完畢")

    print( "one page is over")  # 一個頁面下載完畢

遍歷圖片,並且把圖片下載到本地。

    # 開始下載下一個頁面
    # 利用 BeautifulSoup 獲取翻頁的 li。
    pagesLi = bs.select(".dede_pages li")
    # nextPage = None
    for index in range( len(pagesLi) ):  # 因爲要獲取當前頁的索引,所以就利用索引遍歷翻頁li標籤
        # 如果 class 有 “thispage”,說明這個就是當前頁面
        if pageRe in str( pagesLi[index].get("class") ):
            # 準備獲取下一個頁面的頁碼
            # 但是,如果 index+1 大於了 li 的個數,說明已經到底了,所有頁面已經翻完了
            # 不需要再遍歷了,直接終止函數運行,停止遞歸。
            if index+1 >= len(pagesLi):
                print("頁面已經翻完啦~")
                return False
            # 獲取下一個頁面的地址
            nextPage = str( pagesLi[index+1].find("a").get("href") )
            break

    print("開始加載下一個頁面內容")
    print( webRoot+ nextPage )
    getWebImages(webRoot+ nextPage )  # 遞歸調用

(函數代碼結束)

4. 開始調用吧。

# 執行函數,開始加載第一個頁面的內容
getWebImages( weburl )

大功告成~~ (紳士笑~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章