如今很多网站的内容在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