在用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/

posted on 2019-04-03 22:23  tspeaking  阅读(4469)  评论(0编辑  收藏  举报

导航