在上一篇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 )
大功告成~~ (紳士笑~)