抓取网页生成电子书(Python最简单的爬虫requests-html安装-)

优采云 发布时间: 2021-12-29 17:09

  抓取网页生成电子书(Python最简单的爬虫requests-html安装-)

  很多朋友都听说过Python这个名字,Python也有很多爬虫框架,最简单的就是requests-html。和著名的web请求库requests是同一个作者。它专注于XML数据提取,可以说是最简单的爬虫框架。

  

  安装 requests-html

  这个库的安装很简单,直接通过pip安装即可。

  pip install requests-html

  开始使用

  Requests-html 使用起来也很简单,下面是一个简单的例子。像往常一样,第一段介绍了 HTMLSession 来创建连接并获取网页数据。第二段创建连接并获取我的短书的用户页面。第三段使用xpath语法获取网页上的用户名,最后打印出来。

  from requests_html import HTMLSession

session = 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,过程非常简单。

  首先我们来看一个需要渲染的网页的例子。以下代码访问我的短书用户页面,然后尝试获取我的所有文章。但是如果你运行这个例子,你会发现你只能得到前几项。由于短书页面是典型的需要浏览器渲染的页面,爬虫获取的网页是不完整的。

  from requests_html import HTMLSession

session = 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函数即可。

  

  使用浏览器渲染的渲染函数

  原理也很简单。当第一次调用渲染时,requests-html 将在本地下载一个 Chrome 浏览器并使用它来渲染网页。这样我们就可以得到渲染出来的页面了。

  但是对于短书的例子,还是存在一些问题,因为如果你在浏览器中打开这个网页,你会发现有些文章只有在浏览器向下滑动页面时才开始渲染。不过,聪明的作者早就考虑过这种情况。渲染函数支持滑动参数。设置后会模拟浏览器滑动操作来解决这个问题。

  r.html.render(scrolldown=50, sleep=0.2)

  节点对象

  不管上面的r.html还是find/xpath函数返回的结果都是节点对象。除了上面介绍的几种提取数据的方法外,节点对象还有以下属性,在我们提取数据的时候也是非常有用的。

  

  相比专业的爬虫框架scrapy,还是解析库BeautifulSoup,只用于解析XML。requests-html 可以说是恰到好处。没有前者那么难学,也不需要像后者那样使用HTTP请求库。如果您需要临时抓取几个网页,那么 requests-html 是您的最佳选择。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线