很多朋友都听说过Python的大名,而Python也拥有众多的爬虫框架,其中最简单的莫过于requests-html了。它和著名的网络请求库requests是同一个作者,着重于XML数据提取,可以说是最简单的爬虫框架了。

安装requests-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方法改写第三段。

因为所有查找方法返回的结果都是列表,所以如果你确定只需要查找一个,就将first参数设为真来只返回第一个结果。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 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函数来使用浏览器渲染

原理也非常简单,第一次调用render的时候,requests-html会在本地下载一个chromium浏览器,用它来渲染网页。如此一来,我们就可以获取到渲染之后的页面了。

但是对于简书这个例子来说还是有些问题,因为如果你在浏览器里打开这个网页的话,会发现一些文章在浏览器下滑页面的时候才开始渲染。不过聪慧的作者早就考虑到这种情况了,render函数支持下滑的参数,设定之后,就会模拟浏览器下滑操作,从而解决了这个问题。

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

节点对象

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

相较于专业的爬虫框架scrapy,或者仅用于解析XML的解析库BeautifulSoup。requests-html可以是说恰到好处,它没有前者那么难学,也不像后者还需要搭配HTTP请求库才能使用。如果你手头需要临时抓取几个网页,那么requests-html就是你最好的选择。

调用本地html_requests-html:最简单的爬虫框架,看完你就会了相关推荐

  1. 网络爬虫笔记 :一个简单的爬虫框架

    学了两节课的 Python 爬虫,也算是入门了吧.敲了两天的案例代码之后,我突然发现,这些代码虽然功能不同,写法各异,但是终归是有章可循的,整体框架是一致的.所以我自己整理了一个简单的爬虫框架,适合初 ...

  2. aforge 相机标定_C#调用本地摄像头-AForge库简单使用

    介绍 用途 调用笔记本电脑自带的相机 示例 源码 using System; using System.Collections.Generic; using System.ComponentModel ...

  3. 连个字体反爬都搞不定?你还说你会爬虫?看完这篇就会了。

    随着互联网的发展,Python的崛起,很多网站经常被外面的爬虫程序骚扰,有什么方法可以阻止爬虫吗? 阻止爬虫也就称之为反爬虫,反爬虫涉及到的技术比较综合,说简单也简单,说复杂也复杂,看具体要做到哪种保 ...

  4. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  5. 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了

    现如今表情包几乎成了,我们手机聊天的必需品了.不过相比于普通表情包,大家更喜欢用GIF表情包,因为动图表情包不仅更加搞笑,而且能更形象的表达我们的情绪.比较有想法的朋友甚至想自己制作GIF表情包,但是 ...

  6. python如何编写爬虫_如何实现一个Python爬虫框架

    image 这篇文章的题目有点大,但这并不是说我自觉对Python爬虫这块有多大见解,我只不过是想将自己的一些经验付诸于笔,对于如何写一个爬虫框架,我想一步一步地结合具体代码来讲述如何从零开始编写一个 ...

  7. python-scrapy爬虫框架

    scrapy爬虫框架     1.Scrapy爬虫框架 scrapy 不是一个函数功能库,而是一个爬虫框架. scrapy爬虫框架: 爬虫框架是实现爬虫功能的一个软件结构和功能组件集合. .简单说爬虫 ...

  8. c语言实现爬虫功能,用C/C 扩展Python语言_python 调用c语言 python实现简单爬虫功能_python实现简单爬虫...

    用C/C 扩展Python语言 Python是一门功能强大的脚本语言,它的强大不仅表现在功能上,还表现在其扩展性上.她提供大量的API以方便程序员利用C/C++对Python进行扩展.因为执行速度慢几 ...

  9. 使用Scrapy爬虫框架简单爬取图片并保存本地(妹子图)

    使用Scrapy爬虫框架简单爬取图片并保存本地(妹子图) 初学Scrapy,实现爬取网络图片并保存本地功能 一.先看最终效果 保存在F:\pics文件夹下 二.安装scrapy 1.python的安装 ...

最新文章

  1. 剑指offer:面试题32 - II. 从上到下打印二叉树 II
  2. Android WebView与js交互通信
  3. 完美解答35K月薪的MySQL面试题(三)MySQL是如何实现事务的?
  4. 【译】IPFS — The Permanent, Distributed Web Continues…..
  5. NUMA的取舍与优化设置
  6. layui基础上的tree菜单动态渲染;
  7. java输入a控制台打印1_Java—— 流(Stream)、文件(File)和IO
  8. [undo]ip address ppp-negotiate
  9. iOS 开发笔记-plist使用
  10. java程序员简历范文
  11. vue清除路由历史记录
  12. 数字验证正则表达式大全
  13. 蒋鑫鸿:9,6国际黄金原油最新行情价格分析策略及今日投资操作建议
  14. php flv 转成 mp4,PHP 利用 ffmpeg 把flv转成MP4格式(Linux)
  15. linux 定时任务 非root,linux下的计划任务——只执行一次的定时任务,
  16. 一种更简单的求最小平方均值函数(MSE)的方法 -- 梯度下降法。
  17. Defcon China 靶场题 - 内网渗透Writeup
  18. Android实现PDF格式文件预览
  19. ## matplotlib.pyplot库的知识点之bar函数——绘制条形图
  20. 如何分库分表,怎样分库分表,为什么要分库分表?

热门文章

  1. 计算机书籍- 网络爬虫开发实战
  2. 南加大提出NeROIC:还有什么不能渲染的?重建效果太强悍了
  3. 基于激光雷达点云的3D目标检测算法—端到端多视图融合
  4. 视频|深度相机与应用
  5. 高维多元数据拟合回归如何进行???
  6. RDKit | 基于RDKit探索ChEMBL数据库中合成药物历史
  7. Drug Target Review | 开发一种算法来预测药物性肝损伤
  8. PyTorch | (2)PyTorch 入门-张量
  9. RDKit | 基于RDKit绘制化学反应
  10. 数据包是如何在网络中传输的