Python爬蟲實戰入門五:獲取JS動態內容—爬取今日頭條
之前我們爬取的網頁,多是HTML靜態生成的內容,直接從HTML源碼中就能找到看到的數據和內容,然而並不是所有的網頁都是這樣的。
有一些網站的內容由前端的JS動態生成,由於呈現在網頁上的內容是由JS生成而來,我們能夠在瀏覽器上看得到,但是在HTML源碼中卻發現不了。比如今日頭條:瀏覽器呈現的網頁是這樣的:網頁的新聞在HTML源碼中一條都找不到,全是由JS動態生成載入。
遇到這種情況,我們應該如何對網頁進行爬取呢?有兩種方法:1、從網頁響應中找到JS腳本返回的JSON數據;2、使用Selenium對網頁進行模擬訪問在此只對第一種方法作介紹,關於Selenium的使用,後面有專門的一篇。一、從網頁響應中找到JS腳本返回的JSON數據即使網頁內容是由JS動態生成載入的,JS也需要對某個介面進行調用,並根據介面返回的JSON數據再進行載入和渲染。所以我們可以找到JS調用的數據介面,從數據介面中找到網頁中最後呈現的數據。
就以今日頭條為例來演示:1、從找到JS請求的數據介面F12打開網頁調試工具選擇「網路」選項卡後,發現有很多響應,我們篩選一下,只看XHR響應。
(XHR是Ajax中的概念,表示XMLHTTPrequest)然後我們發現少了很多鏈接,隨便點開一個看看:我們選擇city,預覽中有一串json數據:我們再點開看看:
原來全都是城市的列表,應該是載入地區新聞之用的。
現在大概了解了怎麼找JS請求的介面的吧?但是剛剛我們並沒有發現想要的新聞,再找找看:有一個focus,我們點開看看:與首頁的圖片新聞呈現的數據是一樣的,那麼數據應該就在這裡面了。
看看其他的鏈接:這應該是熱搜關鍵詞
這個就是圖片新聞下面的新聞了。
我們打開一個介面鏈接看看:http://www.toutiao.com/api/pc/focus/返回一串亂碼,但從響應中查看的是正常的編碼數據:
有了對應的數據介面,我們就可以仿照之前的方法對數據介面進行請求和獲取響應了
2、請求和解析數據介面數據先上完整代碼:# coding:utf-8import requestsimport jsonurl = "http://www.toutiao.com/api/pc/focus/"wbdata = requests.get(url).textdata = json.loads(wbdata)news = data["data"]["pc_feed_focus"]for n in news: title = n["title"] img_url = n["image_url"] url = n["media_url"] print(url,title,img_url)
返回出來的結果如下:
照例,稍微講解一下代碼:
代碼分為四部分,第一部分:引入相關的庫# coding:utf-8import requestsimport json
第二部分:對數據介面進行http請求
url = "http://www.toutiao.com/api/pc/focus/"wbdata = requests.get(url).text
第三部分:對HTTP響應的數據JSON化,並索引到新聞數據的位置
data = json.loads(wbdata)news = data["data"]["pc_feed_focus"]
第四部分:對索引出來的JSON數據進行遍歷和提取
for n in news: title = n["title"] img_url = n["image_url"] url = n["media_url"] print(url,title,img_url)
如此,就完成了從JS網頁中爬取數據。
============================
微信公眾號:州的先生 首發
個人網站:http://zmister 同步更新
推薦閱讀: