gpt4 book ai didi

python - 了解请求与 grequests

转载 作者:太空狗 更新时间:2023-10-29 18:30:13 26 4
gpt4 key购买 nike

我正在处理一个基本上如下的过程:

  1. 获取一些 url 列表。
  2. 获取Response每个人的对象。
  3. 从每个 Response 的 text 创建一个 BeautifulSoup 对象。
  4. 从 BeautifulSoup 对象中提取特定标签的文本。

根据我的理解,这似乎是 grequests 的理想选择:

GRequests allows you to use Requests with Gevent to make asynchronous HTTP Requests easily.

但是,这两个进程(一个有请求,一个有 grequests)似乎给我带来了不同的结果,grequests 中的一些请求返回 None 而不是响应。

使用请求

import requests

tickers = [
'A', 'AAL', 'AAP', 'AAPL', 'ABBV', 'ABC', 'ABT', 'ACN', 'ADBE', 'ADI',
'ADM', 'ADP', 'ADS', 'ADSK', 'AEE', 'AEP', 'AES', 'AET', 'AFL', 'AGN',
'AIG', 'AIV', 'AIZ', 'AJG', 'AKAM', 'ALB', 'ALGN', 'ALK', 'ALL', 'ALLE',
]

BASE = 'https://finance.google.com/finance?q={}'

rs = (requests.get(u) for u in [BASE.format(t) for t in tickers])
rs = list(rs)

rs
# [<Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# ...
# <Response [200]>]

# All are okay (status_code == 200)

使用 grequest

# Restarted my interpreter and redefined `tickers` and `BASE`
import grequests

rs = (grequests.get(u) for u in [BASE.format(t) for t in tickers])
rs = grequests.map(rs)

rs
# [None,
# <Response [200]>,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>,
# <Response [200]>]

为什么结果不同?

更新:我可以按如下方式打印异常类型。相关讨论here但我不知道发生了什么。

def exception_handler(request, exception):
print(exception)

rs = grequests.map(rs, exception_handler=exception_handler)

# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)
# ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)

系统/版本信息

  • 请求:2.18.4
  • 请求:0.3.0
  • python :3.6.3
  • urllib3: 1.22
  • pyopenssl: 17.2.0
  • 全部通过 Anaconda
  • 系统:Mac OSX HS 和 Windows 10 上的相同问题,build 10.0.16299

最佳答案

您发送请求的速度太快了。由于 grequests 是一个异步库,所有这些请求几乎都是同时发送的。他们太多了。

你只需要通过grequests.map(rs, size=your_choice)来限制并发任务,我测试过grequests.map(rs, size=10)它运作良好。

关于python - 了解请求与 grequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46205491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com