python接口自动化28-requests-html爬虫框架

前言

requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html。之前解析html页面用过了lxml和bs4,
requests-html集成了一些常用爬虫库的优点,依然是为人类服务:HTML Parsing for Humans。
目前只支持python3.6

环境准备

requests-html的GitHub地址https://github.com/kennethreitz/requests-html,使用pip就能直接安装了。

pip install requests-html

该库旨在使解析HTML(例如,抓取Web)尽可能简单直观, 有以下优势:

  • 完整的JavaScript支持!

  • CSS Selectors(又名jQuery风格,感谢PyQuery)。

  • XPath Selectors,对于胆小的人来说。

  • 模拟用户代理(如真实的Web浏览器)。

  • 自动跟踪重定向。

  • 连接池和cookie持久性。

  • 令人欣喜的请求体验,具有神奇的解析能力。

  • 异步支持

抓页面url地址

先发个get请求,返回response对象,通过r.html.links获取页面的全部链接,包含一些相对路径的地址,如果只想获取绝对路径的地址,可以用r.html.absolute_links

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://python.org/')

# 获取页面上的所有链接
all_links = r.html.links
print(all_links)

# 绝对路径链接
all_absolute_links = r.html.absolute_links
print(all_absolute_links)

运行结果, 返回内容太多,省略了一部分:

{'http://pycon.blogspot.com/', '/community/', 'http://python.org/dev/peps/', '/events/python-events/831/', , 'http://www.scipy.org'}
{'http://pycon.blogspot.com/', 'https://www.python.org/dev/', 'https://wiki.qt.io/PySide', 'https://www.python.org/events/python-events/817/'}

从返回的结果可以看出,返回的是set集合,会自动的去除重复的链接地址

xpath定位

用过lxml库的小伙伴应该知道https://www.cnblogs.com/yoyoketang/p/9661273.html,lxml可以支持xpath查找元素对象,requests-html也可以完美的支持xpath

接下来我需要获取目标网站:https://www.cnblogs.com/yoyoketang/tag/django/, 获取所有的文章标题,xpath语法:.//*[@id=’myposts’]/div/div/a

参考代码

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
# 只获取第一个
f = r.html.xpath(".//*[@id='myposts']/div/div/a", first=True).text
print(f)

# 获取全部
all = r.html.xpath(".//*[@id='myposts']/div/div/a")
for i in all:
print(i.text) # 获取文本
print(i.absolute_links) # 获取链接

运行结果

python测试开发django-49.allow_tags和mark_safe
python测试开发django-49.allow_tags和mark_safe
{'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
python测试开发django-48.xadmin上传图片django-stdimage
{'https://www.cnblogs.com/yoyoketang/p/10655601.html'}
python测试开发django-47.xadmin上传图片和文件
{'https://www.cnblogs.com/yoyoketang/p/10653878.html'}

xpath方法返回是一个list,加上 first=True参数返回第一个结果

css定位支持

requests-html同样支持CSS Selector的方法,把上面案例用css定位也可以实现同样效果

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
# 只获取第一个 css语法
f = r.html.find(".PostList>div>a", first=True).text
print(f)

# 获取全部 css语法
all = r.html.find(".PostList>div>a")
for i in all:
print(i.text) # 获取文本
print(i.absolute_links) # 获取链接

其它方法

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')

about = r.html.find(".PostList>div", first=True)

# 1.获取文本
print(about.text)

# 2.获取html内容
print(about.html)

# 3.获取全部属性
print(about.attrs)

# 4.获取链接
print(about.absolute_links )

# 5.搜索文字
print(about.search('python测试开发{}和mark_safe')[0])

# 6.继续定位子元素
print(about.find('a')) # 返回list element对象

# 7.containing 模糊匹配 只包含'django'文本的对象
a = about.find('a', containing='django')
print(a)

运行结果

python测试开发django-49.allow_tags和mark_safe
<div class="postTitl2"><a href="https://www.cnblogs.com/yoyoketang/p/10659137.html" id="PostsList1_rpPosts_TitleUrl_0">python测试开发django-49.allow_tags和mark_safe</a></div>
{'class': ('postTitl2',)}
{'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
django-49.allow_tags
[<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>]
[<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>]

这些只是一些基本的功能,requests-html还可以支持JavaScript渲染页面,看下一篇python接口自动化29-requests-html支持JavaScript渲染页面

2019年《python3接口自动化》课程3月17-4月14开课
主讲老师:上海-悠悠
上课方式:QQ群视频在线教学
上课时间:每周六、周日晚上20:30-22:30
报名费:1000

(0)

相关推荐

  • Python爬虫 | 爬虫基础入门看这一篇就够了

    大家好,今天我们来聊聊Python爬虫的基础操作,反正我是这样入门了,哈哈. 其实,一开始学python的时候,我是冲着数据处理分析去了,那个pandas什么的.后来,发现爬虫挺好玩,可以解决纯手工采 ...

  • python接口自动化40-盘点requests那些不常用(面试经常问)的高级技能

    前言 如果面试问你如何用 python 发 get/post 请求? 这种问题只要是个小白花10分钟随便看下博客都能学得会. 面试官如果知道你是资深的,还是初级的呢?面试其实最喜欢考那些你不常用的功能 ...

  • python接口自动化1-发送get请求

    前言 requests模块,也就是老污龟,为啥叫它老污龟呢,因为这个官网上的logo就是这只污龟,接下来后面的自动化都离不开它. 一.环境安装 1.用pip安装requests模块 >>p ...

  • python接口自动化2-发送post请求

    前言 发送post的请求参考例子很简单,实际遇到的情况却是很复杂的,首先第一个post请求肯定是登录了,但登录是最难处理的.登录问题解决了,后面都简单了. 一.查看官方文档 1.学习一个新的模块,其实 ...

  • python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? 一.session简介 1.查看帮助文档,贴了一部分,后面省略了 >>im ...

  • python接口自动化4-绕过验证码登录(cookie)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  • python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  • python接口自动化6-重定向(Location)

    前言 某屌丝男A鼓起勇气向女神B打电话表白,女神B是个心机婊觉得屌丝男A是好人,不想直接拒绝于是设置呼叫转移给闺蜜C了,最终屌丝男A和女神闺蜜C表白成功了,这种场景其实就是重定向了. 一.重定向 1. ...

  • python接口自动化7-参数关联

    前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 一.删除草稿箱 1.我们前面讲过登录后保存草稿箱, ...

  • python接口自动化8-参数化

    前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死! 一.登录函数 1. ...