Python 在scrapy和#x27中返回项目;s start_请求()
我正在编写一个scrapy spider,它将许多URL作为输入,并将它们分类(作为项目返回)。这些URL通过我的爬虫程序的Python 在scrapy和#x27中返回项目;s start_请求(),python,scrapy,Python,Scrapy,我正在编写一个scrapy spider,它将许多URL作为输入,并将它们分类(作为项目返回)。这些URL通过我的爬虫程序的start\u requests()方法提供给爬行器 有些URL可以在不下载的情况下进行分类,因此我想在start\u requests()中直接为它们生成一个项目,这是scrapy所禁止的。我怎样才能避免这种情况 我曾考虑过在自定义中间件中捕获这些请求,将它们转换为虚假的响应对象,然后在请求回调中将其转换为项对象,但任何更干净的解决方案都是受欢迎的。我认为使用spider
start\u requests()
方法提供给爬行器
有些URL可以在不下载的情况下进行分类,因此我想在start\u requests()
中直接为它们生成一个项目
,这是scrapy所禁止的。我怎样才能避免这种情况
我曾考虑过在自定义中间件中捕获这些请求,将它们转换为虚假的
响应
对象,然后在请求回调中将其转换为项
对象,但任何更干净的解决方案都是受欢迎的。我认为使用spider中间件并覆盖start\u请求()这将是一个良好的开端
在您的中间件中,您应该在start_URL中的所有URL上循环,并且可以使用条件语句来处理不同类型的URL
- 对于不需要请求的特殊URL,您可以
- 直接调用管道的process_item(),不要忘记导入管道并从url为此创建一个scrapy.item
- 正如您所提到的,在请求中以meta的形式传递url,并且有一个单独的解析函数,该函数只返回url
- 对于所有剩余的URL,您可以启动一个“普通”请求,正如您可能已经定义的那样
start\u requests()
中,您应该始终发出请求,例如:
def启动请求(自):
对于所有url中的url:
生成剪贴请求(url)
但是,您应该编写一个下载器中间件:
class DirectReturn:
def过程_请求(自我、请求、蜘蛛):
image\u url=request.url
如果直接返回url集合中的url:
resp=响应(图像\ url,请求=请求)
request.meta['direct\u return\u url':True]
返回响应
其他:
退货申请
然后,在
parse
方法中,只需检查response.meta中的keydirect\u return\u url
。如果是,只需生成一个项目并将response.url放在其中,然后生成此项目。谢谢!我不知道可以从中间件访问管道,这可能是最好的解决方案。谢谢你的回答。但是,我必须调用哪个管道?如果没有用户定义的管道,哪一个是“默认管道”?非常感谢。