我正在写一个抓取许多urls作为输入的爬虫,并将它们分类为类别(作为项目返回)。这些URL通过我的爬虫提供给爬虫start_requests()
方法。
有些网址可以在不下载的情况下进行分类,所以我想yield
直接使用Item
为他们在start_requests()
,这是scrapy所禁止的。我怎么才能绕过这一步呢?
我曾考虑过在自定义中间件中捕获这些请求,这将使它们变成虚假的Response
对象,然后我可以将它们转换为Item
对象,但任何更简洁的解决方案都是受欢迎的。
发布于 2016-02-10 14:00:11
我认为使用爬虫中间件和重写开始_requests()将是一个很好的开始。
在您的中间件中,您应该遍历start中的所有urls_urls,并且可以使用条件语句来处理不同类型的urls。
直接调用管道的进程_item(),请不要忘记导入您的管道并从您的url为此创建一个scrapy.item
正如您所提到的,在请求中将url作为meta传递,并使用一个单独的解析函数,该函数只返回url。
发布于 2021-02-25 06:25:43
您可以使用Downloader Middleware来完成此工作。
在start_requests()
,您应该始终发出请求,例如:
def start_requests(self):
for url in all_urls:
yield scrapy.Request(url)
但是,您应该编写一个下载器中间件:
class DirectReturn:
def process_request(self, request, spider):
image_url = request.url
if url in direct_return_url_set:
resp = Response(image_url, request=request)
request.meta['direct_return_url': True]
return resp
else:
return request
然后,在您的parse
方法,只需检查键direct_return_url
在response.meta
。如果是,只需生成一个项目并将response.url放入该项目,然后生成该项目。
https://stackoverflow.com/questions/35300052
复制