成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python 從零開始爬蟲(五)——初遇json&爬取某寶商品信息

2bdenny / 2445人閱讀

摘要:能看到這里說明快進入動態(tài)網(wǎng)頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的及其數(shù)據(jù)提取是什么是輕量級的文本數(shù)據(jù)交換格式,符合的格式的字符串叫字符串,其格式就像中字符串化后的字典,有時字典中還雜著列表字典,但是里面的數(shù)據(jù)都被雙引號包著

??能看到這里說明快進入動態(tài)網(wǎng)頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的json及其數(shù)據(jù)提取

JSON 是什么

??json是輕量級的文本數(shù)據(jù)交換格式,符合json的格式的字符串叫json字符串,其格式就像python中字符串化后的字典,有時字典中還雜著列表字典,但是里面的數(shù)據(jù)都被雙引號包著,下面是一個例子

"{"Africa": [
{ "name":"蜜獾" , "nickname":"平頭哥" }, 
{ "name":"蟲子" , "nickname":"小辣條" }, 
{ "name":"毒蛇" , "nickname":"大面筋" }
            ]
 }"#這是理想化的數(shù)據(jù),實際上看到的json是不分行堆在一起,而且更多時候用unicode編碼取代中文

??而且為了能更好的傳輸各種語言,json對非英語的字符串進行了Unicode編碼,于是我們直接看到的json數(shù)據(jù)通常都是帶著uxxxx的字符串而不會帶著中文,json數(shù)據(jù)還會堆在一起不換行,給我們的分析帶來了困難,不過我們有json 模塊讓它轉(zhuǎn)回中文,更有一個牛逼工具把它轉(zhuǎn)回中文同時排版,分析json數(shù)據(jù)時多用這個工具。

在哪

??有時F12源碼中能看到完整的信息,request回來后就殘缺到?jīng)]有價值,這就說明網(wǎng)頁使用了動態(tài)或者ajax技術(shù),而這些技術(shù)所加載的信息,就有json的身影。為了順利爬取目標,我們需要找到j(luò)son數(shù)據(jù)。

json數(shù)據(jù)有時會直接出在對原鏈接request的結(jié)果中,作為信息等待被加載到網(wǎng)頁中

有時會存在于獨立的鏈接里,需要捉包獲取鏈接再打開獲得(而且這種鏈接的構(gòu)造很重要)

json 模塊

??JSON是JavaScript原生格式,親生無誤,所以在JavaScript中處理JSON數(shù)據(jù)不需要任何特殊的API或工具包。像python這樣連的遠親,當然不能直接一把捉走別人的孩子,至少要帶根棒棒糖來引誘一下呀,而這根棒棒糖就是json模塊,python自帶。

??json 模塊提供了一種很簡單的方式來編碼和解碼JSON數(shù)據(jù),實現(xiàn)了JSON數(shù)據(jù)(字符串)和python對象(字典)的相互轉(zhuǎn)換。
主要兩個方法及常用參數(shù):

json.dumps(obj,ensure_ascii=True): 將一個字典(obj)轉(zhuǎn)換為JSON編碼的字符串,ensure_ascii默認為True,全部是ascii字符,中文會以unicode編碼形式顯示如u597d;設(shè)置為False時保持中文

json.loads(s,encoding=): 將一個JSON編碼的字符串(s)轉(zhuǎn)換回字典,如果傳入的json字符串的編碼不是UTF-8的話,需要用encoding指定字符編碼

如果你要處理的是文件而不是字符串/字典,你可以使用 json.dump() 和 json.load() 來編碼和解碼JSON數(shù)據(jù)。

# 編碼成json數(shù)據(jù)寫入,data是字典
with open("data.json", "w") as f:
    json.dump(data, f)

# 讀取json數(shù)據(jù)并解碼,data是字典
with open("data.json", "r") as f:
    data = json.load(f)

另:requests對象的json()方法也可以把json數(shù)據(jù)轉(zhuǎn)為字典,dict = r.json(encoding=)

實戰(zhàn):簡單爬取淘寶商品信息

??爬蟲領(lǐng)域內(nèi)json的知識知道這些就行,那么馬上來個實戰(zhàn)了解一下怎樣提取json中的數(shù)據(jù),加深對json的認識吧,正好可以拿某寶來試手,商品的json數(shù)據(jù)直接出在對原鏈接request的結(jié)果中,不用捉包。(然而大多數(shù)json數(shù)據(jù)不會這樣出現(xiàn),這里選擇某寶方便展示)

構(gòu)造鏈接(重要)

重要,但這也是要培養(yǎng)的能力,在這里只詳細講一次思路,以后靠自己分析

??構(gòu)造鏈接的原則是盡可能多的相關(guān)參數(shù),盡可能少的無關(guān)參數(shù),網(wǎng)址中?之后用&連起來的賦值關(guān)系就是那些參數(shù),這些參數(shù)會傳到服務(wù)器中,服務(wù)器根據(jù)它們來返回數(shù)據(jù)。爬蟲中,頁數(shù),排序,日期等這類的參數(shù)是關(guān)鍵。我們要動態(tài)的修改這些參數(shù)來構(gòu)造鏈接,觀察能力很重要。還有構(gòu)造鏈接時要多requests下來測試哪些是相關(guān)參數(shù),哪些參數(shù)是無關(guān)緊要的,不是只看瀏覽器就行的

