【月更19篇】2022年一个比requests更时髦的爬虫库,一学就会

举报
梦想橡皮擦 发表于 2022/03/25 11:44:29 2022/03/25
【摘要】 📢📢📢📢📢📢哈喽!大家好,我是 【梦想橡皮擦】,10年产研经验,致力于 Python 相关技术栈传播💗🌻本文如果觉得不错,动动小手点个赞赞吧👍🌻本文如果发现错误,欢迎在评论区中指正哦💗👍 技术博客日更者,我喜欢写文章,如果任意一篇文章对你有帮助,就挺好的~ 👍📣📣📣📣📣📣📆 最近更新:2022年3月25日,橡皮擦的第 597 篇原创博客本篇博客是《Py...

📢📢📢📢📢📢
哈喽!大家好,我是 【梦想橡皮擦】,10年产研经验,致力于 Python 相关技术栈传播💗
🌻本文如果觉得不错,动动小手点个赞赞吧👍
🌻本文如果发现错误,欢迎在评论区中指正哦💗
👍 技术博客日更者,我喜欢写文章,如果任意一篇文章对你有帮助,就挺好的~ 👍
📣📣📣📣📣📣

📆 最近更新:2022年3月25日,橡皮擦的第 597 篇原创博客

本篇博客是《Python爬虫120》专栏中的模块篇,核心要进行展示的模块是 httpx ,本文将对其进行细致的拆分讲解。

⛳️ 准备工作

任何模块学习前,都需要执行下述两个步骤

  1. 模块简介
  2. 模块安装
  3. 帮助手册的准备

HTTPX 是最近接触到的一个 Python 请求模块,其特点如下所示

  1. 兼容 requests,语法类似
  2. 支持 HTTP/1.1 和 HTTP/2
  3. 严格超时设置
  4. 全类型注释
  5. ……

目前最新的版本是 0.22 版本,官方简介如下

HTTPX is a fully featured HTTP client library for Python 3. It includes an integrated command line client, has support for both HTTP/1.1 and HTTP/2, and provides both sync and async APIs.

模块安装使用如下命令即可

pip install httpx

官网与项目地址为

⛳️ 简单上手

接下来编写一个采集 example 网站的案例,代码如下所示

import httpx

r = httpx.get('https://www.example.org/')
print(r)  # 响应对象
print(r.status_code)  # 状态码
print(r.text)  # 响应内容
print(r.content)  # 响应二进制
# print(r.json())  # 响应JSON

这样看起来与 requests 模块用法非常类似。

接下来我们拿 `` 站点做一下 HTTP 动词相关测试

import httpx

r = httpx.put('https://httpbin.org/put', data={'name': '橡皮擦'})
print("*** put ***")
print(r.text)
r = httpx.delete('https://httpbin.org/delete')
print("*** delete ***")
print(r.text)
r = httpx.head('https://httpbin.org/get')
print("*** head ***")
print(r)
r = httpx.options('https://httpbin.org/get')
print("*** options ***")
print(r)

⛳️ get 请求携带参数

既然类似 requests,那我们直接模拟写一下基本使用,同时下述代码也增加了请求头配置。

import httpx

get_param_data = {'name': '梦想橡皮擦'}
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) ……'
}
response = httpx.get(url='http://www.httpbin.org/get', params=get_param_data, headers=headers)
print(response.text)

⛳️ 类 requests 的Session 用法

httpx 中也存在 Session 类似的用法,测试代码如下所示:

import httpx

client = httpx.Client()  # 类 requests.Session()
try:
    r = client.get(url='http://www.httpbin.org/get')
    print(r.text)
finally:
    client.close()

同样也可以使用 with 上下文语句进行展示

import httpx

client = httpx.Client()  # 类 requests.Session()
with httpx.Client() as client:
    r = client.get('https://example.com')
    print(r)

⛳️ 支持异步调用

之前我们使用 asyncioaiohttp 实现异步调用,有了 httpx 之后,可以直接使用其自带的异步调用代码,具体如下所示

import asyncio
import httpx

async def main():
    async with httpx.AsyncClient() as client:
        resp = await client.get('http://httpbin.org/get')
        assert resp.status_code == 200
        html = resp.text
        print(html)

loop = asyncio.get_event_loop()
try:
    loop.run_until_complete(main())
finally:
    loop.close()

异步请求的发送使用 httpx.AsyncClient()

⛳️ 请求中的其它参数

自定义 headers
在请求中增加头文件配置

headers = {"key":"value"}
r = httpx.get("http://httpbin.org/get", headers=header)

超时时间
httpx 默认超时时间为 5 秒,通过 timeout 可以进行修改

r = httpx.get("http://httpbin.org/get", timeout=3)

该时间还可以通过 httpx.Timeout 类实现,可以细致设置 connectreadwritepool 超时时间。

timeout = httpx.Timeout(5,read=10)

SSL证书
使用参数 verify 进行证书设置,也可以使用标准库 ssl 进行设置。
当然禁用SSL验证与 requests 一致,使用下述代码

httpx.get('http://httpbin.org/get', verify=False)

⛳️ 参数传递

查询参数

params = {"name":"橡皮擦", "age":18}
httpx.get('http://httpbin.org/get', params=params)

Form表单

data = {"name":"橡皮擦", "age":18}
httpx.get('http://httpbin.org/get', data = data)

文件上传

f = open('a.txt', 'rb')
files = {'file': f}
response = httpx.post('http://xxxxx', files=files)
f.close()

JSON传递

data = {"name":"橡皮擦", "age":18}
response = httpx.post('http://xxxxx', json=data )

二进制数据

content = b'橡皮擦'
response = httpx.post('http://xxxxx', content=content)

⛳️ 响应内容

httpx 模块返回的响应请求有
文本响应

response.text

二进制响应

response.content

JSON响应

response.json()

流式响应
迭代字节

response.iter_bytes()

迭代文本

response.iter_text()

迭代行

response.iter_lines()

原始字节

response.iter_raw()

📣📣📣📣📣📣
🌻本文如果发现错误,欢迎在评论区中指正哦💗
<<<上一篇 📖系列目录 下一篇>>>

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。