<p>当状态代码为时,“asks”并不总是引发异常!= 200. 在使用响应的内容之前,需要检查其状态代码。您可能还需要增加超时时间,2秒是不够的,特别是当您并行启动多达50个连接时。你知道吗</p>
<p>在任何情况下,这里有一个简化的程序-所有这些Goose的东西对于显示实际的错误都是完全不必要的,两个结果数组不是一个好主意,向结果数组添加错误消息看起来是失败的。你知道吗</p>
<p>您还应该研究并行运行URL获取和处理。<code>trio.open_memory_channel</code>是你的朋友。你知道吗</p>
<pre><code>
import asks
asks.init('trio')
import trio
from pprint import pprint
async def extractor(path, session, results):
try:
r = await session.get(path, timeout=2)
if r.status_code != 200:
raise asks.errors.BadStatus("Not OK",r.status_code)
out = r.content
except Exception as e:
# do some reasonable error handling
print(path, repr(e))
else:
results.append((out, path))
async def main(path_list, session):
results = []
async with trio.open_nursery() as n:
for path in path_list:
n.start_soon(extractor, path, session, results)
return results
async def run(conns=50):
s = asks.Session(connections=conns)
urls = [
"http://www.mining.com/web/tesla-fires-sound-alarms-safety-electric-car-batteries",
"http://www.mining.com/canalaska-start-drilling-west-mcarthur-uranium-project",
"https://www.google.com", # just for testing more parallel connections
"https://www.debian.org",
]
results = await main(urls, s)
for content, path in results:
pass # analyze this result
print("OK")
if __name__ == "__main__":
trio.run(run)
</code></pre>