上篇通過python爬取了一篇網絡小說,初步瞭解了爬蟲的四步流程,本文稍微擴展一點,試著從網頁中爬取出多個圖片,具體來看看:
我們今天試著從下面圖1的網頁上將所有圖片都爬取出來,放在一個指定的文件夾裡。
還是按爬蟲4流程:發出請求——獲得網頁——解析內容——保存內容
1、發出請求
1)找到網頁地址:
在網頁上右鍵單擊“審查元素”,彈窗裡選中Network面板,從左側name列表裡逐個選擇項目,觀察右側Preview面板下的內容,發現出現下圖2中的樣式時,就是我們要的第一小步目標。
在圖3所示的Headers面板下找到網頁地址URL
Request URL:
https://m.gmw.cn/toutiao/2020-02/16/content_123107586.htm?tt_group_id=6793905493262729736
2)找到網頁中圖片地址:
由於網頁上的圖片都是有單獨網址的,與網頁的網址不同,所以我們需要在網頁代碼裡找到圖片的網址信息。繼續查找Preview面板下的網頁代碼,圖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所示:
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:
至此,批量爬取網頁圖片就完成了。
總結:
本文的爬取過程,比常說的爬蟲4步驟多了好幾步,其實,本質上還是萬變不離其宗的4步流程。本例只不過是相當於把兩套爬取流程進行了嵌套,少了一次保存內容的過程而已。關鍵是通過爬取獲得網址後,再次爬取新網址裡的內容,真正的爬取大多是通過這種嵌套實現的。
閱讀更多 比目魚2號 的文章