Python獲取淘寶商品相關信息

更多教程請移步至:洛涼博客

求助請移步至:Python自學技術交流

我感覺自己有個缺點挺不好的。不愛做筆記和總結。
自從工作之后發現不會做總結是多么沒有優勢。
例如:寫個項目總結、工作總結、年中,年終總結。
不百度或者谷歌下發現很難寫出點像樣的總結報告。


我希望自己能好好改掉這個缺點。以后對自己的所做所學加以記錄,方便以后查閱或溫習。

昨天一直在看中國大學MOOC大學,北京理工大學,嵩教授主講的:Python網絡爬蟲與信息提取。
(這里多說一句【并非打廣告】,嵩教授講的確實不錯,思路和代碼書寫都很謹慎,每次都會強調代碼的穩定性,有爬蟲意向的朋友可以看看)


昨晚看的主要內容為定向獲取某類商品的價格,標題。
看完后自己按照思路敲了一遍。額外多獲取了一個商品屬性。
這個淘寶搜索后的商品信息好像是以JSON的形式存儲在源碼里面。
PS:目前為止我好想還沒搞明白JSON和AJAX有沒有聯系。(以后對這方面知識進行補充)


敲完代碼運行后好像不成功。
自己找了下原因,我查找的商品類型和嵩教授示例代碼里的商品類型不一致。
由于是通過正則進行匹配的數據。(如需獲取還需改下正則表達式)
導致數據存儲對應的鍵不一致。下面大家可以看下區別。

電腦價格.png

書包價格.png

其實如果用嵩教授的商品進行獲取,可以獲取到更多的商品信息。
例如商品的ID,其實獲取到了ID就可以進行商品鏈接拼接。
這張截圖是通過URL鏈接里的ID在頁面源碼找的到。
然后可以拼接成:天貓店鋪:https://detail.tmall.com/item.htm?id=42252465037,淘寶店鋪:https://item.taobao.com/item.htm?id=537105758663的方式進行獲取商品鏈接。
有興趣的可以嘗試下獲取更多商品信息。
image.png

好了,其實爬蟲需要的是思路,思路清晰,代碼就好寫了。
我寫的可以查找數碼這一類商品,例如,某品牌電腦,鍵盤,鼠標,手機
如果失敗大家可以看下源碼里面價格和商品名稱對應的數據,相應修改后就能正常。
下面直接貼我看完后以老師的思路進行編寫的代碼。

import requests
import re


def geturl(page,key):
    '''獲取搜索商品后的頁面源碼'''

    data = {
        'q':key,
        's':page*44
    }
    url = 'https://s.taobao.com/search?'
    try:
        html = requests.get(url,params=data)
        html.raise_for_status()
    except:
        print('-----初始鏈接獲取失敗-----')

    return html.text


def gethtml(html):
    '''匹配源碼里需要的數據'''

    try:
        goods = []
        #商品標題,價格,付款人數正則表達式
        pat1 = r'\"price\":\"\d{1,5}\"'
        pat2 = r'\"title\":\".*?\"'
        pat3 = r'\"month_sales\":\"\d{1,9}\"'
    
        prices = re.findall(pat1,html)
        titles = re.findall(pat2,html)
        sales = re.findall(pat3,html)

        for i in range(len(titles)):
            #eval去掉字符串兩邊雙引號,以分好切片獲取后面要的信息
            price = eval(prices[i].split(':')[1])
            title = eval(titles[i].split(':')[1])
            sale = eval(sales[i].split(':')[1])
            #將每個商品的價格,標題,付款人數以表格形式存入到一個空列表
            goods.append([title,sale,price])
    except:
        print('-----信息獲取失敗-----')

    return goods


def printinfo(slist):
    '''打印獲取到的商品信息'''
    #format打印格式
    law = '{:^4}\t{:^8}\t{:^8}\t{:^16}'
    print(law.format('序號','商品價格','已付款人數','商品名稱'))
    num = 0 #初始化序號
    for x in slist:
        num+=1
        print(law.format(num,x[2],x[1],x[0]))


def main():
    '''程序運行入口'''
    pages = int(input('請輸入要查詢的頁數:'))
    good_name = input('請輸入需要查找的商品類型:')
    for page in range(pages):
        try:
            html = geturl(page,good_name)
            slist = gethtml(html)
            printinfo(slist)
        except:
            print('-----程序運行出錯-----')


if __name__ == '__main__':
    main()

運行后打印效果.png

下面我也把嵩老師代碼貼一下,大家不要直接復制運行。會報錯。
要試的自己按照代碼敲一遍。

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'\"view_price\"\:\"[\d\.]*\"',html)        
        tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)         
        for i in range(len(plt)):             
            price = eval(plt[i].split(':')[1])             
            title = eval(tlt[i].split(':')[1])             
            ilt.append([price , title])     
        except:         print("") 

def printGoodsList(ilt):     
    tplt = "{:4}\t{:8}\t{:16}"     
    print(tplt.format("序號", "價格", "商品名稱"))     
    count = 0     
    for g in ilt:         
        count = count + 1         
        print(tplt.format(count, g[0], g[1]))          

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

main()
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379