httpx库的使用

针对某些网站使用HTTP/2.0协议,requests库是无法抓取数据的,这时就需要使用支持HTTP2.0的请求库,比如httpx

一、安装

pip3 install httpx

二、常规API

import httpx

url = 'http://www.httpbin.org/get'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}

res = httpx.get(url, headers=headers)

print(res.status_code)  # 状态码
print(res.text) # 响应体文本内容
print(res.content) # 响应体二进制内容
print(res.json()) # 将Json文本转换为dict类型
print(res.headers) # 响应头,是Headers对象,可像字典一样操作,比如:res.headers.get('content-type')
print(res.http_version)  # httpx所特有的api,返回协议版本,比如:HTTP/1.1

三、Client对象

  • httpx默认使用的是HTTP/1.1,要想支持HTTP/2.0,需要声明Client对象,并显示地将http2参数设置为True
  • 在声明Client对象时,还可以指定一些参数,比如headers,这样使用该对象所发起的所有请求都会默认携带这些参数配置
  • 代理的设置:
    • 不同于requests,键名需要更改为'http://'和'https://'
      # 无验证
      proxies1 = {
          'http://': 'http://ip:port',
          'https://': 'https://ip:port'
      }
      
      # 有验证
      proxies2 = {
          'http://': 'http://用户名:密码@ip:port',
          'https://': 'https://用户名:密码@ip:port'
      }
  • 示例(https://spa16.scrape.center/,该网站协议均采用的h2,使用requests会报错)
    import httpx
    
    url = 'https://spa16.scrape.center/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
    }
    proxies = {
        'http://': 'http://用户名:密码@ip:port',
        'https://': 'https://用户名:密码@ip:port'
    }
    with httpx.Client(http2=True, headers=headers, proxies=proxies) as client:
        res = client.get(url)
        print(res.status_code) # 200
        print(res.http_version) # HTTP/2
        print(res.text) # 正常响应的文本内容

四、AsyncClient对象

  • httpx还支持异步请求客户端,支持Python的async请求模式,需要使用AsyncClient对象
    import asyncio
    import httpx
    
    url = 'https://spa16.scrape.center/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
    }
    
    async def fetch(url):
        async with httpx.AsyncClient(http2=True, headers=headers) as client:
            res = await client.get(url)
            print(res.status_code)  # 200
            print(res.http_version)  # HTTP/2
            print(res.text)  # 正常响应的文本内容
    
    asyncio.get_event_loop().run_until_complete(fetch(url))

     

posted @ 2022-12-08 22:27  eliwang  阅读(251)  评论(0编辑  收藏  举报