爬蟲入門之淘寶商品資訊定向爬取!雙十一到了學起來啊!

爬遍天下無敵手發表於2020-10-30

一、爬取原頁面

  爬取頁面為淘寶網站,以女裝為例,原圖如下,由於淘寶商品排名實時更新,所以爬取結果順序與網站順序可能會存在不同。本例項爬取的內容為商品的價格和名稱,併為其新增序號。

二、程式設計思路

  這一部分嵩天老師在課中給出了講解,這裡我整理分享給大家。

1.功能描述

目標:獲取淘寶搜尋頁面的資訊,提取其中的名稱和價格。

理解:
(1).獲得淘寶的搜尋介面
(2).對翻頁的處理

技術路線:requests-re

2.程式的結構設計

步驟一:提交商品搜尋請求,迴圈獲取頁面
步驟二:對於每個頁面,提取商品名稱和價格資訊
步驟三:將資訊輸出到螢幕上

對應上述三個步驟分別定義三個函式:

(1)getHTMLText()獲得頁面
(2)parsePage()對每一個獲得的頁面進行解析
(3)printGoodsList()將商品的資訊輸出到螢幕上

三、程式設計過程

1.解決翻頁問題

  首先我們來看一下前三頁分別的URL


  對淘寶每一頁商品數量的觀察我們可以發現,每一頁有44個商品,結合上面的結果我們可以猜測,變數s表示的是第二頁,第三頁…頁的起始商品的編號。基於這種規則,我們就可以構建不同頁的URL連結。

程式碼如下:

for i in range(depth):#對每次翻頁後的URL連結進行設計
    url = start_url + '&s='+str(44*i)
    html = getHTMLText(url)
    parsePage(infoList,html)

2.編寫getHTMLText()函式

def getHTMLText(url):#獲得頁面
    try:
        kv = {'user-agent': 'Mozilla/5.0',
              'cookie':' '#請自行獲取
              }
        r = requests.get(url,headers=kv,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("獲取頁面失敗")

關於cookie的獲取方法,可以參考我的這篇部落格
連結: https://blog.csdn.net/weixin_44578172/article/details/109353017.

3.編寫parsePage()函式

(1).內容解析程式設計思路

  首先檢視女裝搜尋結果頁面的原始碼


  通過對原始碼的觀察我們發現,淘寶中所有商品的價格和名稱是存在相應的鍵值對中的即:“view_price”:“價格”,“view_title”:“名稱”。所以我們想要獲得這兩個資訊,只需要在獲得的文字中檢索到view_price和view_title並把後續的相關內容提取出來即可,這裡採用正規表示式的方法。

(2).函式程式碼

def parsePage(ilt,html):#對每一個獲得的頁面進行解析
#兩個變數分別是結果的列表型別和相關的HTML頁面的資訊
    try:
        re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#編譯商品價格正規表示式
        re2 = re.compile(r'\"raw_title\"\:\".*?\"')#編譯商品名稱正規表示式
        plt = re1.findall(html)
        tlt = re2.findall(html)
        #plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        #tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])#去掉view_price欄位,只要價格部分,eval將獲取到的最外層/內層的單引號或雙引號去掉
            title = eval(tlt[i].split(':')[1])#去掉raw_title欄位,只要名稱部分
            ilt.append([price,title])
    except:
        print("網頁解析失敗")

4.編寫printGoodsList()

def printGoodsList(ilt):#將商品的資訊輸出到螢幕上
    try:
        tplt = "{:4}\t{:8}\t{:16}" #定義列印模板
        print(tplt.format("序號","價格","商品名稱"))
        count = 0
        for s in ilt:
            count = count + 1
            print(tplt.format(count,s[0],s[1]))
    except:
        print("輸出失敗")

四、完整程式碼

'''
功能描述

目標:獲取淘寶搜尋頁面的資訊,提取其中的名稱和價格。

理解:
1.獲得淘寶的搜尋介面
2.對翻頁的處理

技術路線:requests-re

程式的結構設計
步驟1:提交商品搜尋請求,迴圈獲取頁面
步驟2:對於每個頁面,提取商品名稱和價格資訊
步驟3:將資訊輸出到螢幕上
'''
import requests
import re

def getHTMLText(url):#獲得頁面
    try:
        kv = {'user-agent': 'Mozilla/5.0',
              'cookie':' '#請自行獲取
              }
        r = requests.get(url,headers=kv,timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        print("獲取頁面失敗")

def parsePage(ilt,html):#對每一個獲得的頁面進行解析
#兩個變數分別是結果的列表型別和相關的HTML頁面的資訊
    try:
        re1 = re.compile(r'\"view_price\"\:\"[\d\.]*\"')#編譯商品價格正規表示式
        re2 = re.compile(r'\"raw_title\"\:\".*?\"')#編譯商品名稱正規表示式
        plt = re1.findall(html)
        tlt = re2.findall(html)
        #plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
        #tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])#去掉view_price欄位,只要價格部分,eval將獲取到的最外層/內層的單引號或雙引號去掉
            title = eval(tlt[i].split(':')[1])#去掉raw_title欄位,只要名稱部分
            ilt.append([price,title])
    except:
        print("網頁解析失敗")

def printGoodsList(ilt):#將商品的資訊輸出到螢幕上
    try:
        tplt = "{:4}\t{:8}\t{:16}" #定義列印模板
        print(tplt.format("序號","價格","商品名稱"))
        count = 0
        for s in ilt:
            count = count + 1
            print(tplt.format(count,s[0],s[1]))
    except:
        print("輸出失敗")

def main():
    goods = input("請輸入想要搜尋的商品:") #定義搜尋關鍵詞變數
    depth = input("請輸入想要搜尋商品的深度(整數):") #定義爬取的深度即頁數
    depth = int(depth)
    start_url = 'https://s.taobao.com/search?q='+goods
    infoList = [] #定義整個的輸出結果變數
    for i in range(depth):#對每次翻頁後的URL連結進行設計
        try:
            url = start_url + '&s='+str(44*i)
            html = getHTMLText(url)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

#呼叫主函式
main()

  本篇完,如有錯誤歡迎指出~

PS:如遇到解決不了問題的小夥伴可以加點選下方連結自行獲取

python免費學習資料以及群交流解答點選即可加入

 

相關文章