Reuqests-html教程

Reuqests-html

requests 作者开发,集成 pyppeteer。

最近爬虫遇到的情况是,爬取的网站使用JavaScript渲染的,网站爬取的结果只有一堆JS代码。之前遇到这种情况的处理办法是用Splash(一般是配合Scrapy),或者Selenium来爬取,介绍一下常用的模拟浏览器执行,来爬去js渲染页面的方法。

方法介绍
Selenium驱动Chrome、Firefox等浏览器爬取
Splinter依赖于Selenium、Flask
Spynner依赖于PyQt
pyppeteerpuppetter的Python版本
Splash常与Scrapy配合使用
requests-htmlrequests作者开发,集成pyppeteer

安装

pip install requests-html

基本使用

支持的特性

个人感觉最大的特点就是完整的JavaScrapt支持异步支持。因为Requests不支持异步,之前使用异步请求的时候使用的是aiohttp(链接)和Python中的协程(链接)配合使用。

  • 完整的JavaScript支持
  • CSS Selectors 选择
  • XPath Selectors
  • 模拟用户代理
  • 自动跟踪链接重定向
  • 链接池和cookie持久特性
  • 异步支持

获取页面

非异步

之前解析库都是专门的模块支持,我们需要把网页下载下来,然后传给HTMl解析库,而Requests-html自带这个功能,在爬取页面十分方便。

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
print(response.html.html)	# 获取页面内容

异步获取

自带异步请求方法

from requests_html import AsyncHTMLSession
from requests_html import HTMLSession
session = HTMLSession()
asession = AsyncHTMLSession()
async def get_qq():
	r = await asession.get('http://news.qq.com/')
async def get_toutiao():
	r = await asession.get('https://www.toutiao.com/')
result = session.run(get_qq, get_toutiao)   # 目前下载的版本并没有该功能

获取链接

links和absolute_links两个属性分别返回HTML对象所包含的所有链接和绝对链接(均不包含锚点):

response.html.links()
response.html.absolute_links()

获取元素

支持CSS和XPATH两种语法来选取HTML元素。

CSS选择器

    def find(self, selector: str = "*", *, containing: _Containing = None, clean: bool = False, first: bool = False, _encoding: str = None)
  • selector:要用的CSS选择器
  • clean:是否清理已发现的<script><style>标签的HTML。
  • contaning:返回该属性文本的标签
  • first:True 返回第一个元素,否则返回满足条件的元素列表。
  • _encoding:编码格式

Xpath选择器

xpath(self, selector: str, *, clean: bool = False, first: bool = False, _encoding: str = None) 
  • selector:要用的XPATH选择器
  • clean:是否清理已发现的<script><style>标签的HTML。
  • first:True 返回第一个元素,否则返回满足条件的元素列表。
  • _encoding:编码格式

元素内容

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
print(response.html.xpath('//*[@id="subHot"]/h2/a/text()')[0])
from requests_html import HTMLSession
session = HTMLSession()
response = session.get('http://news.qq.com/')
# print(response.html.xpath('//*[@id="subHot"]/h2/a/text()')[0])
print(response.html.search('美国{}个人')[0])    # 在页面搜索文字

JavaScript支持

就是在HTML结果上调用一下render函数,它会在用户目录(默认是~/.pyppeteer/)中下载一个chromium,然后用它来执行JS代码。

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
response.html.render()  # 不调用该方法无法获取标题
print(response.html.xpath('//*[@id="root"]/div/main/div/div[1]/div[1]/div[1]/div/div/div/div[2]/h2/div'))

render函数属性

def render(self, retries: int = 8, script: str = None, wait: float = 0.2, scrolldown=False, sleep: int = 0, reload: bool = True, timeout: Union[float, int] = 8.0, keep_page: bool = False):
  • retries:加载页面失败的次数
  • script:页面上需要执行的JS脚本
  • wait:加载页面的等待时间,防止超时
  • scrolldown:页面向下滚动的次数
  • sleep:在页面渲染之后的等待时间
  • reload:Flase页面不会从浏览器中加载,而是从内存中加载
  • keep_page:True 允许你用r.html.page访问页面

