摘要:能看到這里說明快進入動態網頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的及其數據提取是什么是輕量級的文本數據交換格式,符合的格式的字符串叫字符串,其格式就像中字符串化后的字典,有時字典中還雜著列表字典,但是里面的數據都被雙引號包著
??能看到這里說明快進入動態網頁爬取了,在這之前還有一兩個知識點要了解,就如本文要講的json及其數據提取
JSON 是什么??json是輕量級的文本數據交換格式,符合json的格式的字符串叫json字符串,其格式就像python中字符串化后的字典,有時字典中還雜著列表字典,但是里面的數據都被雙引號包著,下面是一個例子
"{"Africa": [ { "name":"蜜獾" , "nickname":"平頭哥" }, { "name":"蟲子" , "nickname":"小辣條" }, { "name":"毒蛇" , "nickname":"大面筋" } ] }"#這是理想化的數據,實際上看到的json是不分行堆在一起,而且更多時候用unicode編碼取代中文
??而且為了能更好的傳輸各種語言,json對非英語的字符串進行了Unicode編碼,于是我們直接看到的json數據通常都是帶著uxxxx的字符串而不會帶著中文,json數據還會堆在一起不換行,給我們的分析帶來了困難,不過我們有json 模塊讓它轉回中文,更有一個牛逼工具把它轉回中文同時排版,分析json數據時多用這個工具。
在哪??有時F12源碼中能看到完整的信息,request回來后就殘缺到沒有價值,這就說明網頁使用了動態或者ajax技術,而這些技術所加載的信息,就有json的身影。為了順利爬取目標,我們需要找到json數據。
json數據有時會直接出在對原鏈接request的結果中,作為信息等待被加載到網頁中
有時會存在于獨立的鏈接里,需要捉包獲取鏈接再打開獲得(而且這種鏈接的構造很重要)
json 模塊??JSON是JavaScript原生格式,親生無誤,所以在JavaScript中處理JSON數據不需要任何特殊的API或工具包。像python這樣連的遠親,當然不能直接一把捉走別人的孩子,至少要帶根棒棒糖來引誘一下呀,而這根棒棒糖就是json模塊,python自帶。
??json 模塊提供了一種很簡單的方式來編碼和解碼JSON數據,實現了JSON數據(字符串)和python對象(字典)的相互轉換。
主要兩個方法及常用參數:
json.dumps(obj,ensure_ascii=True): 將一個字典(obj)轉換為JSON編碼的字符串,ensure_ascii默認為True,全部是ascii字符,中文會以unicode編碼形式顯示如u597d;設置為False時保持中文
json.loads(s,encoding=): 將一個JSON編碼的字符串(s)轉換回字典,如果傳入的json字符串的編碼不是UTF-8的話,需要用encoding指定字符編碼
如果你要處理的是文件而不是字符串/字典,你可以使用 json.dump() 和 json.load() 來編碼和解碼JSON數據。
# 編碼成json數據寫入,data是字典 with open("data.json", "w") as f: json.dump(data, f) # 讀取json數據并解碼,data是字典 with open("data.json", "r") as f: data = json.load(f)
另:requests對象的json()方法也可以把json數據轉為字典,dict = r.json(encoding=)
實戰:簡單爬取淘寶商品信息??爬蟲領域內json的知識知道這些就行,那么馬上來個實戰了解一下怎樣提取json中的數據,加深對json的認識吧,正好可以拿某寶來試手,商品的json數據直接出在對原鏈接request的結果中,不用捉包。(然而大多數json數據不會這樣出現,這里選擇某寶方便展示)
構造鏈接(重要)重要,但這也是要培養的能力,在這里只詳細講一次思路,以后靠自己分析
??構造鏈接的原則是盡可能多的相關參數,盡可能少的無關參數,網址中?之后用&連起來的賦值關系就是那些參數,這些參數會傳到服務器中,服務器根據它們來返回數據。爬蟲中,頁數,排序,日期等這類的參數是關鍵。我們要動態的修改這些參數來構造鏈接,觀察能力很重要。還有構造鏈接時要多requests下來測試哪些是相關參數,哪些參數是無關緊要的,不是只看瀏覽器就行的
??先進入官網搜索一件商品,這里以GTX1060為例,第一次出現的鏈接如下,
"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"
??很長是吧,能大約的看到日期,商品名之類的參數,但是大部分參數都看不懂,我們假設部分參數是不影響爬取結果的,于是我們來繼續按下看看有什么變化,當再次按下搜索鍵
??鏈接變短了,在按多幾下都是這個鏈接了
"https://s.taobao.com/search?q=GTX1060&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180428&ie=utf8"#初步結構
??為了確保泛用性,我們換個商品再搜索,發現鏈接除q參數(商品名)改變外,其他一模一樣,由此我們初步確定了鏈接結構,q參數是商品名,initiative_id是當天日期,其他不用變
??但我們的還要有翻頁和排序的功能沒實現,鏈接里也看不到和它們有關的參數,因此我們要繼續按來引相關參數出來,點擊排序那排按鈕
??發現又多了一個sort參數,不同的排序方式對應不同的值,有default(默認綜合排序),sale-desc(按銷量),renqi-desc(按人氣)等
??按下一頁,又多了bcoffset,p4ppushleft,s三個參數,經測試只有s參數有用,其他兩個都不影響爬取結果(直接去掉),s是頁數相關參數,值是44的倍數(因為每頁加載44件商品),第一頁0,第二頁44,第三頁88……
??到此就捕捉到q,initiative_id,sort,s等參數了,如果想增加其它相關參數,就自己到處按搗鼓吧,下面就這4個參數進行構造,可以format格式化,也可以將參數通過requests.get()的params參數傳入,下面選擇格式化
#使用格式化輸出,傳四個字符串變量進去 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=)
剩下的就是整合到循環進行多頁爬取了,代碼最后貼上,下面在看看json數據怎樣提取。
json數據分析&提取先拿一個鏈接requests下來保存到txt看看先,打開后看到一大堆又字典又列表的東西,仔細一看這貨是符合json格式的字符串,里面有我們要的信息。二話不說馬上扔到那個工具里排版一下,排完后如圖
我們知道json數據本質是字符串,也可以用json.load()轉化為字典,這樣的話就有兩種提取信息的方法
直接用正則對字符串匹配,缺點是當json存在uxxxx的unicode編碼時你會得到uxxxx而不是中文,然而還是有辦法繞過編碼問題——可以通過str(json.load())得到字典(已解碼回中文)后再強轉為字符串再匹配,但是要注意單引號問題
轉為字典后逐層索引下去,缺點是當結構過于復雜時,索引也比較麻煩。
最終代碼github獲取源碼(陸續還有其他大大小小的爬蟲項目,隨閱)
不要看完就算了,記得多實踐,擼起袖子就是干
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)#捕捉json字符串 data = json.loads(data.group(1),encoding="utf-8")#json轉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"])#賣出數量 seller_ids.append(auction["user_id"]) #商家id store_names.append(auction["nick"])#店鋪名 #正則實現 """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_)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41664.html
摘要:之前提到動態加載就兩個解決方案手動分析和。背后有許多不為人知的交易進行著,動態爬取的任務就是攔截它們揭開它們的真面目。在爬蟲界有著霸王硬上弓的稱號,管它情不情愿,來了動態加載也只有屈服的份了。 之前提到動態加載就兩個解決方案——手動分析和selenium。接下來的文章我們會來深入探討它們,本文將首先,重點介紹前者——手動分析 手動分析是一個比較有難度,比較麻煩的解決方案,但優點也很明顯...
摘要:定制篩選器,對內容進行篩選重點。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網頁源碼的功能,供使用者分析網頁。超時設置,如果服務器在指定秒數內沒有應答,拋出異常,用于避免無響應連接,整形或浮點數。返回連接狀態,正常。 前言 python 3.6 !! 本爬蟲系列是面對有Python語法基礎的讀者寫的,如果你沒學過python,emmmm.....也沒關系,你或許能從每篇文章中學到一些...
從行業角度來說,通過一步一步剖析,目標就是簡易,新手入門requests網絡爬蟲及新手入門pandas數據剖析就能完成,文中關鍵為大家介紹Python網絡爬蟲抓取金融衍生品數據庫的經典案例,感興趣的小伙伴一起了解一下吧 哈嘍大家好政胤今日教給大家抓取金融衍生品數據和信息 每日任務介紹 最先,顧客原消費是獲得https://hq.smm.cn/copper網站里的價錢數據和信息(注:獲得的...
摘要:且本小白也親身經歷了整個從小白到爬蟲初入門的過程,因此就斗膽在上開一個欄目,以我的圖片爬蟲全實現過程為例,以期用更簡單清晰詳盡的方式來幫助更多小白應對更大多數的爬蟲實際問題。 前言: 一個月前,博主在學過python(一年前)、會一點網絡(能按F12)的情況下,憑著熱血和興趣,開始了pyth...
閱讀 2411·2021-11-25 09:43
閱讀 1246·2021-11-24 09:39
閱讀 742·2021-11-23 09:51
閱讀 2383·2021-09-07 10:18
閱讀 1842·2021-09-01 11:39
閱讀 2777·2019-08-30 15:52
閱讀 2590·2019-08-30 14:21
閱讀 2850·2019-08-29 16:57