天天看點

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

做下男生想做的事,爬取大量妹子内衣圖。

作者: 電氣-餘登武

準備工作

假如我們想把京東内衣類商品的圖檔全部下載下傳到本地,通過手工複制粘貼将是一項非常龐大的工程,此時,可以用python爬蟲實作。

第一步:分析網頁位址

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

起始網頁位址

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

起始網頁位址

(在這裡你會看到,明明在浏覽器URL欄看到的是中文,但是複制url,粘貼到記事本或代碼裡面,就會變成如下這樣?)

在很多網站的URL中對一些get的參數或關鍵字進行編碼,是以我們複制出來的時候,會出現問題。但複制過來的網址可以直接打開。本例子不用管這個。

那麼,怎樣才能自動爬取第一頁以外的其他頁面,打開第三頁,網頁位址如下,分析發現和第一頁差別在于:第一頁最後&page=1,第三頁&page=3

我們可以想到自動擷取多個網頁的方法,可以for循環實作,每次循環後,page+1

第三頁網址如圖

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

第二步:分析網頁圖檔連結

在每頁中,我們都要提取對應的圖檔,可以使用正規表達式比對源碼中圖檔的連結部分,然後通過

urllib.request.urlretrieve()

将對應連結的圖檔儲存到本地。

但是這裡有一個問題,該網頁中的圖檔不僅包括清單中的圖檔,還包括旁邊一些無關圖檔。是以我們可以進行資訊過濾。我們需要找到寶貝圖檔所在區域

  1. 操作步驟1:審查元素,找到第一頁,第一個寶貝圖檔。元素如圖
    爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)
  2. 操作步驟2:空白處 單擊檢視源碼

    CTRL+F (搜尋操作步驟1圖檔的最後幾個字母)定位到寶貝1圖檔所在部分

    爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

我們通過幾次定位,找到寶貝圖檔源碼格式如下

圖檔1源碼

圖檔2源碼

于是我們可以定義正則規則

知識點.找到本機電腦網絡的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多張圖

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)
爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)

作者:電氣-餘登武

爬蟲實戰:批量爬取京東内衣圖檔(自動爬取多頁,非一頁)