请参阅下面的代码示例版本,该代码使用Scrapy Image Pipeline从网站下载/抓取图像:
import scrapy
from scrapy_splash import SplashRequest
from imageExtract.items import ImageextractItem
class ExtractSpider(scrapy.Spider):
name = 'extract'
start_urls = ['url']
def parse(self, response):
image = ImageextractItem()
titles = ['a', 'b', 'c', 'd', 'e', 'f']
rel = ['url1', 'url2', 'url3', 'url4', 'url5', 'url6']
image['title'] = titles
image['image_urls'] = rel
return image
一切正常,但根据默认设置,避免下载重复项。有没有办法覆盖这个,以便我也可以下载重复项?感谢。
答案 0 :(得分:1)
感谢Tomáš的指示,最终我找到了下载重复图像的方法。
在_process_request
课程的MediaPipeline
中,我会对这些行进行评论。
# Return cached result if request was already seen
# if fp in info.downloaded:
# return defer_result(info.downloaded[fp]).addCallbacks(cb, eb)
# Check if request is downloading right now to avoid doing it twice
# if fp in info.downloading:
# return wad
会发生未捕获的KeyError,但它似乎不会影响我的结果,所以我停止了进一步挖掘。
答案 1 :(得分:0)
我认为一种可能的解决方案是使用重写方法scrapy.pipelines.images.ImagesPipeline
创建自己继承自get_media_requests
的图像管道(例如,请参阅documentation)。在产生scrapy.Request
的同时,将dont_filter=True
传递给构造函数。
答案 2 :(得分:0)
要克服Rick提到的KeyError,我所做的是:
也在类_cache_result_and_execute_waiters
中查找函数MediaPipeline
,如果情况如下所示,您将看到类似的情况
if isinstance(result, Failure):
# minimize cached information for failure
result.cleanFailure()
result.frames = []
result.stack = None
我添加了另一个if case来检查fp
是否在info.waiting
中,之后的所有内容都放在此case中
if fp in info.waiting:
info.downloading.remove(fp)
info.downloaded[fp] = result # cache result
for wad in info.waiting.pop(fp):
defer_result(result).chainDeferred(wad)
在调试日志中,您的scrapy Item的"images"
中的路径名仍然不正确。但是我通过为所有"image_urls"