使用requests_html爬取数据时遇到的一些问题以及解决方法

是用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个了。

你可能感兴趣的:(Python)