??先進入官網(wǎng)搜索一件商品,這里以GTX1060為例,第一次出現(xiàn)的鏈接如下,

"https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=GTX1060&suggest=history_1&_input_charset=utf-8&wq=GTX&suggest_query=GTX&source=suggest"

??很長是吧,能大約的看到日期,商品名之類的參數(shù),但是大部分參數(shù)都看不懂,我們假設(shè)部分參數(shù)是不影響爬取結(jié)果的,于是我們來繼續(xù)按下看看有什么變化,當再次按下搜索鍵

??鏈接變短了,在按多幾下都是這個鏈接了

"https://s.taobao.com/search?q=GTX1060&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180428&ie=utf8"#初步結(jié)構(gòu)

??為了確保泛用性,我們換個商品再搜索,發(fā)現(xiàn)鏈接除q參數(shù)(商品名)改變外,其他一模一樣,由此我們初步確定了鏈接結(jié)構(gòu),q參數(shù)是商品名,initiative_id是當天日期,其他不用變
??但我們的還要有翻頁和排序的功能沒實現(xiàn),鏈接里也看不到和它們有關(guān)的參數(shù),因此我們要繼續(xù)按來引相關(guān)參數(shù)出來,點擊排序那排按鈕

??發(fā)現(xiàn)又多了一個sort參數(shù),不同的排序方式對應(yīng)不同的值,有default(默認綜合排序),sale-desc(按銷量),renqi-desc(按人氣)等

??按下一頁,又多了bcoffset,p4ppushleft,s三個參數(shù),經(jīng)測試只有s參數(shù)有用,其他兩個都不影響爬取結(jié)果(直接去掉),s是頁數(shù)相關(guān)參數(shù),值是44的倍數(shù)(因為每頁加載44件商品),第一頁0,第二頁44,第三頁88……

??到此就捕捉到q,initiative_id,sort,s等參數(shù)了,如果想增加其它相關(guān)參數(shù),就自己到處按搗鼓吧,下面就這4個參數(shù)進行構(gòu)造,可以format格式化,也可以將參數(shù)通過requests.get()的params參數(shù)傳入,下面選擇格式化

#使用格式化輸出,傳四個字符串變量進去
url = "https://s.taobao.com/search?q={name}&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id={date}&ie=utf8&s={num}&sort={sort}".format(name=,date=,num=,sort=)

剩下的就是整合到循環(huán)進行多頁爬取了,代碼最后貼上,下面在看看json數(shù)據(jù)怎樣提取。

json數(shù)據(jù)分析&提取

先拿一個鏈接requests下來保存到txt看看先,打開后看到一大堆又字典又列表的東西,仔細一看這貨是符合json格式的字符串,里面有我們要的信息。二話不說馬上扔到那個工具里排版一下,排完后如圖

我們知道json數(shù)據(jù)本質(zhì)是字符串,也可以用json.load()轉(zhuǎn)化為字典,這樣的話就有兩種提取信息的方法

直接用正則對字符串匹配,缺點是當json存在uxxxx的unicode編碼時你會得到uxxxx而不是中文,然而還是有辦法繞過編碼問題——可以通過str(json.load())得到字典(已解碼回中文)后再強轉(zhuǎn)為字符串再匹配,但是要注意單引號問題

轉(zhuǎn)為字典后逐層索引下去,缺點是當結(jié)構(gòu)過于復(fù)雜時,索引也比較麻煩。

最終代碼

github獲取源碼(陸續(xù)還有其他大大小小的爬蟲項目,隨閱)

不要看完就算了,記得多實踐,擼起袖子就是干

from datetime import date
import re
import json
import requests
def taobao(keyword,pages,select_type,date_):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    url = "https://s.taobao.com/search?q={}&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id={}&ie=utf8&sort={}".format(keyword, date_, selections[select_type])
    titles=[];item_ids=[];prices=[];locations=[];sales=[];seller_ids=[];store_names=[]
    for i in range(pages):
        r = requests.get(url+"&s={}".format(str(i*44)),headers=headers,)


        data = re.search(r"g_page_config = (.+);",r.text)#捕捉j(luò)son字符串
        data = json.loads(data.group(1),encoding="utf-8")#json轉(zhuǎn)dict
        for auction in data["mods"]["itemlist"]["data"]["auctions"]:
            titles.append(auction["raw_title"])#商品名
            item_ids.append(auction["nid"])#商品id
            prices.append(auction["view_price"])#價格
            locations.append(auction["item_loc"])#貨源
            sales.append(auction["view_sales"])#賣出數(shù)量
            seller_ids.append(auction["user_id"]) #商家id
            store_names.append(auction["nick"])#店鋪名

        #正則實現(xiàn)
        """titles.extend(re.findall(r""raw_title":"(.+?)"",r.text,re.I)) 
        item_ids.extend( re.findall(r""nid":"(.+?)"",r.text,re.I))
        prices.extend(re.findall(r""view_price":"([^"]+)"",r.text,re.I)) 
        locations.extend(re.findall(r""item_loc":"([^"]+)"",r.text,re.I))
        sales.extend(re.findall(r""view_sales":"([^"]+)"",r.text,re.I)) 
        seller_ids.extend(re.findall(r""user_id":"([^"]+)"",r.text,re.I)) 
        store_names.extend(re.findall(r""nick":"([^"]+)"",r.text,re.I)) """
    #單純打印出來看
    print (len(titles),len(item_ids),len(prices),len(locations),len(sales),len(seller_ids),len(store_names))
    print(titles)
    print(item_ids)
    print(prices)
    print(locations)
    print(sales)
    print(seller_ids)
    print(store_names)


