Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在scrapy和#x27中返回项目;s start_请求()_Python_Scrapy - Fatal编程技术网

Python 在scrapy和#x27中返回项目;s start_请求()

Python 在scrapy和#x27中返回项目;s start_请求(),python,scrapy,Python,Scrapy,我正在编写一个scrapy spider,它将许多URL作为输入,并将它们分类(作为项目返回)。这些URL通过我的爬虫程序的start\u requests()方法提供给爬行器 有些URL可以在不下载的情况下进行分类,因此我想在start\u requests()中直接为它们生成一个项目,这是scrapy所禁止的。我怎样才能避免这种情况 我曾考虑过在自定义中间件中捕获这些请求,将它们转换为虚假的响应对象,然后在请求回调中将其转换为项对象,但任何更干净的解决方案都是受欢迎的。我认为使用spider

我正在编写一个scrapy spider,它将许多URL作为输入,并将它们分类(作为项目返回)。这些URL通过我的爬虫程序的
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,您可以启动一个“普通”请求,正如您可能已经定义的那样

您可以使用Downloader中间件来完成这项工作

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中的key
direct\u return\u url
。如果是,只需生成一个项目并将response.url放在其中,然后生成此项目。

谢谢!我不知道可以从中间件访问管道,这可能是最好的解决方案。谢谢你的回答。但是,我必须调用哪个管道?如果没有用户定义的管道,哪一个是“默认管道”?非常感谢。