現在不少網站的內容在JavaScript的代碼中,為了能讓我們看到其中的內容,瀏覽器會對JavaScript代碼進行渲染,得到其中的內容后再呈現到我們面前。然而,當我們需要對網站進行文本或數據收集的時候,我們往往不使用瀏覽器,而是通過爬蟲程序。顯然,爬蟲程序不同於一般的瀏覽器,能自動或默認地對HTML文件中的JavaScript代碼進行渲染。因此,如果我們的目標鑲嵌在JavaScript中,那么我們爬到的數據往往就會缺少了我們的目標。
解決這個問題大致有兩種方案:一是直接(或顯示)地模擬瀏覽器的行為,比如用Selenium模塊,該模塊就提供了返回渲染后HTML文本的功能;顯然,第二種方法就是隱式渲染,我們不會看到瀏覽器被打開,鏈接被打開等等一系列的行為,但代碼運行后最終也能得到渲染后的結果。現在主要介紹一下第二種方法。相比於比較笨重的Selenium,這種方法會用到一個輕量級的HTML解析模塊:requests-html。
安裝
安裝比較簡單,在命令行運行:
pip install requests-html
或者
pip3 install requests-html
即可安裝該模塊。
運用
requests-html提供了渲染JavaScript的方法:render,示例如下:
from requests_html import HTMLSession from bs4 import BeautifulSoup session = HTMLSession() first_page = session.get('https://sou.zhaopin.com/?jl=763&kw=%E7%88%AC%E8%99%AB%E5%B7%A5%E7%A8%8B%E5%B8%88&kt=3') first_page.html.render(sleep=5) soup = BeautifulSoup(first_page.html.html, "lxml")
# 經試驗,需要使用"lxml"解析器才能讓BeautifulSoup正確解析渲染后的JavaScript中的內容 ls = soup.find_all(class_="contentpile__content__wrapper__item__info__box__job__saray") with open("result.txt", "w") as f: for item in ls: f.write(str(item) + '\n')
注意到,render后有一個sleep參數,目的是為了在進行下一步(即BeautifulSoup解析渲染后的HTML)之前,充分渲染網頁,得到完全渲染后的結果。經試驗,如果不給予充足的時間渲染,可能不會找到目標標簽。
關於requests-html的其他詳細用法還請參考https://html.python-requests.org/