有時候在抓取頁面的時候,咱們獲得的結果和瀏覽器中看到的的結果是不同的。在瀏覽器中能夠正常看到的界面,使用requests不可以正確的獲得。這是由於requests獲得的是原始的html文檔,而瀏覽器的頁面則是通過JavaScript處理後生成的數據,這些數據的來源不少,其中有一種是使用Ajax技術加載的。還有另外兩種是通過JavaScript和特定算法生成的。以及包含在html文檔中的。html
對於Ajax方式的數據加載方式,它是一種異步加載的方式,原始頁面最初的時候不會包含某些數據。而是在加載完成後,向接口請求新的數據,而後呈如今網頁上面。ajax
從發展趨勢來看,AJax加載的頁面如今是愈來愈多,由於這樣作能夠作到先後端分離,減輕服務器的壓力。咱們直接抓取原始頁面是不能獲得咱們想要的結果的。算法
1.什麼是Ajax編程
Ajax,全稱是異步的JavaScript和xml,不是一門專門的編程語言,而是利用JavaScript在保證頁面不被總體刷新的狀況下與服務器交換數據而且更新部分網頁顯示的技術。例如在逛淘寶的時候,咱們能夠發如今網頁下滑時能夠看到最新的內容,這個加載的過程就是Ajax加載的過程。發送Ajax請求到網頁更新的過程當中,簡單來講能夠分爲3步:發送請求,解析內容、渲染頁面。json
2.Ajax解析方法後端
2.1查看Ajax請求api
要查看請求,須要藉助瀏覽器的開發者工具。例如在360瀏覽其中打開頭條網(https://www.toutiao.com/),按下F12進入開發者模式。以下圖所示。瀏覽器
此時的Elements選項中出現的就是網頁的源代碼,不過這不是咱們須要的內容。切換到Network選項,從新刷新網頁,能夠發現出現了很是多的請求,以下圖所示。服務器
2.2過濾Ajax請求前後端分離
在這個頁面中,Ajax擁有特殊的請求類型,叫作XHR。在此頁面中選擇過濾條件爲XHR,此時在頁面中顯示的都是Ajax請求了。而後在頭條的界面中不斷滑動頁面,在開發者工具中也會實時刷新一條條Ajax請求。
隨便點開一條記錄,均可以清楚的看到它自身的request 、Headers信息和response信息,此時若是想要模擬Ajax請求,只須要清楚url中各參數的含義就能夠了。以下圖所示,下圖爲Ajax請求某一頁的信息。
3.Ajax結果提取
3.1 分析請求
打開Ajax的XHR過濾器,而後一直滑動頁面加載新的內容,看到開發者工具中不斷出現新的請求,選定其中一個請求,查看而且分析它的參數信息,以下圖所示。
能夠看到,這是一個get類型的請求,請求的真實url爲:https://www.toutiao.com/api/pc/feed/?max_behot_time=1547874493&category=__all__&utm_source=toutiao&widen=1&tadrequire=false&as=A1256C54724D52E&cp=5C426D65D26EEE1&_signature=HULjgxAfQQThOwn.Q6we3x1C45。查看其餘ajax請求的的真實url,找到這些url之間的規律,就能夠批量的獲取Ajax請求的數據了。查找規律的事情等之後更新的時候再說。
3.2使用Python爬取數據
import requests,json url = 'https://www.toutiao.com/api/pc/feed/?max_behot_time=1547854873&category=__all__&utm_source=toutiao&widen=1&tadrequire=true&as=A1E58C14928D583&cp=5C428D6558C39E1&_signature=HULjgxAfQQThOwn.Q6zGfx1C45' header = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36', 'referer: https': '// www.toutiao.com /', } r = requests.get(url,headers = header) print(r.json()) ''' 解析代碼略 '''