python获取网页源码不完整_python和Ajax在一起了?真的???
Ajax動(dòng)態(tài)網(wǎng)頁(yè)加載爬取新浪微博某關(guān)鍵詞下的信息
前言
有些時(shí)候我們使用瀏覽器查看頁(yè)面正常顯示的數(shù)據(jù)與使用requests抓取頁(yè)面html得到的數(shù)據(jù)不一致,這是因?yàn)閞equests獲取的是原始的HTML文檔,而瀏覽器中的頁(yè)面是經(jīng)過JavaScript處理數(shù)據(jù)后的結(jié)果。這些處理過的數(shù)據(jù)可能是通過Ajax加載的,可能包含HTML文檔中,可能經(jīng)過特定算法計(jì)算后生成的。
一、Ajax原理
1、什么是Ajax?
Ajax全稱為Asynchronous JavaScript and XML,即為異步的JavaScript(JS語言)和XML(萬能的數(shù)據(jù)傳輸格式)。2、異步化?
Ajax的工作原理相當(dāng)于在用戶和服務(wù)器之間加了—個(gè)中間層(AJAX引擎),使用戶操作與服務(wù)器響應(yīng)異步化。并不是所有的用戶請(qǐng)求都提交給服務(wù)器。像—些數(shù)據(jù)驗(yàn)證和數(shù)據(jù)處理等都交給Ajax引擎自己來做,只有確定需要從服務(wù)器讀取新數(shù)據(jù)時(shí)再由Ajax引擎代為向服務(wù)器提交請(qǐng)求它能夠利用,JavaScript在保證不被刷新,連接不變的情況下,服務(wù)器交換數(shù)據(jù)并更新部分網(wǎng)頁(yè)的技術(shù)。像傳統(tǒng)的網(wǎng)頁(yè)(不使用Ajax)若要更新網(wǎng)頁(yè)內(nèi)容,必須重新加載網(wǎng)頁(yè),比如貓眼、豆瓣等。下圖為對(duì)比圖:
3、示例
瀏覽網(wǎng)頁(yè)的時(shí)候,我們發(fā)現(xiàn)很多網(wǎng)頁(yè)都有下滑查看更多的選項(xiàng)。比如,就拿新浪微博主頁(yè)來說。一直往下滑,看到幾個(gè)微博之后就沒有了,而是會(huì)出現(xiàn)一個(gè)加載的動(dòng)畫,很快就出現(xiàn)了新的微博內(nèi)容,這個(gè)過程就是Ajax加載的過程
二、準(zhǔn)備環(huán)境+爬取網(wǎng)站
ananconda3——spyder
谷歌瀏覽器
https://m.weibo.cn/
三、網(wǎng)頁(yè)分析與定位
1、本次爬取選取“奪冠”這一關(guān)鍵詞
2、檢查元素——Network——XHR——Ctrl+R
3、滑動(dòng)頁(yè)面,依次查看前三頁(yè)page,Request URL中包含多個(gè)參數(shù)
選了前三頁(yè)觀察,發(fā)現(xiàn)在Request URL里面除了最后page=2,page=3,其他參數(shù)都不發(fā)生變化
4、觀察Preview里面的信息
想要獲取的信息都在data——cards——mblog下面
分別查詢?nèi)齻€(gè)頁(yè)面發(fā)現(xiàn),只有在第一頁(yè)中時(shí),有些cards下面不存在mblog,也就是說爬出來的內(nèi)容可能會(huì)為空,所以本次爬取我舍去第一頁(yè)內(nèi)容不全的,從page=2開始,這樣可以保證爬出來的內(nèi)容比較全。
三、代碼實(shí)現(xiàn)
1、導(dǎo)入庫(kù)
from urllib.parse import urlencodeimport requestsimport json使用urlencode主要用于正常識(shí)別輸入的漢字、空格以及其他特殊字符,由于url中傳入了部分參數(shù),所以需識(shí)別參數(shù)拼接為完整的url
輸出格式為對(duì)象格式:{“key1”:obj,“key2”:obj,“key3”:obj…},所以導(dǎo)入json包2、解析頁(yè)面
定義一個(gè)獲取頁(yè)面的函數(shù),其中的參數(shù)params包含如下所示
除了page以外,其他參數(shù)均不變。定義一個(gè)base_url,所有網(wǎng)頁(yè)的base_url為同一個(gè)。
這里需要用到urlencode對(duì)參數(shù)進(jìn)行轉(zhuǎn)化拼接,使其轉(zhuǎn)化并生成出每一頁(yè)完整的url
def get_page(page): params = { 'containerid':'231522type=1&t=10&q=#奪冠#', 'page_type':'searchall', 'isnewpage':'1', 'luicode':'10000011', 'lfid':'100103type=38&q=奪冠&t=0', 'page_type': 'searchall', 'page':page } url = base_url + urlencode(params) try: rq = requests.get(url,headers = headers) if rq.status_code == 200 : return rq.json() except rq.ConnectionError as e: print('程序錯(cuò)誤',e.args)3、定位id和raw_text第一個(gè)函數(shù)返回rq.json(),目的是獲取如下界面的全部解析碼print(re.json())后,輸出全部?jī)?nèi)容j = get_page(page)返回那個(gè)解析頁(yè)面,從解析頁(yè)面里面找data——cards,items為cards下面所有的東西,我只想獲得mblog下的id和raw_text,所以用了一個(gè)循環(huán)。先找到mblog用item接收,再再item下找到id用id接收,再找raw_text用raw_text接收,用append進(jìn)行列表的依次添加,得到 all_id和all_raw_text。最后轉(zhuǎn)化為字典形式
def parse_page(j): items = j['data']['cards'] all_id=[] all_raw_text=[] for item in items: item = item['mblog'] id=item['id'] raw_text=item['raw_text'] all_id.append(id) all_raw_text.append(raw_text) weibo = dict(zip(all_id,all_raw_text)) #zip,將兩個(gè)列表合并成一個(gè)字典 return weibo4、存入txt文件存入為json格式
def write_text(result): with open('關(guān)鍵詞信息.txt','a',encoding='utf-8') as f: f.write(json.dumps(result, ensure_ascii=False) + '\n') f.write('\n') f.close()5、主函數(shù)調(diào)用
Referer,User-Agent,X-Reuestes-With均在網(wǎng)頁(yè)里
四、結(jié)果展示
每個(gè)id對(duì)應(yīng)一條微博信息
歡迎關(guān)注公眾號(hào):Python爬蟲數(shù)據(jù)分析挖掘
記錄學(xué)習(xí)python的點(diǎn)點(diǎn)滴滴;
回復(fù)【開源源碼】免費(fèi)獲取更多開源項(xiàng)目源碼;
公眾號(hào)每日更新python知識(shí)和【免費(fèi)】工具;
本文已同步到【開源中國(guó)】、【騰訊云社區(qū)】、【CSDN】;
總結(jié)
以上是生活随笔為你收集整理的python获取网页源码不完整_python和Ajax在一起了?真的???的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 帷幕的帷是什么意思_“战斗民族”的鲜花礼
- 下一篇: word文档查重_「毕业之家」揭秘:大学