爬虫三步走:
- 发送请求获取网页HTML
- 解释网页HTML,得到数据或连接
- 下载或保存数据
现有的资料基本上都是每一步用一个库。
大白学习爬虫第一步时,用得最多的库还是requests,第二步时会用BeautifulSoup库。
现在requests作者出一个新的库:requests-html,它可以帮你用一个库,完成爬虫的第一步与第二步,使得写代码与运行也简便与快捷多了。
requests-html只支持Python 3.6及更新的版本,所以使用老版本的Python的同学需要更新一下Python版本了。
安装:
pip install requests-html
使用
requests-html库核心是学习其HTML类
第一步:获取网页HTML:
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.jianshu.com")
#第一步:获取网页HTML:
print(r.html.html)
#打印出简书的HTML网页代码
第二步:解释网页HTML,得到数据或连接
links和 absolute_links两个属性分别返回HTML对象所包含的所有链接和绝对链接(均不包含锚点)。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.jianshu.com")
#第一步:获取网页HTML:
#print(r.html.html)
#打印出简书的HTML网页代码
#第二步:解释网页HTML,得到数据或连接
#返回的数据是一个set集合
print("links返回的数据类型:"+ str(type(r.html.links)))
for html in r.html.links:
print(html)
print("-" * 30)
print("absolute_links返回的数据类型:"+ str(type(r.html.absolute_links)))
for html in r.html.links:
print(html)
以下是打印结果:
links返回的数据类型:<class 'set'>
https://www.jianshu.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
/p/e3e0734f2d52
/p/c22ed25a7094#comments
/u/c0b66cf61400
https://www.jianshu.com/p/a37929ad1994?utm_medium=index-banner&utm_source=desktop
http://218.242.124.22:8081/businessCheck/verifKey.do?showType=extShow&serial=9031000020171107081457000002158769-SAIC_SHOW_310000-20171115131223587837&signData=MEQCIADWZ5aTcBeER5SOVp0ly+ElvKnwtjczum6Gi6wZ7/wWAiB9MAPM22hp947ZaBobux5PDkd0lfqoCOkVV7zjCYME6g==
/p/c22ed25a7094
/u/530f5d6d4108
/sign_up
/mobile/club
absolute_links返回的数据类型:<class 'set'>
https://www.jianshu.com/p/5510d62f613d?utm_medium=index-banner&utm_source=desktop
https://www.jianshu.com/p/5d6f22ebacd2#comments
https://www.jianshu.com/mobile/club
获取元素
request-html支持CSS选择器语法来选取HTML元素。
CSS选择器语法,它需要使用HTML的find函数,该函数有5个参数,作用如下:
- selector,要用的CSS选择器;
- clean,布尔值,如果为真会忽略HTML中style和script标签造成的影响(原文是sanitize,大概这么理解);
- containing,如果设置该属性,会返回包含该属性文本的标签;
- first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表;
- _encoding,编码格式。
以下一行代码就可以获取元素,取其text属性就可以得到元素的内容,过程中少了加载BeautifulSoup库,写代码也更方便了。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get("http://www.jianshu.com")
#获取首页span元素的内容:首页
print(r.html.find("span.menu-text",first=True).text)
#打印:首页
处理JavaScript
有些网站是使用JavaScript渲染的,这样的网站爬取到的结果只有一堆JS代码,这样的网站requests-html也可以处理,关键一步就是在HTML结果上调用一下render函数,它会在用户目录(默认是 ~/.pyppeteer/)中下载一个chromium,然后用它来执行JS代码。
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('http://python-requests.org/')
r.html.render()
[W:pyppeteer.chromium_downloader] start chromium download.
Download may take a few minutes.
[W:pyppeteer.chromium_downloader] chromium download done.
[W:pyppeteer.chromium_downloader] chromium extracted to: C:\Users\xxxx\.pyppeteer\local-chromium\571375
r.html.search('Python 2 will retire in only {months} months!')['months']
'<time>25</time>'
render函数还有一些参数,顺便介绍一下(这些参数有的还有默认值,直接看源代码方法参数列表即可):
retries: 加载页面失败的次数
- script: 页面上需要执行的JS脚本(可选)
- wait: 加载页面钱的等待时间(秒),防止超时(可选)
- scrolldown: 页面向下滚动的次数
- sleep: 在页面初次渲染之后的等待时间
- reload: 如果为假,那么页面不会从浏览器中加载,而是从内存中加载
- keep_page: 如果为真,允许你用 r.html.page访问页面
PS: 这个库更似是将2个库合为一个库来使用,不管怎样,它给我们节省了时间,加快了代码运行速度,甚是好用。