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