js 爬虫抓取网页数据(Python最简单的爬虫requests-html安装-)
优采云 发布时间: 2022-01-28 17:17js 爬虫抓取网页数据(Python最简单的爬虫requests-html安装-)
很多朋友都听说过Python这个名字,Python也有很多爬虫框架,其中最简单的就是requests-html。它与著名的网络请求库 requests 是同一作者。它专注于XML数据提取,可以说是最简单的爬虫框架。
安装请求-html
安装这个类库很简单,可以直接通过pip安装。
pip install requests-html
开始使用
requests-html 使用起来也很简单,这里举个简单的例子。和往常一样,第一段介绍 HTMLSession 创建连接并获取网页数据。第二段创建连接,获取我的简书用户页面。第三段使用xpath语法获取网页上的用户名,最后打印出来。
from requests_html import HTMLSessionsession = HTMLSession()response = session.get( 'https://www.jianshu.com/u/7753478e1554')username = response.html.xpath( '//a[@class="name"]/text()', first=True)print(username)
看起来很简单吗?是的,它真的很简单,而且还有一些更有趣的功能。
分析网页
在编写爬虫之前要做的另一件事是分析网页的结构。这个工作其实很简单,打开你要访问的网页,按F12打开开发者工具,在最左边就可以看到这样一个按钮。点击这个按钮,然后在网页上点击你要查看的网页元素,你可以发现已经为你定位到了该元素对应的相关源码。
定位按钮
通过这个功能,我们可以很方便的分析网页,然后根据它的结构编写爬虫。
提取数据
上面的response.html是网页根节点的HTML节点,可以在节点对象上调用一些方法来获取数据。最常用的方法是 find 方法,它通过 CSS 选择器来定位数据。对于上面的例子,第三段可以用 find 方法重写。
由于所有搜索方法都返回列表,如果您确定只需要搜索一个,请将第一个参数设置为 true 以仅返回第一个结果。find 方法仍然返回一个节点。如果只需要节点的内容,可以调用它的 text 属性。
用户名对应的HTML结构如图所示。
代码显示如下。
username = response.html.find('a.name', first=True).text
除了 find 方法,您还可以使用 xpath 方法使用 xpath 语法查找节点,如第一个示例所示。我个人更喜欢 xpath 语法。虽然 CSS 选择器比较流行,但是写出来的效果有点怪,不像 xpath 那样整洁。
同样在此页面上,查看如何获取我的简要资料。网页代码如图所示。
代码显示如下。
description = response.html.xpath( '//div[@class="description"]/div[@class="js-intro"]/text()', first=True)
CSS 选择器和 XPATH 语法不是本文的主要内容,如果你不熟悉这方面,最好去相关教程。当然,如果你有任何问题,你可以问他们。如果你想看,我也可以专门写一个文章来介绍这些语法知识。
呈现网页
有些网页是使用前后端分离技术开发的,需要浏览器渲染才能完整显示。如果用爬虫看的话,只能显示部分内容。这时,浏览器需要渲染页面才能获得完整的页面。使用 requests-html,过程非常简单。
我们先来看一个需要渲染网页的例子。下面的代码访问我的简书用户页面,然后尝试获取我所有的 文章s。但是如果你运行这个例子,你会发现只获取了前几个项目。因为简书页面是典型的需要浏览器渲染的页面,爬虫获取到的网页是不完整的。
from requests_html import HTMLSessionsession = HTMLSession()headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.119 Safari/537.36'}url = 'https://www.jianshu.com/u/7753478e1554'r = session.get(url, headers=headers)for a in r.html.xpath('//ul[@class="note-list"]/li/div[@class="content"]/a[@class="title"]'): title = a.text link = f'https://www.jianshu.com{a.attrs["href"]}' print(f'《{title}》,{link}')
那么如何渲染网页以获得完整的结果呢?其实很简单,在查询HTML节点之前调用render函数即可。
使用浏览器渲染的渲染函数
原理也很简单。当第一次调用 render 时,requests-html 会在本地下载一个 chromium 浏览器并使用它来渲染网页。这样,我们就可以得到渲染后的页面了。
但是对于简书的例子还是有一些问题,因为如果你在浏览器中打开这个页面,你会发现有些文章在浏览器向下滑动页面的时候开始渲染。不过,聪明的作者早就考虑到了这种情况。render函数支持滑动参数。设置后会模拟浏览器滑动操作,从而解决这个问题。
r.html.render(scrolldown=50, sleep=0.2)
节点对象
不管上面的 r.html 还是 find/xpath 函数返回的结果,都是节点对象。除了上面介绍的提取数据的方法外,节点对象还有以下几个属性,在我们提取数据的时候也是非常有用的。
相比scrapy这个专业的爬虫框架,或者BeautifulSoup,一个只用来解析XML的解析库。requests-html可以说是恰到好处,没有前者那么难学,也不需要像后者那样配合HTTP请求库使用。如果你需要临时爬取手头的几个页面,requests-html 是你最好的选择。