利用Python爬取淘寶商品信息

本文所實(shí)現(xiàn)的爬取淘寶商品信息將實(shí)現(xiàn)以下功能:
對(duì)于某個(gè)類別的淘寶商品的頁(yè)面

image.png

爬取這個(gè)商品名稱,比如“手機(jī)”搜索結(jié)果下的每個(gè)商品的信息,存儲(chǔ)到數(shù)據(jù)結(jié)構(gòu)中,并能將其輸出顯示。

如下的輸出形式:

image.png

接下來(lái),就看我們?nèi)绾我徊讲綄?shí)現(xiàn)這個(gè)小爬蟲(chóng)的吧

分析

  • 目標(biāo):獲取淘寶搜索頁(yè)面的信息,提取其中的商品名稱和價(jià)格
  • 理解:
    淘寶的搜索接口
    翻頁(yè)的處理

首先分析搜索接口,
很容易我們就可以發(fā)現(xiàn),

image.png

https://s.taobao.com/search?q=后面接我們的搜索詞就可以

我們?cè)傺芯糠?yè)處理:
第二頁(yè)

image.png

第三頁(yè)

image.png

我們可以發(fā)現(xiàn),s參數(shù)指定了搜索頁(yè)的跳轉(zhuǎn),每48條記錄一次頁(yè)面跳轉(zhuǎn)。

有同學(xué)可能發(fā)現(xiàn)還會(huì)有其他很多的參數(shù),這個(gè)我們先忽略,我們直接構(gòu)造一個(gè)url,只包括搜索詞和搜索頁(yè),看看能不能訪問(wèn)到正確頁(yè)面:
比如
https://s.taobao.com/search?q=手機(jī)&s=48

我們將上述地址放到地址欄

image.png

發(fā)現(xiàn)可以正確訪問(wèn),所以我們現(xiàn)在就已經(jīng)知道了如何確定訪問(wèn)接口

設(shè)計(jì)程序結(jié)構(gòu)

主要有三步

  • 步驟1:提交商品搜索請(qǐng)求,循環(huán)獲取頁(yè)面
  • 步驟2:對(duì)于每個(gè)頁(yè)面,提取商品名稱和價(jià)格信息
  • 步驟3:將信息輸出到屏幕上

首先我們對(duì)于上面研究出的搜索接口給出基本的代碼:

#CrowTaobaoPrice.py
import requests
import re

def getHTMLText(url):

    
def parsePage(ilt, html):


def printGoodsList(ilt):

        
def main():
    goods = '手機(jī)'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(48*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)
    
main()

對(duì)于獲取頁(yè)面源碼的函數(shù),我們已經(jīng)寫過(guò)很多次了,就是利用requets庫(kù)抓取頁(yè)面

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""

核心代碼

這個(gè)爬蟲(chóng)最核心的地方就在于對(duì)商品信息的獲取,我們首先分析頁(yè)面的源代碼,我們搜索第一個(gè)商品的名字

image.png

基本上所有商品的信息,名稱,價(jià)格,月銷量都在這段數(shù)據(jù)結(jié)構(gòu)里顯示,是嵌入在js代碼里的,所以我們就無(wú)法用bs4庫(kù)來(lái)提取。
但我們可以直接用re庫(kù),正則表達(dá)式提取。
因?yàn)槲覀兛梢园l(fā)現(xiàn),所有的商品名稱都是
“title”:" "的格式,我們可以搜索確認(rèn)一下:

image.png

我們搜索發(fā)現(xiàn),正好是48條記錄,也就是48個(gè)商品的信息,所以直接匹配就可以把所所有商品名稱信息提取出來(lái),是不是很簡(jiǎn)單。
對(duì)于商品價(jià)格 和月銷量也是這么獲取的

def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
        tlt = re.findall(r'\"title\"\:\".*?\"',html)
        mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            monthsales = eval(mslt[i].split(':')[1])
            ilt.append([price , title, monthsales])
    except:
        print("")

完整代碼

#CrowTaobaoPrice.py
import requests
import re

def getHTMLText(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""
    
def parsePage(ilt, html):
    try:
        plt = re.findall(r'\"price\"\:\"[\d\.]*\"',html)
        tlt = re.findall(r'\"title\"\:\".*?\"',html)
        mslt = re.findall(r'\"month_sales\"\:\"[\d\.]*\"',html)
        for i in range(len(plt)):
            price = eval(plt[i].split(':')[1])
            title = eval(tlt[i].split(':')[1])
            monthsales = eval(mslt[i].split(':')[1])
            ilt.append([price , title, monthsales])
    except:
        print("")

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}\t{:16}"
    print(tplt.format("序號(hào)", "價(jià)格", "商品名稱","月銷量"))
    count = 0
    for g in ilt:
        count = count + 1
        print(tplt.format(count, g[0], g[1],g[2]))
        
def main():
    goods = '手機(jī)'
    depth = 3
    start_url = 'https://s.taobao.com/search?q=' + goods
    infoList = []
    for i in range(depth):
        try:
            url = start_url + '&s=' + str(48*i)
            html = getHTMLText(url)
            parsePage(infoList, html)
        except:
            continue
    printGoodsList(infoList)
    
main()

結(jié)果:

image.png

小伙伴也可以更改這個(gè)程序去搜索各種不同的商品的信息啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,781評(píng)論 25 709
  • 以前從未感受過(guò)別人的眼光對(duì)自身而言是一種深切的感受,我雖明白別人的眼光同時(shí)也取決于自身,可還是稍許也有不適。 每一...
    穩(wěn)兒閱讀 667評(píng)論 0 3
  • 早上起床,做好早飯,來(lái)不及吃了。裝好早飯午飯準(zhǔn)備去上班。 走到臥室換衣服,旦旦跟著跑進(jìn)來(lái),媽媽你要干什么去? 我說(shuō)...
    王莎莎2017閱讀 555評(píng)論 0 0
  • 我們叫她詩(shī)媽。 第一次見(jiàn)她,是在兩年前。那時(shí)我剛剛進(jìn)入培訓(xùn)部,華南三地分公司齊聚深圳,召開(kāi)季度會(huì)。她是主持,一襲黑...
    隔壁村的教主閱讀 622評(píng)論 0 1

友情鏈接更多精彩內(nèi)容