为什么FlickrAPI在返回爬取结果后出现长时间挂起无响应的问题?
问题原因
你代码中调用的flickr.walk()方法返回的是持续分页拉取结果的迭代器,当前逻辑仅在序号i小于目标数量n时处理数据,没有在收集到足够的目标URL后主动终止循环,迭代器会持续向Flickr接口请求后续分页的照片数据,直到遍历完全部匹配搜索条件的结果才会停止,这就是程序爬取到需要的URL后仍长时间停滞的核心原因。
修复方案
直接在循环中增加终止判断,收集到n条有效数据后立刻跳出循环即可,修改后的循环逻辑如下:
urls = [] for i, photo in enumerate(photos): # 收集到足够数量后直接终止循环,停止拉取后续分页数据 if i >= n: break try: # 构造图片URL url = photo.get('url_o') # 原始尺寸 if url is None: # 拼接大尺寸图片URL url = 'https://farm%s.staticflickr.com/%s/%s_%s_b.jpg' % \ (photo.get('farm'), photo.get('server'), photo.get('id'), photo.get('secret')) if download: download_uri(url, dir) urls.append(url) print('%g/%g %s' % (i, n, url)) except: print('%g/%g error...' % (i, n))
额外注意事项
- 你原代码中单独写的一行
download是无效语句,可以直接删除 - 如果修改后仍偶现卡顿,建议检查
download_uri函数是否添加了请求超时配置,避免下载单个文件时长时间无响应
内容的提问来源于stack exchange,提问作者Ravish Jha
相关产品推荐
相关产品推荐

