我正在使用一个基本如下的过程:
拿一些网址列表.
Response
从每个人获取一个对象.
从text
每个Response 创建一个BeautifulSoup对象.
从该BeautifulSoup对象中拉出某个标签的文本.
根据我的理解,这对于问候来说似乎是理想的:
GRequests允许您使用带有Gevent的请求来轻松地进行异步HTTP请求.
但是,这两个进程(一个有请求,一个有grequests)似乎让我得到了不同的结果,其中一些请求在grequest中返回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
# [,
# ,
# ,
# ,
# ,
# ,
# ...
# ]
# All are okay (status_code == 200)
使用grequests
# 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,
# ,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# None,
# ,
# ,
# ,
# ,
# ,
# ,
# ,
# ,
# ,
# ,
# ,
# ]
为什么结果有差异?
更新:我可以按如下方式打印异常类型.相关讨论在这里,但我不知道发生了什么.
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上的相同问题,版本10.0.16299
Sraw..
5
您只是发送请求太快.与grequests
异步库一样,所有这些请求几乎都是同时发送的.他们太多了.
您只需要限制并发任务grequests.map(rs, size=your_choice)
,我已经测试过grequests.map(rs, size=10)
并且运行良好.
1> Sraw..:
您只是发送请求太快.与grequests
异步库一样,所有这些请求几乎都是同时发送的.他们太多了.
您只需要限制并发任务grequests.map(rs, size=your_choice)
,我已经测试过grequests.map(rs, size=10)
并且运行良好.