python批量爬取網絡圖片

上篇通過python爬取了一篇網絡小說,初步瞭解了爬蟲的四步流程,本文稍微擴展一點,試著從網頁中爬取出多個圖片,具體來看看:

我們今天試著從下面圖1的網頁上將所有圖片都爬取出來,放在一個指定的文件夾裡。


python批量爬取網絡圖片

圖1 目標網頁

還是按爬蟲4流程:發出請求——獲得網頁——解析內容——保存內容

1、發出請求

1)找到網頁地址:

在網頁上右鍵單擊“審查元素”,彈窗裡選中Network面板,從左側name列表裡逐個選擇項目,觀察右側Preview面板下的內容,發現出現下圖2中的樣式時,就是我們要的第一小步目標。


python批量爬取網絡圖片


在圖3所示的Headers面板下找到網頁地址URL

python批量爬取網絡圖片

圖3

Request URL:

https://m.gmw.cn/toutiao/2020-02/16/content_123107586.htm?tt_group_id=6793905493262729736

2)找到網頁中圖片地址:

由於網頁上的圖片都是有單獨網址的,與網頁的網址不同,所以我們需要在網頁代碼裡找到圖片的網址信息。繼續查找Preview面板下的網頁代碼,圖4紅框內所示即為網頁裡插圖圖片的地址,這就是我們爬取圖片真正要用的地址

python批量爬取網絡圖片

圖4, 紅方框內為圖片地址

所以,從網頁裡批量爬取圖片,實際步驟是:

發出請求(網頁地址)——獲得網頁——解析內容(得到圖片地址)——向圖片地址發出請求(循環)——獲得網頁——解析內容(得到圖片)——保存內容

獲得圖片地址的代碼為:

<code>url = 'https://m.gmw.cn/toutiao/2020-02/16/content_123107586.htm?tt_group_id=6793905493262729736' 

rep = requests.get(url)# 發出訪問請求,獲得響應
res = BeautifulSoup(rep.content, 'lxml')# 解析響應,獲得網頁內容
img_url = res.find_all('p', style="text-align:center;")# 解析網頁內容,獲得全部圖片網址/<code>

此時,我們試著檢驗一下獲得的圖片地址:

<code>for im in img_url:
jpgurl = im.find('img')['src']
print(jpgurl)/<code>

結果為圖5所示:

python批量爬取網絡圖片

圖5 網頁中所有圖片地址

2、批量獲得網頁

在上面的for循環裡,向圖片地址發生請求:

<code>for im in img_url:
jpgurl = im.find('img')['src']
r = requests.get(jpgurl)/<code>

3、解析獲得圖片

由於圖片地址裡沒有其他內容,只有圖片,解析很簡單:直接取r.content就能得到圖片。

<code>for im in img_url:
\t......\t
\tr = requests.get(jpgurl)
\tjpg = r.content/<code>

4、保存圖片

<code>for im in img_url:
\t......\t
\tjpg = r.content
\tnam = jpgurl[-23:]# 從圖片網址裡提取最後23個字符,當圖片名稱,也可以自己定義,不要重複即可
\tf = open(set_path() + nam, 'wb')# 從set_path()函數返回一個文件夾路徑,與圖片名稱組合成文件的保存地址
\tf.write(jpg)# 將圖片寫入文件/<code>

set_path()函數返回一個預設保存文件的文件夾,如果預設的文件夾不存在,就自動創建。

<code>def set_path():
path = r'e:/python/jpg'
if not os.path.isdir(path):
os.makedirs(path)
paths = path+'/'

return(paths)/<code>

運行後打開對應文件夾,圖片已經完成下載,如圖6:


python批量爬取網絡圖片

圖6 爬取到的圖片

至此,批量爬取網頁圖片就完成了。

總結:

本文的爬取過程,比常說的爬蟲4步驟多了好幾步,其實,本質上還是萬變不離其宗的4步流程。本例只不過是相當於把兩套爬取流程進行了嵌套,少了一次保存內容的過程而已。關鍵是通過爬取獲得網址後,再次爬取新網址裡的內容,真正的爬取大多是通過這種嵌套實現的。


分享到:


相關文章: