gpt4 book ai didi

Python:如何使用 urllib2 和 pool.map 知道哪个 URL 失败?

转载 作者:行者123 更新时间:2023-11-30 22:38:15 38 4
gpt4 key购买 nike

我正在尝试同时调用 3 个 URL 并记录所有错误。这是我的示例代码:

urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"];

try:
results = pool.map(urllib2.urlopen, urls);
except URLError:
urllib2.urlopen("https://example.com/log_error/?url="+URLError.url);

我只是想知道哪些 URL(如果有)因调用 /log_error/ URL 而出错。但是,当我有这样的代码时,我收到一条错误消息,指出 URLError 未定义。

我的代码顶部确实有这些导入:

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool

这是我的整个错误响应(这是使用 AWS Lambda,无论它的值(value)是什么)

{
"stackTrace": [
[
"/var/task/lambda_function.py",
27,
"lambda_handler",
"except Error as e:"
]
],
"errorType": "NameError",
"errorMessage": "global name 'URLError' is not defined"
}

如何捕获错误 URL,以便知道它们是什么?

更新

我发现:URLError 所属的 urllib.error 类就是:urllib不是 urllib2

此文档页面的顶部解释说:https://docs.python.org/2/library/urllib2.html

这是我实际得到的更详细的 HTTPError 对象: https://docs.python.org/2/library/urllib2.html#urllib2.HTTPError

尽管如此,错误 URL 本身的问题仍然存在...目前我无法识别哪个 URL 是错误的。

更新2

显然 str(e.url) 就是我所需要的。我没有找到任何关于此的文档;这纯粹是我的幸运猜测。

这就是现在的工作代码:

urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"];

try:
results = pool.map(urllib2.urlopen, urls);
except Exception as e:
urllib2.urlopen("https://example.com/log_error/?url="+str(e.url)+"&code="+str(e.code)+"&reason="+e.reason;

更新3

感谢@mfripp informing me about the dangers of pool.map我再次将此代码修改为:

def my_urlopen(url):
try:
return urllib2.urlopen(url)
except URLError:
urllib2.urlopen("https://example.com/log_error/?url="+url)
return None

def lambda_handler(event, context):

urls = [
"https://example.com/gives200.php",
"https://example.com/alsogives200.php",
"https://example.com/gives500.php"
];

results = pool.map(urllib2.urlopen, urls);

return urls;

最佳答案

我不确定异常对象是否会向您提供失败 URL 的详细信息。如果没有,您需要使用 trycatch 包装对 urllib2.urlopen(url) 的每个调用。你可以这样做:

urls = [
"https://example.com/gives200.php",
"https://example.com/alsogives200.php",
"https://example.com/gives500.php"
]

def my_urlopen(url):
try:
return urllib2.urlopen(url)
except URLError:
urllib2.urlopen("https://example.com/log_error/?url="+url)
return None

results = pool.map(my_urlopen, urls)
# At this point, any failed requests will have None as their value

关于Python:如何使用 urllib2 和 pool.map 知道哪个 URL 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43643380/

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