Request HTML

当我们做HTML解析的时候。我们通常用的是 BeautifulSoup 或者是 PyQuery。前一阵子request这个库的作者又写了一个html解析库。Github仓库上的描述写到:HTML Parsing for Humans。那么想必这个框架一定很人性化。本着试一试的态度,我尝试了一下用这个库去爬取 Gank.io 闲读 网页,的确非常好用。

优点

我们知道如果使用beautifulsoup去爬取网页的话,它会安装一个lxml依赖库。这个依赖库是为了做HTML解析的。而这次我们要介绍的request-html,是不需要这个依赖库。其次,它内部又与request的这个库很好的结合在了一起。使得解析一个网页非常的方便快捷。

安装

注意:requests-html只支持Python 3.6及以上的版本

pip install request-html

步骤

这里我们想要爬取闲读上面每一个新闻的标题。

我们先使用谷歌浏览器的开发者工具,检查一下标题所在的DOM位置。

这里得出实在xiandu_items下的xiandu_item里,通过一个a标签包围着的标题。
确定好位置之后,我们进入代码实现的部分。

实现

之前我们可以通过request的这个库的get方法来获得网页上的正文。而这里我们将使用request-html的 HTMLSession 会话来获得网页正文。

from requests_html import HTMLSession, HTMLResponse
session = HTMLSession()
site: HTMLResponse = session.get('https://gank.io/xiandu')

这里的变量存储了整个网页上的信息。

CSS 选择器选择元素

我们使用CSS选择器来选择元素。这里调用了find方法。它会返回网页上所有匹配的元素。当然它还提供了一个first参数。如果将它设为True的话。将直接返回第一个找到的元素。最后我们使用元素节点的text,将它遍历出来。

xiandu_item = site.html.find('.xiandu_items', first=True)
xiandu_list = xiandu_item.find('.xiandu_items a')
for item in xiandu_list:
    print(item.text)

结果如图:

这里我们的爬取工作就结束了,可以看到这个库真的是非常的方便。

其他知识点

1. 解析文本

如果你不想使用request爬取的内容的话,你可以直接将字符串赋给HTML类,它也可以进行解析。

from requests_html import HTML
doc = """<a href='https://httpbin.org'>"""
html = HTML(html=doc)
print(html.html)

2. 调用 JS

有些网页是需要 JS 进行渲染的,这时候request-html也提供了一个方法,获得渲染之后的网页。它会自动下载 Chrome Driver,然后用浏览器去加载这个网页,将加载好的网页进行解析。这个工作有点类似 selenum。比较遗憾的是它没有提供 Chrome Driver 的自定义路径,以国内的网速来看,下载得费一番功夫。

js_script = """\
() => {
    return document.URL
}
"""

result = site.html.render(script=js_script)
print(result)

有些网站上的内容会异步加载,这时候会需要滚动+等待来处理:

result = site.html.render(script=js_script, scrolldown=5, sleep=1)

3. 模式匹配

提供了类似正则匹配的功能,非常快捷

r.html.search('Python is a {} language')[0]

4. Element 对象

返回的是 Element 对象,这个对象可以继续使用 find等方法递归调用下去。同时,它还包括以下属性:

属性 含义
text 文本内容
attr 属性
html HTML 内容
links 链接

5. 修改 header

某些时候我们需要修改header,这时候我们只要在get请求里面添加即可。实际上这一部分逻辑应该是沿用了request的逻辑。

session.get('http://httpbin.org/get', headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'})

参考资料

Requset-html 文档

Comments
Write a Comment