Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python3.x、socket.gaierror、getaddrinfo中,取消存储大型数据集的URL失败_Python_Url_Python Requests_Urllib - Fatal编程技术网

在Python3.x、socket.gaierror、getaddrinfo中,取消存储大型数据集的URL失败

在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

在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/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/']

"""