在用BeautifulSoup解析HTML前對其中以JavaScript渲染部分的處理


現在不少網站的內容在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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM