Skip to content

1. 常用的网络请求库

在Python中,进行网络请求的库主要分为同步和异步两大类。

  • 同步请求库:

    • urllib: Python的标准库之一,提供了一系列用于操作URL的功能。
    • requests: 第三方库,提供了更加方便的API来发送HTTP请求,是最受欢迎的HTTP客户端库之一。
  • 异步请求库:

    • aiohttp: 支持异步请求的库,使用asyncio进行网络通信,适合处理高并发需求。
    • httpx: 是一个全功能的HTTP客户端,支持HTTP/1.1和HTTP/2,并且同时支持同步和异步接口。

2. 优缺点及适用场景

  • urllib:

    • 优点: 标准库,不需要额外安装。
    • 缺点: API相对繁琐。
    • 适用场景: 简单的应用,或不想引入外部依赖时。
  • requests:

    • 优点: API简单易用,社区支持强大。
    • 缺点: 不支持异步。
    • 适用场景: 大多数HTTP请求场景,尤其是对性能要求不是非常高的同步程序。
  • aiohttp:

    • 优点: 支持异步,适合高并发场景。
    • 缺点: API相对复杂。
    • 适用场景: 需要处理大量并发连接的应用。
  • httpx:

    • 优点: 同时支持同步和异步API,支持HTTP/2。
    • 缺点: 相对较新,社区支持和稳定性正在增强中。
    • 适用场景: 需要同时使用同步和异步请求,或需要HTTP/2支持的应用。

3. Requests和httpx的使用

headers、cookies、auth、proxy这几种是我们日常爬虫过程中,经常需要使用的,下面分别基于request和httpx来展示如何使用

  • Requests:

    • Headers:

      python
      import requests
      response = requests.get('https://httpbin.org/get', headers={'User-Agent': 'My App'})
    • Cookies:

      python
      response = requests.get('https://httpbin.org/cookies', cookies={'session_id': '12345'})
    • 认证:

      python
      response = requests.get('https://httpbin.org/basic-auth/user/passwd', auth=('user', 'passwd'))
    • SSL证书验证:

      python
      response = requests.get('https://httpbin.org/get', verify='/path/to/certfile')
  • httpx:

    • Headers:

      python
      import httpx
      response = httpx.get('https://httpbin.org/get', headers={'User-Agent': 'My App'})
    • Cookies:

      python
      client = httpx.Client()
      client.cookies.set('session_id', '12345')
      response = client.get('https://httpbin.org/cookies')
    • 认证:

      python
      response = httpx.get('https://httpbin.org/basic-auth/user/passwd', auth=('user', 'passwd'))
    • SSL证书验证:

      python
      response = httpx.get('https://httpbin.org/get', verify='/path/to/certfile')

细心的你可能发现了,httpx和request的用法大差不差,是的没错。

httpx 的设计灵感来源于 requests,因此两者在用法上有很多相似之处。这是因为 httpx 的开发者希望提供一个类似于 requests 的简洁、易用的接口,同时又能够支持更多的功能和特性,比如对异步请求的支持以及对 HTTP/2 的原生支持。因此,如果您熟悉 requests 的用法,那么学习和使用 httpx 会变得非常容易和顺畅。

4. 入门示例

  • Requests示例:
python
import requests

response = requests.get('https://httpbin.org/get')
print(response.json())
  • httpx示例:
python
import httpx

response = httpx.get('https://httpbin.org/get')
print(response.json())

5. 实际业务逻辑示例

假设我们需要实现一个功能:向httpbin.org/post发送POST请求,提交一些数据,并接收响应。

  • 使用Requests:
python
import requests

data = {'name': '程序员阿江','email':'relakkes@gmail.com'}
response = requests.post('https://httpbin.org/post', data=data)
print(response.json())
  • 使用httpx(异步):
python
import httpx
import asyncio

async def post_data():
    data = {'name': '程序员阿江','email':'relakkes@gmail.com'}
    async with httpx.AsyncClient() as client:
        response = await client.post('https://httpbin.org/post', data=data)
        print(response.json())

asyncio.run(post_data())

6. 异步爬虫的趋势

Python3.7之后,随着asyncio库的成熟和普及,异步编程在Python中变得更加容易实现。异步爬虫可以同时发起和管理成百上千的网络请求,而不会阻塞主线程。这使得编写高性能的爬虫代码不再是难事,尤其是在数据采集、实时数据处理等领域,异步爬虫将会成为一种趋势。

7. 总结

在选择合适的网络请求库时,应考虑实际应用的需求:对于简单或不频繁的网络请求,可以选择urllibrequests;而在需要处理大量并发连接的场景下,则应考虑使用aiohttphttpx。随着Python异步编程的发展,未来异步爬虫无疑会在性能和效率上带来更多优势。