爬蟲實戰:批量爬取京東內衣圖片(自動爬取多頁,非一頁)
做下男生想做的事,爬取大量妹子內衣圖。
作者: 電氣-餘登武
準備工作
假如我們想把京東內衣類商品的圖片全部下載到本地,通過手工複製貼上將是一項非常龐大的工程,此時,可以用python爬蟲實現。
第一步:分析網頁地址
起始網頁地址
起始網頁地址
https://search.jd.com/Search?keyword=%E5%86%85%E8%A1%A3%E5%A5%B3&suggest=4.def.0.base&wq=%E5%86%85%E8%A1%A3%E5%A5%B3&page=1&s=56&click=1
(在這裡你會看到,明明在瀏覽器URL欄看到的是中文,但是複製url,貼上到記事本或程式碼裡面,就會變成如下這樣?)
那麼,怎樣才能自動爬取第一頁以外的其他頁面,開啟第三頁,網頁地址如下,分析發現和第一頁區別在於:第一頁最後&page=1,第三頁&page=3
我們可以想到自動獲取多個網頁的方法,可以for迴圈實現,每次迴圈後,page+1
第三頁網址如圖
https://search.jd.com/Search?keyword=%E5%86%85%E8%A1%A3%E5%A5%B3&suggest=4.def.0.base&wq=%E5%86 %85%E8%A1%A3%E5%A5%B3&page=3&s=56&click=1
第二步:分析網頁圖片連結
在每頁中,我們都要提取對應的圖片,可以使用正則表示式匹配原始碼中圖片的連結部分,然後通過urllib.request.urlretrieve()
將對應連結的圖片儲存到本地。
但是這裡有一個問題,該網頁中的圖片不僅包括列表中的圖片,還包括旁邊一些無關圖片。所以我們可以進行資訊過濾。我們需要找到寶貝圖片所在區域
- 操作步驟1:審查元素,找到第一頁,第一個寶貝圖片。元素如圖
- 操作步驟2:空白處 單擊檢視原始碼
CTRL+F (搜尋操作步驟1圖片的最後幾個字母)定位到寶貝1圖片所在部分
我們通過幾次定位,找到寶貝圖片原始碼格式如下
圖片1原始碼
<img width="220" height="220" data-img="1" data-lazy-img="//img13.360buyimg.com/n7/jfs/t1/88198/38/15103/241083/5e6ef386E75f87219/0945cd20a8d40904.jpg" />
圖片2原始碼
<img width="220" height="220" data-img="1" data-lazy-img="//img10.360buyimg.com/n7/jfs/t1/62113/37/10114/445422/5d7a2269E8e2e7ed3/4b90428b88320241.jpg" />
於是我們可以定義正則規則
pat1='<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)'
知識點.找到本機電腦網路的headers
有的時候,我們無法爬取一些網頁,會出現403錯誤,因為這些網頁為了防止別人惡意採集資訊所以進行了一些反爬蟲的設定。
我們可以設定一些Headers資訊,模擬成瀏覽器去訪問這些網站,就能解決這個問題。
首先,單擊網頁中的百度一下,即讓網頁發生一個動作,下方窗口出現了很多資料,如圖。
此時單擊圖中的www.baidu.com,出現如圖
在Headers,往下拖動,找到User-agent
這一串資訊就是我們下面模擬瀏覽器用到的資訊,複製出來。
程式碼實現
語言:python
from urllib.parse import quote
import string
import re
from urllib import request
import urllib.request
#讀取網頁
def craw(url,page):
# 模擬成瀏覽器
headers = ("User-Agent",
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 將opener安裝為全域性
urllib.request.install_opener(opener)
url_request = request.Request(url)
html1 = request.urlopen(url_request, timeout=10)
html1 = html1.read().decode('utf-8') # 加編碼,重要!轉換為字串編碼,read()得到的是byte格式的
html=str(html1)
#print(html)
#定點陣圖片
pat1='<img width="220" height="220" data-img="1" data-lazy-img="//(.+?\.jpg)'
imagelist=re.compile(pat1).findall(html)
#print(imagelist)
x=1
for each in imagelist:
print(each)
try:
imagename='D:\\deeplearn\\xuexicaogao\\圖片\\'+str(page)+str(x)+'.jpg'
imageurl="http://"+each #補全圖片網頁地址
request.urlretrieve(imageurl, filename=imagename) # 爬下載的圖片放置在提前建好的資料夾裡
except Exception as e:
print(e)
x+=1
finally:
print('下載完成。')
x+=1
for i in range(1,30):#遍歷網頁1-29
url="https://search.jd.com/Search?keyword=%E5%86%85%E8%A1%A3%E5%A5%B3&suggest=4.def.0.base&wq=%E5%86%85%E8%A1%A3%E5%A5%B3&page="+str(i)+"&s=56&click=1"
craw(url,i)
print('結束')
結果資料夾
資料夾裡有800多張圖
作者:電氣-餘登武