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

如今很多網站的內容在JavaScript的代碼中,爲了能讓咱們看到其中的內容,瀏覽器會對JavaScript代碼進行渲染,獲得其中的內容後再呈現到咱們面前。然而,當咱們須要對網站進行文本或數據收集的時候,咱們每每不使用瀏覽器,而是經過爬蟲程序。顯然,爬蟲程序不一樣於通常的瀏覽器,能自動或默認地對HTML文件中的JavaScript代碼進行渲染。所以,若是咱們的目標鑲嵌在JavaScript中,那麼咱們爬到的數據每每就會缺乏了咱們的目標。html

 

解決這個問題大體有兩種方案:一是直接(或顯示)地模擬瀏覽器的行爲,好比用Selenium模塊,該模塊就提供了返回渲染後HTML文本的功能;顯然,第二種方法就是隱式渲染,咱們不會看到瀏覽器被打開,連接被打開等等一系列的行爲,但代碼運行後最終也能獲得渲染後的結果。如今主要介紹一下第二種方法。相比於比較笨重的Selenium,這種方法會用到一個輕量級的HTML解析模塊:requests-html。python

 

安裝瀏覽器

安裝比較簡單,在命令行運行:session

pip install requests-html 或者 pip3 install requests-html

便可安裝該模塊。app

 

運用網站

requests-html提供了渲染JavaScript的方法:render,示例以下:spa

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/ code

相關文章
相關標籤/搜索