request-html
全面支持解析JavaScript!
CSS 选择器 (jQuery风格, 感谢PyQuery).
XPath 选择器, for the faint at heart.
自定义user-agent (就像一个真正的web浏览器).
自动追踪重定向.
连接池与cookie持久化.
令人欣喜的请求体验,魔法般的解析页面.
接触过爬虫用的最多的包无非就是requests, urllib包,我们在使用这些包的时候显示,用requests包去获取响应,然后再利用pyquery或者bs4,xpath再去整理提取我们需要是目标数据。也就是下面两步
import requests
from pyquery import PyQuery as pq #获取网页
html = requests.get()
#解析网页
doc = pq(html)
但是在 request-html 里只需要一步就可以完成,而且可以直接进行 js 渲染
requests的作者Kenneth Reitz 开发的requests-html 爬虫包 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,作者将Requests的简单,便捷,强大又做了一次升级。这里是github地址
安装:
pip install request-html
基本使用
from requests_html import HTMLSession # 获取请求对象
session = HTMLSession()
# 往新浪新闻主页发送 get 请求
sina = session.get('https://news.sina.com.cn')
# print(sina.status_code)
sina.encoding = 'utf-8' # 获取响应文本信息,与requests无区别
print(sina.text)
获取链接( links 与 absolute_links )
from requests_html import HTMLSession # 获取请求对象
session = HTMLSession()
jd = session.get('https://jd.com')
print(jd.html.links) # 若获取的链接中有相对路径
# 我们还可以通过 absolute_links 获取所有的绝对链接
print(jd.html.absolute_links)
CSS 选择器与 XPATH
requests-html 支持 CSS 选择器和 XPATH 两种语法选取 HTML 元素
首先先来看看CSS选择器语法,它需要使用HTML的 find 函数来查找元素。
from requests_html import HTMLSession session = HTMLSession()
url = 'https://www.qiushibaike.com/text'
通过 CSS 选择器选取一个 Element 对象
css选择器语法:http://www.w3school.com.cn/cssref/css_selectors.asp
CSS选择器示例:
- a
- a.someClass
- a#someID
- a[target=_blank]
# 获取响应数据对象
obj = session.get(url) # 通过 CSS 选择器选取一个 Element 对象
# 获取 id 为 content-left 的 div 标签,标签返回一个对象
content = obj.html.find('div#content-left', first=True)
获取一个Element对象内的文本内容
content_text = content.text
获取一个 Element 对象的完整的 HTML 内容
content_html = content.html
获取一个Element对象的所有attributes
content_attrs = content.attrs
获取Element对象内的指定的所有子Element对象,返回列表
a_list = content.find('a')
循环所有的 a 标签
a_list = content.find('a')
for a in a_list:
try:
# 获取a标签内所有属性的href属性 并拼接
href = a.attrs['href']
if href.startswith('/'):
url = 'https://www.qiushibaike.com' + href
print(url)
except:
pass
在获取的页面中通过search查找文本
{}大括号相当于正则的从头到后开始匹配,获取当中想要获取的数据
text = obj.html.search('把{}夹')[0] # 获取从 "把" 到 "夹" 字的所有内容
text = obj.html.search('把糗事{}夹')[0] # 获取从把子到夹字的所有内容
print(text)
支持 XPATH
xpath选择器语法:http://www.w3school.com.cn/xpath/index.asp
a_list = obj.html.xpath('//a') # 获取 html 内所有的 a 标签
for a in a_list:
try:
href = a.attrs['href']
# 若是// 开头的 url 都扔掉
if href.startswith('//'):
continue
elif href.startswith('/'):
print('https://www.qiushibaike.com' + href)
except:
pass
获取到只包含某些文本的Element对象(containing)
# 获取所有文本内容为幽默笑话大全_爆笑笑话_笑破你的肚子的搞笑段子 - 糗事百科 title标签
# 注意: 文本内有空格也必须把空格带上
title = obj.html.find('div', containing='后来')
print(title[0].text)
支持 JavaScript
下面就是重磅炸弹了!!!高能预警!!!
注意,当你第一次调用render()方法时,代码将会自动下载Chromium,并保存在你的家目录下(如:~/.pyppeteer/)。它只会下载这一次。
from requests_html import HTMLSession session = HTMLSession()
res = session.get('https://piaofang.maoyan.com/dashboard')
res.html.render()
print(res.text)
render函数还有一些参数,介绍一下(这些参数有的还有默认值,直接看源代码方法参数列表即可):
- retries: 加载页面失败的次数
- script: 页面上需要执行的JS脚本(可选)
- wait: 加载页面钱的等待时间(秒),防止超时(可选)
- scrolldown: 页面向下滚动的次数
- sleep: 在页面初次渲染之后的等待时间
- reload: 如果为假,那么页面不会从浏览器中加载,而是从内存中加载
- keep_page: 如果为真,允许你用r.html.page访问页面
如果
scrolldown和sleep都指定,那么程序会在暂停相应时间后,再往后翻页面(如:scrolldown=10, sleep=1)如果仅指定了
sleep,程序会暂停相应时间,再返回数据如果指定
script,他将会在运行时执行提供的JavaScript。如:script = """
() => {
return {
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight,
deviceScaleFactor: window.devicePixelRatio,
}
}
"""
返回一段JavaScript的返回值:
>>> r.html.render(script=script)
{'width': 800, 'height': 600, 'deviceScaleFactor': 1}
自定义 User-Agent
有些网站会使用 User-Agent 来识别客户端类型,有时候需要伪造UA来实现某些操作。
如果查看文档的话会发现HTMLSession上的很多请求方法都有一个额外的参数**kwargs,这个参数用来向底层的请求传递额外参数。
我们先向网站发送一个请求,看看返回的网站信息。
from requests_html import HTMLSession
# pprint 可以把数据打印的更整齐
from pprint import pprint
import json
get_url = 'http://httpbin.org/get' session = HTMLSession()
# 返回的是当前系统的 headers 信息
res = session.get(get_url)
pprint(json.loads(res.html.html)) # 可以在发送请求的时候更换 user-agent
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'
post_url = 'http://httpbin.org/get'
res = session.get(post_url, headers={'user-agent': ua})
pprint(json.loads(res.html.html))
模拟表单提交(POST)
HTMLSession 封装了一整套的HTTP方法,包括get、post、delete等, 对应HTTP中各个方法。
# 表单登录
res = session.post('http://httpbin.org/post', data={'username': 'santa', 'password': '123'})
pprint(json.loads(res.html.html))
''' # 打印结果
{'args': {},
'data': '',
'files': {},
'form': {'password': '123', 'username': 'santa'},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '27',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) '
'AppleWebKit/603.3.8 (KHTML, like Gecko) '
'Version/10.1.2 Safari/603.3.8',
'X-Amzn-Trace-Id': 'Root=1-5e40d021-0261ed6c9fbc7df0daf90e98'},
'json': None,
'origin': '117.153.8.82',
'url': 'http://httpbin.org/post'}
'''
async异步使用
requests-html内部就封装好了aynsc异步请求的功能,可以提高我们的爬虫效率
# 使用异步发送请求
async_session = AsyncHTMLSession()
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
async def get_taobao():
url = 'https://www.taobao.com/'
res = await async_session.get(url, headers={'user-agent': ua})
# print(res.html.links)
return res.html.xpath("//head/title/text()")[0] async def get_jd():
url = 'https://www.jd.com/'
res = await async_session.get(url)
# print(res.html.absolute_links)
return res.html.xpath("//head/title/text()")[0] start_time = time.time()
res = async_session.run(get_taobao, get_jd)
print(res)
print(time.time()-start_time) # 同步发送请求
session = HTMLSession() start_time = time.time()
res = session.get('https://www.jd.com')
print(res.html.links)
res = session.get('https://www.taobao.com')
print(res.html.absolute_links)
print('fd ',time.time()-start_time)
request-html的更多相关文章
- Concepts:Request 和 Task
当SQL Server Engine 接收到Session发出的Request时,SQL Server OS将Request和Task绑定,并为Task分配一个Workder.在TSQL Query执 ...
- 解决托管在Windows上的Stash的Pull request无法合并的问题
最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...
- Lesson 16 A polite request
Text If you park your car in the wrong place, a traffic policeman will soon find it. You will be ver ...
- 架构之路(九)Session Per Request
前面的两篇反应很差:没评论没赞.很伤心啊,为什么呢?搞得我好长一段时间都没更新了——呵呵,好吧,我承认,这只是我的借口.不过,还是希望大家多给反馈.没有反馈,我就只能猜了:前面两篇是不是写得太“粗”了 ...
- Nginx学习笔记(二) Nginx--connection&request
Nginx--connection&request 在Nginx中,主要包括了连接与处理两部分. connection 在src/core文件夹下包含有connection的源文件,Ngx_c ...
- 谈一谈Http Request 与 Http Response
写在前面的话:今天来总结一下http相关的request和response,就从以下几个问题入手吧. ======正文开始======== 1.什么是HTTP Request 与HTTP Respon ...
- Application Request Route实现IIS Server Farms集群负载详解
序言 随着公司业务的发展,后台业务就变的越来越多,然而服务器的故障又像月经一样,时不时的汹涌而至,让我们防不胜防.那么后台的高可用,以及服务器的处理能力就要做一个横向扩展的方案,以使后台业务持续的稳定 ...
- NodeJs+http+fs+request+cheerio 采集,保存数据,并在网页上展示(构建web服务器)
目的: 数据采集 写入本地文件备份 构建web服务器 将文件读取到网页中进行展示 目录结构: package.json文件中的内容与上一篇一样:NodeJs+Request+Cheerio 采集数据 ...
- NodeJs+Request+Cheerio 采集数据
目的:采集网站文章. 两个依赖项: request :https://github.com/request/request cheerio:https://github.com/cheeriojs/c ...
- request中getParameter和getAttribute的区别
整理一下getParameter和getAttribute的区别和各自的使用范围. (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方 ...
随机推荐
- cnpm - 解决 " cnpm : 无法加载文件 C:\Users\93457\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。有关详细信息 。。。 "
1.在win10 系统中搜索框 输入 Windos PowerShell选择 管理员身份运行 2,打开了powershell命令行之后,输入 set-ExecutionPolicy RemoteSig ...
- SSIS部署后执行失败,无法将保护的XML节点解密
将包属性中的 protectionLevel 设置成DontSaveSensitive 即可.
- 从ES6到ES10的新特性万字大总结
介绍ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)在标准ECMA-262中定义的脚本语言规范.这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实 ...
- SprintBoot学习(三)
Thymeleaf模板引擎 1.thymeleaf是一个Java类库,,他是xml/xhtml/html5的模板引擎可以作为view层 2.themeleaf基本语法 引入thymeleaf < ...
- GRE Over IPSec配置
路由器GRE over IPSec站点到站点VPN 问题分析:对于前面的经典的IPSec VPN的配置来说,兼容性较好,适合于多厂商操作的时候,但是这种经典的配置方式不适合在复杂的网路 ...
- Cisco AP-AP重置操作
Resetting to Default Settings Using the MODE Button/spanFollow these steps to reset the access point ...
- Codeforces Round #619 (Div. 2) B. Motarack's Birthday
Dark is going to attend Motarack's birthday. Dark decided that the gift he is going to give to Motar ...
- spring boot 配置时区差别
前提 数据库时区:GMT+8 show variables like '%time_zone%'; 本机电脑时区: 情景一.不指定时区 传递的参数映射到Data不指定时区,连接数据库不指定时区,保存时 ...
- HD Tune检查硬盘各参数的含义
01 =Read Error Rate / (底层)数据读取错误率指从磁盘表面读取数据时发生的硬件读取错误的比率,Raw值对于不同的厂商有着不同的体系,单纯看做1个十进制数字是没有任何意义的.以上为W ...
- MyBatis映射器(转载)
什么是MyBatis映射器? MyBatis框架包括两种类型的XML文件,一类是配置文件,即mybatis-config.xml,另外一类是映射文件,例如XXXMapper.xml等.在MyBatis ...