在Python3.x、socket.gaierror、getaddrinfo中,取消存储大型数据集的URL失败
在Windows10上使用Python3.6,我试图计算一列URL。 我有一个带有一列URL的csv文件。其中一些是缩写的.url。如果您想复制结果,可以为这些URL创建一个包含一列的csv文件:在Python3.x、socket.gaierror、getaddrinfo中,取消存储大型数据集的URL失败,python,url,python-requests,urllib,Python,Url,Python Requests,Urllib,在Windows10上使用Python3.6,我试图计算一列URL。 我有一个带有一列URL的csv文件。其中一些是缩写的.url。如果您想复制结果,可以为这些URL创建一个包含一列的csv文件: external_urls http##://rviv.ly/NdL.. http##://rviv.ly/kDH.. http##://rviv.ly/GA7.. http##://rviv.ly/zCZ... http##://rviv.ly/46HW... http://bit####ly/2G
external_urls
http##://rviv.ly/NdL..
http##://rviv.ly/kDH..
http##://rviv.ly/GA7..
http##://rviv.ly/zCZ...
http##://rviv.ly/46HW...
http://bit####ly/2GzanWa # replace the '###' with '.' Links to https://www.careerarc.com/job-search/linquest-corporation-jobs.html?listing_not_found=true
https##://www.sec.gov/news/press-release/2018-41
我的实际表非常大,大约有100000多个URL需要评估。下面的代码似乎出现了不一致的崩溃(将验证这一点,但我发誓昨晚我得到了不同的失败行)。它给出了下面的错误
错误回溯:
\lib\socket.py", line 745, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed
我的代码
import http.client
from urllib.parse import urlparse
print("calculating most frequent url domains")
df = pd.read_csv(PATH_TO_Hq_CSV)
clean_url_lst = []
domain_lst = []
domain_dict = {}
for urls_ in df['external_url']:
print(urls_)
if str(urls_) == "nan":
continue
else:
o = unshorten_url(str(urls_))
print("URL: \t", str(o)) # still prints the shortened url
def unshorten_url(url):
parsed = urlparse(url)
h = http.client.HTTPConnection(parsed.netloc)
h.request('HEAD', parsed.path) # error traces to this line
response = h.getresponse()
if response.status/100 == 3 and response.getheader('Location'):
return response.getheader('Location')
else:
return url
这个错误意味着什么
我想,除非我能找到解决此错误的通用方法,否则我将无法在Python3中取消存储URL。为什么不试试这个方法呢
也许您应该放置一个try-except块,看看是哪个url导致了错误。老实说,解析那个数量的URL需要很多时间。我添加了一个try-except块,还调整了代码,以便它使用其他答案中提到的请求包。所以我清楚地看到了时间问题。。。它有很多URL。我认为我能做的最好的事情就是创建一个程序,设置一个计时器几秒钟,以评估
requests.get(url)
调用需要多长时间。如果requests.get调用花费的时间太长,那么我可以将该行添加到跳过行的列表中,稍后再尝试处理它们?或者您可以将整个URL集划分为多个子集,然后并行处理它们。它可以使用多个线程来完成,或者如果你有多台机器,它可能会更好。我已经用多线程处理了几次,通常在C和C++中,而不是Python,所以我试图避免它。我将查找指南,但是有没有什么快速的技巧可以给那些从未在python中使用过多线程的人呢?这里的说明似乎很清楚。创建我的url的子集,然后通过多线程允许每个子集。。。。这是否意味着每个线程都会得到一个子集,或者其他什么?我更改了代码,但是,您仍然会在某些时候突然遇到前面提到的错误,socket.gaierro getaddrinfo失败
。如果有人能告诉我这个错误消息的意思,那会很有帮助。那个url一定是无效的。把它放到你的浏览器里,看看会发生什么。查看我的更新
import requests
url = 'http://fb.com'
try:
response = requests.get(url)
except Exception as e:
print('Bad url {url}. {e}'.format(url=url, e=e))
print(response.url)
print([redirect.url for redirect in response.history])
"""
# Output
>> https://www.facebook.com/
>> ['http://fb.com/', 'https://fb.com/']
"""