亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

2bdenny / 2488人閱讀

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

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

JSON 是什么

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

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

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

在哪

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

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

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

json 模塊

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

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

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

json.loads(s,encoding=): 將一個(gè)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=)

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

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

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

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

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

??先進(jì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ù)按下看看有什么變化,當(dāng)再次按下搜索鍵

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

"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)

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

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

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

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

#使用格式化輸出,傳四個(gè)字符串變量進(jìn)去
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)進(jìn)行多頁爬取了,代碼最后貼上,下面在看看json數(shù)據(jù)怎樣提取。

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

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

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

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

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

最終代碼

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

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

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"])#價(jià)格
            locations.append(auction["item_loc"])#貨源
            sales.append(auction["view_sales"])#賣出數(shù)量
            seller_ids.append(auction["user_id"]) #商家id
            store_names.append(auction["nick"])#店鋪名

        #正則實(shí)現(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 改排序方式,默認(rèn)綜合")=="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://www.ezyhdfw.cn/yun/41664.html

相關(guān)文章

  • Python 從零開始爬蟲(六)——?jiǎng)討B(tài)爬取解決方案 之 手動(dòng)分析

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

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

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

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

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

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

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

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

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

    Half 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<