selections = {"0":"default",
              "1":"renqi-desc",
              "2":"sale-desc"}
keyword = input("輸入商品名
")
pages = int(input("爬多少頁
"))
date_ =  "staobaoz_" + str(date.today()).replace("-","")
if input("yes/no  for 改排序方式,默認綜合")=="yes":
    select_type = input("輸入1按人氣,輸入2按銷量")
else:
    select_type = "0"
taobao(keyword,pages,select_type,date_)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41664.html

相關(guān)文章

  • Python 從零開始爬蟲(六)——動態(tài)爬取解決方案 之 手動分析

    摘要:之前提到動態(tài)加載就兩個解決方案手動分析和。背后有許多不為人知的交易進行著,動態(tài)爬取的任務(wù)就是攔截它們揭開它們的真面目。在爬蟲界有著霸王硬上弓的稱號,管它情不情愿,來了動態(tài)加載也只有屈服的份了。 之前提到動態(tài)加載就兩個解決方案——手動分析和selenium。接下來的文章我們會來深入探討它們,本文將首先,重點介紹前者——手動分析 手動分析是一個比較有難度,比較麻煩的解決方案,但優(yōu)點也很明顯...

    rozbo 評論0 收藏0
  • 從零開始爬蟲

    摘要:幾個朋友對爬蟲很感興趣,他們也都是開發(fā)人員,一個開發(fā)兩個開發(fā),都沒有過項目開發(fā)經(jīng)驗,正好其中一個最近要爬一個網(wǎng)店的產(chǎn)品信息,所以希望我能拿這網(wǎng)站當寫一個爬蟲來給他們參考學(xué)習(xí)。我們就在這個文件里開發(fā)爬蟲的相關(guān)邏輯。 幾個朋友對爬蟲很感興趣,他們也都是開發(fā)人員,一個PHP開發(fā)兩個JAVA開發(fā),都沒有過python項目開發(fā)經(jīng)驗,正好其中一個最近要爬一個網(wǎng)店的產(chǎn)品信息,所以希望我能拿這網(wǎng)站當d...

    wwq0327 評論0 收藏0
  • Python 從零開始爬蟲(零)——爬蟲思路&requests模塊使用

    摘要:定制篩選器,對內(nèi)容進行篩選重點。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網(wǎng)頁源碼的功能,供使用者分析網(wǎng)頁。超時設(shè)置,如果服務(wù)器在指定秒數(shù)內(nèi)沒有應(yīng)答,拋出異常,用于避免無響應(yīng)連接,整形或浮點數(shù)。返回連接狀態(tài),正常。 前言 python 3.6 !! 本爬蟲系列是面對有Python語法基礎(chǔ)的讀者寫的,如果你沒學(xué)過python,emmmm.....也沒關(guān)系,你或許能從每篇文章中學(xué)到一些...

    YanceyOfficial 評論0 收藏0
  • 運用Python網(wǎng)絡(luò)爬蟲抓取金融衍生品數(shù)據(jù)庫的經(jīng)典案例

      從行業(yè)角度來說,通過一步一步剖析,目標就是簡易,新手入門requests網(wǎng)絡(luò)爬蟲及新手入門pandas數(shù)據(jù)剖析就能完成,文中關(guān)鍵為大家介紹Python網(wǎng)絡(luò)爬蟲抓取金融衍生品數(shù)據(jù)庫的經(jīng)典案例,感興趣的小伙伴一起了解一下吧  哈嘍大家好政胤今日教給大家抓取金融衍生品數(shù)據(jù)和信息  每日任務(wù)介紹  最先,顧客原消費是獲得https://hq.smm.cn/copper網(wǎng)站里的價錢數(shù)據(jù)和信息(注:獲得的...

    89542767 評論0 收藏0
  • 【小白+python+selenium庫+圖片爬取+反爬+資料】超詳細新手實現(xiàn)(01)webdriv

    摘要:且本小白也親身經(jīng)歷了整個從小白到爬蟲初入門的過程,因此就斗膽在上開一個欄目,以我的圖片爬蟲全實現(xiàn)過程為例,以期用更簡單清晰詳盡的方式來幫助更多小白應(yīng)對更大多數(shù)的爬蟲實際問題。 前言: 一個月前,博主在學(xué)過python(一年前)、會一點網(wǎng)絡(luò)(能按F12)的情況下,憑著熱血和興趣,開始了pyth...

    Half 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<