爬取知乎页面,并且模拟下滑页面。

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
response.html.render(scrolldown=4,sleep=5)
for name in response.html.xpath("//h2[@class='ContentItem-title']/a/text()"):
	print(name)

结果

如何用 Python 和 fast.ai 做图像深度迁移学习?
【Python】动手分析天猫内衣售卖数据,得到你想知道的信息!
60行代码爬取知乎神回复
【数据分析】手把手用Python教你分析运筹学薪资状况
我的python学习之路
Python中的格式化输出字符串
python中调用matlab
翻译 | 更快的Python(二)
[Pipeline] 在Anaconda下用Snakemake构建ChIP-seq流程(1)
数学推导+纯Python实现机器学习算法1:线性回归
什么人适合学习Django, 如何学习Django以及需要学习到什么程度可以找到工作?
Python入门向:Matplotlib自救指南篇,从此做图不求人(一)
Python系列——一笔画问题的算法研究
Python中的文件读写(二)
python 分析泰坦尼克号生还率
一个Tor代理绕过访问限制的典型案例
[ERROR] Snakemake的几个报错

异步请求

from requests_html import HTMLSession
session = HTMLSession()
response = session.get('https://www.zhihu.com/topic/19552832/hot')
await response.html.arender()

不带请求

from requests_html import HTML
doc = """<a href='https://httpbin.org'>"""
html = HTML(html=doc)
html.links
{'https://httpbin.org'}
### 如何使用 Python `requests` 库打印 HTTP 响应内容 要通过 Python 的 `requests` 库来打印 HTTP 响应的内容,可以通过访问响应对象中的属性完成此操作。以下是详细的说明: #### 1. 导入 `requests` 模块 在使用 `requests` 库之前,需要先导入该模块。 ```python import requests ``` #### 2. 发送 HTTP 请求 可以使用 `requests.get()` 或其他方法(如 `post`, `put`, `delete` 等)发送请求,并保存返回的响应对象。 ```python response = requests.get("https://www.example.com") ``` #### 3. 访问响应的状态码和原因短语 为了确认请求是否成功,通常会检查响应的状态码和原因短语。 - **状态码**: 使用 `.status_code` 属性获取。 - **原因短语**: 使用 `.reason` 属性获取。 ```python print(f"Status Code: {response.status_code}") # 打印状态码[^3] print(f"Reason Phrase: {response.reason}") # 打印原因短语 ``` #### 4. 处理响应头部信息 如果需要查看服务器返回的头部信息,则可通过 `.headers` 属性读取到字典形式的头部字段。 ```python for key, value in response.headers.items(): print(f"{key}: {value}") ``` 上述代码遍历了所有的键值对并逐一输出它们。 #### 5. 输出完整的响应体 根据实际需求可以选择不同的方式提取响应主体部分的数据: - 如果预期接收到的是文本型数据(比如 HTML 页面),可以直接调用 `.text` 方法; - 若目标资源是以二进制流的形式存在(像图片或者文件下载链接),则应该利用 `.content` 来取得原始字节序列; 下面分别展示两种情形下的实现方案: ##### (a). 对于纯文本类别的回复: ```python if 'Content-Type' in response.headers and 'text/html' in response.headers['Content-Type']: print(response.text[:50]) # 只显示前五十字符作为示范[^2] else: print("Response is not text-based.") ``` ##### (b). 针对多媒体素材的情况: ```python with open('output.bin', 'wb') as f: f.write(response.content) # 将整个内容写入本地磁盘上的新创建文件当中去[^4] ``` 以上就是关于怎样借助 python 中 request 工具包展现 http 协议下各种反馈详情的一个总结介绍[^1]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值