是用Python进行爬虫抓取数据,并且与requests_html结缘,是在这一篇文章之中:
如何用 Python 爬数据?(一)网页抓取
在此之前有一些对网页的理解,所以使用起来也并不是很难,倒是在理解Python语法上花了点功夫。
对于requests_html里面有哪些方法,以及方法名,可以在这里查看:
requests_html中文文档
主要遇到的问题:
在使用requests_html的render()时,发现会报错,错误内容:
Cannot use HTMLSession within an existing event loop. Use AsyncHTMLSession
刚开始,我参考这篇文章试了一下:request-html chromium 下载失败 or request-html 无法下载 chromium or r.html.render () 导致异常报错
还是不行,这个错误让我头疼了一天,最后坑爹的发现:jupyter Notebook 是用不了这个方法的。不止jupyter notebook上用这个方法会报错,其他的也一样,只要是在Anoconda里面的东西,例如:Spyder 这些东西都会报错。
最后我自己试了一下,新建了一个hello.py文件,在这个文件里面,调用了render()方法,运行输出都没问题。
以下是我的代码部分:
from requests_html import HTMLSession
session = HTMLSession()
url = 'xxxxxxxxxxxxxxx'
sel = 'xxxxxxxxxxxxxxx'
r = session.get(url)
r.html.render(scrolldown = 4,sleep = 2)
result = r.html.find(sel)
讲解一下render()方法的作用(虽然我自己也不是很懂)
这个的方法,我把它看作是让网页滚动。简单来说,有些网页的界面,它需要加载更多的内容,触发“加载”这个事情的,就是用户滚动到了某一位置,或者说滚动了多少,于是网页自己去加载更多内容,而不是整个刷新网页。
这种网页,使用requests_html去抓取的时候,抓取到的是没有“加载更多”之前的网页,往往数据量非常少。
而render(scrolldown = 4,sleep = 2)可以模拟用户的滚动动作,从而让网页有更多内容。
举个简单易懂的列子:
当使用r=session.get(url) 时,通过print(r.html.links)抓取到的链接数量是:10
而网页滚动之后,这个页面的链接数量就会增加到 20 如果你不使用r.html.render(scrolldown = 4 , sleep = 2)去滚动网页,这些链接数量会一直是 10
如果调用了这个语句:.html.render(scrolldown = 4 , sleep = 2) , 那么你再使用 print(r.html.links)时,显示的链接数量就有20个了。