版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
項目五
爬取動態(tài)網(wǎng)頁通過對本章的學(xué)習(xí),了解動態(tài)網(wǎng)頁應(yīng)用場景,理解動態(tài)網(wǎng)頁特征,理解動態(tài)網(wǎng)頁工作原理,理解AJAX和API,熟悉IE開發(fā)者工具,掌握J(rèn)SON庫的應(yīng)用,掌握異步GET與POST請求。了解動態(tài)網(wǎng)頁應(yīng)用場景。理解動態(tài)網(wǎng)頁特征。理解動態(tài)網(wǎng)頁工作原理。理解AJAX和API。熟悉IE開發(fā)者工具。掌握J(rèn)SON庫的應(yīng)用。掌握異步GET與POST請求。在實際過程中,常常會遇到需要爬取動態(tài)網(wǎng)頁數(shù)據(jù)的情況。我們知道每單擊一個鏈接,瀏覽器就會短暫地“白屏”一下,然后才會進(jìn)入一個新的頁面。不同的頁面,網(wǎng)址也是不一樣的。隨著技術(shù)的不斷進(jìn)步,現(xiàn)在不少網(wǎng)站已經(jīng)引入了異步加載技術(shù),單擊新的鏈接以后,幾乎看不到“白屏”的現(xiàn)象了。而且更神奇的是,單擊了鏈接,網(wǎng)頁中的內(nèi)容已經(jīng)發(fā)生了改變,但是網(wǎng)址沒有變。還有一些內(nèi)容可以部分變化刷新。在本章中,我們學(xué)習(xí)動態(tài)網(wǎng)頁特征、動態(tài)網(wǎng)頁爬取的相關(guān)知識、通過典型的案例,來詳細(xì)介紹爬取動態(tài)網(wǎng)頁數(shù)據(jù)的基本思路和步驟。5.1應(yīng)用場景
現(xiàn)在主流網(wǎng)站基本上都是動態(tài)網(wǎng)頁,這些網(wǎng)頁大多使用JavaScript展現(xiàn)網(wǎng)頁內(nèi)容,與靜態(tài)網(wǎng)頁不同的是,使用JavaScript時,很多內(nèi)容并不會出現(xiàn)在HTML源代碼中。例如,簡書的動態(tài)網(wǎng)頁,網(wǎng)址如下:/,打開頁面如圖5-1所示。5.2動態(tài)網(wǎng)頁特征
首先,簡單看一下動態(tài)網(wǎng)頁的特征:從源代碼的特征看,動態(tài)網(wǎng)頁的數(shù)據(jù)不會出現(xiàn)在網(wǎng)頁源代碼中,而是被“藏”起來了。在瀏覽器地址欄輸入以下網(wǎng)址,可以看到百度翻譯,頁面如圖5-2所示。/translate?aldtype=16047&query=&keyfrom=baidu&smartresult=dict&lang=auto2zh#auto/zh/動態(tài)網(wǎng)頁的特征:從網(wǎng)址特征看,請求新數(shù)據(jù)時(如下拉或翻頁),當(dāng)前網(wǎng)頁數(shù)據(jù)內(nèi)容已更新變化,而網(wǎng)址不會變化。在瀏覽器地址欄輸入地址“/gallery/”,可以看到豆瓣話題廣場,頁面如圖5-5所示。拖動右側(cè)的下拉滾動條,話題精選動態(tài)內(nèi)容會不斷增加,地址欄的網(wǎng)址始終沒有改變,一直是/gallery/。動態(tài)網(wǎng)頁的特征:從技術(shù)特征看,常用以下4種動態(tài)網(wǎng)頁技術(shù)。(1)CGI(2)ASP(3)PHP(4)JSP當(dāng)用戶請求的是一個動態(tài)網(wǎng)頁時,服務(wù)器要做更多的工作才能把用戶請求的信息發(fā)送回去,服務(wù)器一般按照以下步驟進(jìn)行工作。步驟1:服務(wù)器端接受請求。步驟2:Web服務(wù)器從服務(wù)器硬盤指定的位置或內(nèi)存中讀取動態(tài)網(wǎng)頁文件。步驟3:執(zhí)行網(wǎng)頁文件的程序代碼,將含有程序代碼的動態(tài)網(wǎng)頁轉(zhuǎn)化為標(biāo)準(zhǔn)的靜態(tài)頁面(如HTML)。步驟4:Web服務(wù)器將生成的靜態(tài)頁面代碼發(fā)送給請求瀏覽器。5.3動態(tài)網(wǎng)頁爬取
動態(tài)網(wǎng)頁就是AsynchronousJavascriptAndXML(簡稱“AJAX”),也就是異步JavaScript和XML。動態(tài)網(wǎng)頁在后臺服務(wù)器進(jìn)行少量數(shù)據(jù)交換就可以使網(wǎng)頁實現(xiàn)異步更新。它是一種使用現(xiàn)有技術(shù)集合的“新”方法,包括HTML
或
XHTML、CSS、JavaScript、
DOM、XML、
XSLT,以及最重要的XMLHttpRequest。使用Ajax技術(shù)網(wǎng)頁應(yīng)用能夠快速地將增量更新呈現(xiàn)在用戶界面上,而不需要重載(刷新)整個頁面,這使得程序能夠更快地回應(yīng)用戶的操作。在具體網(wǎng)頁代碼中,AJAX一般通過XMLHttpRequest對象接口發(fā)送請求,XMLHttpRequest一般被縮寫為“XHR”。用戶點擊網(wǎng)絡(luò)面板上漏斗形的過濾按鈕,可以過濾出XHR請求,再挨個查看每個請求,通過訪問路徑和預(yù)覽,即可找到包含信息的請求。
XMLHttpRequest對象通過responseText、responseBody、responseStream或responseXML屬性獲取響應(yīng)信息,如表5-1所示。響應(yīng)信息描述responseBody將響應(yīng)信息正文以UnsignedByte數(shù)組形式返回responseStream
以ADOStream對象的形式返回響應(yīng)信息responseText將響應(yīng)信息作為字符串返回responseXML將響應(yīng)信息格式化為XML文檔格式返回[例5-1]在百度翻譯中輸入一個單詞,查看翻譯結(jié)果。代碼如下:importrequestsimportjsonif__name__=='__main__':#指定urlurl='/sug'#進(jìn)行UA偽裝header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/70.0.3538.25Safari/537.36Core/1.70.3775.400QQBrowser/10.6.4208.400'}#參數(shù)處理#data相當(dāng)于get請求中的params,表示請求所帶的參數(shù)(也是一個字典類型數(shù)據(jù))#post請求參數(shù)處理(和get請求一致)word=input('請輸入要翻譯的單詞:') #這樣翻譯單詞就變成動態(tài)的了data={'kw':word}#請求發(fā)送response=requests.post(url=url,data=data,headers=header)#獲取相應(yīng)數(shù)據(jù)#json()方法返回的是一個對象#如果確定相應(yīng)數(shù)據(jù)是json類型的,才可以使用json()方法進(jìn)行對象的返回dic_obj=response.json()print(dic_obj)print('數(shù)據(jù)打印結(jié)束!')
輸入單詞people運行結(jié)果如下。請輸入要翻譯的單詞:people{'errno':0,'data':[{'k':'people','v':'n.人民;人,人類;居民;種族vt.居住于,布滿;使住滿人,在…殖民;把動物放養(yǎng)在'},{'k':'People','v':'[人名]皮普爾'},{'k':'peopled','v':'vt.居住于,布滿(people的過去式與過去分詞形式)'},{'k':'peoples','v':'n.人民;人(people的名詞復(fù)數(shù));家人;種族'},{'k':'Peoples','v':'[人名][英格蘭人姓氏]皮普爾斯取自父名,來源于People,含義是“皮普爾之子”(sonof'}]}數(shù)據(jù)打印結(jié)束!輸入單詞sunday
運行結(jié)果如下。請輸入要翻譯的單詞:sunday{'errno':0,'data':[{'k':'Sunday','v':'n.星期日,星期天;每逢星期日出版的報紙;星期日報;[人名]森迪'},{'k':'Sundays','v':'adv.于每星期日n.星期天;星期日(Sunday的名詞復(fù)數(shù));每逢星期日出版的報紙;'},{'k':'Sundayrun','v':'n.長距離,星期日旅行'},{'k':'Sundaypunch','v':'n.對付敵人最厲害的一著'},{'k':'sundaypunch','v':'[體]最厲害的一擊'}]}數(shù)據(jù)打印結(jié)束!請確認(rèn)修改是否正確?sunday
在動態(tài)網(wǎng)頁的網(wǎng)頁文件中,除了有HTML外,還有一些特定功能的程序代碼。通過這些代碼,瀏覽器跟服務(wù)器可以交互,即服務(wù)器可以根據(jù)瀏覽器的請求生成網(wǎng)頁內(nèi)容。通俗的說就是,當(dāng)我們打開動態(tài)網(wǎng)頁時,服務(wù)器不會一次性返回所有頁面內(nèi)容,我們需要哪些內(nèi)容,通過瀏覽器與服務(wù)器交互,服務(wù)器再返回對應(yīng)的內(nèi)容。這種加載數(shù)據(jù)的方式稱為API加載數(shù)據(jù)。API(ApplicationProgrammingInterface)即應(yīng)用程序編程接口,也就是網(wǎng)頁和服務(wù)器交互的途徑。具體來看,爬取動態(tài)網(wǎng)頁數(shù)據(jù)主要可分為以下步驟。步驟1:分析網(wǎng)頁結(jié)構(gòu),查找數(shù)據(jù)接口;步驟2:構(gòu)造請求頭,請求接口數(shù)據(jù);步驟3:解析接口數(shù)據(jù);步驟4:儲存數(shù)據(jù);如果涉及多頁的數(shù)據(jù),需要分析接口的變化規(guī)律,參看以下步驟。步驟1:分析單頁網(wǎng)頁結(jié)構(gòu),查找數(shù)據(jù)接口;步驟2:分析接口變化規(guī)律,構(gòu)造接口參數(shù);步驟3:循環(huán)請求、獲取并解析數(shù)據(jù);步驟4:儲存數(shù)據(jù)。其實一般我們需要登錄的頁面大多都是動態(tài)頁面,它們是有后臺、有服務(wù)器的,我們所能看見的代碼都是前端他們確認(rèn)展示的。在動態(tài)網(wǎng)頁爬取數(shù)據(jù),返回數(shù)據(jù)多為JSON型數(shù)據(jù)類型。JSON的全稱是JavaScriptObjectNotation,是一種輕量級的數(shù)據(jù)交換格式。網(wǎng)絡(luò)之間使用HTTP方式傳遞數(shù)據(jù)的時候,絕大多數(shù)情況下傳遞的都是JSON格式的字符串。方法作用json.dumps()將Python對象編碼成JSON字符串json.loads()將JSON字符串解碼成Python對象json.dump()將Python對象轉(zhuǎn)化成JSON格式存儲到文件中json.load()將文件中的JSON格式轉(zhuǎn)化成Python對象提取出來[例5-2]在Python中初始化一個字典和列表進(jìn)行相互轉(zhuǎn)化。代碼如下:importjson
#一Python中初始化一個字典:
person_dict={
'basic_info':{'name':'張三',
'age':30,
'sex':'male'},
'work_info':{'salary':99999,
'position':'總經(jīng)理',
'department':None}
}
print(person_dict)
#二字典轉(zhuǎn)換為JSON格式的字符串方法
person_json=json.dumps(person_dict)
print(person_json)
#三列表轉(zhuǎn)換為JSON格式的字符串
book_list=[
{'name':'三國演義','price':99.99},
{'name':'西游記','price':100},
{'name':'紅樓夢','price':80},
{'name':'水滸傳','price':45.99},
]
book_json=json.dumps(book_list,indent=4)
print(book_json)
#四把JSON格式的字符串轉(zhuǎn)換為字典方法
person_dict={
'basic_info':{'name':'張三',
'age':30,
'sex':'male'},
'work_info':{'salary':99999,
'position':'總經(jīng)理',
'department':None}
}
#字典轉(zhuǎn)換為JSON格式的字符串
person_json=json.dumps(person_dict)
#把JSON格式的字符串轉(zhuǎn)換為字典
person_json_dict=json.loads(person_json)
print(person_json_dict)
print(person_json_dict['basic_info']['name'])[例5-3]Ajax提取網(wǎng)頁結(jié)果.1.打開網(wǎng)址如下:/kfccda/storelist/index.aspx,該頁面如圖5-11所示。輸入關(guān)鍵字“重慶”查詢結(jié)果如圖5-12所示。.編寫代碼爬取該頁面中的數(shù)據(jù),代碼如下。importrequestsif__name__=='__main__':#指定urlurl='/kfccda/ashx/GetStoreList.ashx?op=keyword'#動態(tài)輸入查找的城市city=input('請輸入您想要查找的城市:')#參數(shù)處理param={'cname':'','pid':'','keyword':city,#城市名稱'pageIndex':'1',#頁面'pageSize':'10',#一頁顯示多少數(shù)據(jù)}#進(jìn)行UA偽裝header={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/84.0.4147.105Safari/537.36'}#獲取相應(yīng)數(shù)據(jù)response=requests.post(url=url,data=param,headers=header)#這個頁面是一個text,不是jsonpage_text=response.textprint(page_text)print('數(shù)據(jù)爬取成功!')
運行該例結(jié)果如下。請輸入您想要查找的城市:重慶{"Table":[{"rowcount":33}],"Table1":[{"rownum":1,"storeName":"崇智","addressDetail":"重慶路1388號(沃爾瑪購物廣場二樓)","pro":"禮品卡","provinceName":"吉林省","cityName":"長春市"},{"rownum":2,"storeName":"解放東路","addressDetail":"重慶路1367號","pro":"Wi-Fi,禮品卡","provinceName":"吉林省","cityName":"吉林市"},{"rownum":3,"storeName":"民權(quán)","addressDetail":"重慶民權(quán)路1號","pro":"24小時,Wi-Fi,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":4,"storeName":"重慶肯德基有限公司大禮堂餐廳","addressDetail":"渝中區(qū)大溪溝街道人民路133號","pro":"Wi-Fi,點唱機,店內(nèi)參觀,禮品卡,手機點餐","provinceName":"重慶市","cityName":"重慶市"},{"rownum":5,"storeName":"縉麓","addressDetail":"重慶北碚區(qū)天生新村63號縉麓商都A棟1-2層","pro":"Wi-Fi,點唱機,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":6,"storeName":"雄風(fēng)","addressDetail":"重慶北碚區(qū)嘉陵風(fēng)情街33號1-1號一層","pro":"Wi-Fi,點唱機,店內(nèi)參觀,禮品卡","provinceName":"重慶市","cityName":"重慶市"},{"rownum":7,"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024特崗教師聘用及教師團(tuán)隊協(xié)作能力提升服務(wù)合同3篇
- 2025年度新能源車輛采購及維護(hù)服務(wù)合同范本2篇
- 2025年度智能家居系統(tǒng)代理商合作協(xié)議4篇
- 2025年度新能源汽車研發(fā)出資人合作協(xié)議4篇
- 2025年度旅游景區(qū)特色商品檔口租賃經(jīng)營合同3篇
- 2025年度水電工程安全監(jiān)測系統(tǒng)安裝與維護(hù)服務(wù)合同3篇
- 2024版食堂承包合同協(xié)議范文
- 2025年度特殊崗位人員辭退及安置協(xié)議范本4篇
- 2025年度智能機器人研發(fā)股權(quán)合作協(xié)議4篇
- 2025年度文化產(chǎn)業(yè)園區(qū)運營管理合同3篇
- 小學(xué)數(shù)學(xué)六年級解方程練習(xí)300題及答案
- 電抗器噪聲控制與減振技術(shù)
- 中醫(yī)健康宣教手冊
- 2024年江蘇揚州市高郵市國有企業(yè)招聘筆試參考題庫附帶答案詳解
- 消費醫(yī)療行業(yè)報告
- 品學(xué)課堂新范式
- GB/T 1196-2023重熔用鋁錠
- 運輸行業(yè)員工崗前安全培訓(xùn)
- 公路工程安全風(fēng)險辨識與防控手冊
- 幼兒園教師培訓(xùn):計數(shù)(數(shù)數(shù))的核心經(jīng)驗
- 如何撰寫和發(fā)表高水平的科研論文-good ppt
評論
0/150
提交評論