gpt4 book ai didi

python - urllib2 urlopen 读取超时/ block

转载 作者:太空宇宙 更新时间:2023-11-03 15:21:49 24 4
gpt4 key购买 nike

最近我正在开发一个用于在 url 上下载图像的小型爬虫。

我在 urllib2 中使用 openurl() 和 f.open()/f.write():

这是代码片段:

# the list for the images' urls
imglist = re.findall(regImg,pageHtml)

# iterate to download images
for index in xrange(1,len(imglist)+1):
img = urllib2.urlopen(imglist[index-1])
f = open(r'E:\OK\%s.jpg' % str(index), 'wb')
print('To Read...')

# potential timeout, may block for a long time
# so I wonder whether there is any mechanism to enable retry when time exceeds a certain threshold
f.write(img.read())
f.close()
print('Image %d is ready !' % index)

在上面的代码中,img.read()可能会阻塞很长时间,我希望在这个问题下做一些重试/重新打开图片url操作。

我也比较关心上面代码的效率,如果要下载的图片数量比较多,用线程池下载好像比较好。

有什么建议吗?提前致谢。

附注我发现 img 对象上的 read() 方法可能会导致阻塞,因此单独向 urlopen() 添加超时参数似乎没有用。但是我发现文件对象没有超时版本的 read()。对此有什么建议吗?非常感谢。

最佳答案

urllib2.urlopen有一个 timeout 参数,用于所有阻塞操作(连接建立等)

此片段摘 self 的一个项目。我使用线程池一次下载多个文件。它使用 urllib.urlretrieve 但逻辑是相同的。 url_and_path_list(url, path) 元组的列表,num_concurrent 是要生成的线程数, skip_existing 跳过文件系统中已存在的文件的下载。

def download_urls(url_and_path_list, num_concurrent, skip_existing):
# prepare the queue
queue = Queue.Queue()
for url_and_path in url_and_path_list:
queue.put(url_and_path)

# start the requested number of download threads to download the files
threads = []
for _ in range(num_concurrent):
t = DownloadThread(queue, skip_existing)
t.daemon = True
t.start()

queue.join()

class DownloadThread(threading.Thread):
def __init__(self, queue, skip_existing):
super(DownloadThread, self).__init__()
self.queue = queue
self.skip_existing = skip_existing

def run(self):
while True:
#grabs url from queue
url, path = self.queue.get()

if self.skip_existing and exists(path):
# skip if requested
self.queue.task_done()
continue

try:
urllib.urlretrieve(url, path)
except IOError:
print "Error downloading url '%s'." % url

#signals to queue job is done
self.queue.task_done()

关于python - urllib2 urlopen 读取超时/ block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13747964/

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