Python 如何在Scrapy上同步获取请求的响应对象?

Python 如何在Scrapy上同步获取请求的响应对象?,python,scrapy,Python,Scrapy,我相信使用“回调”方法是异步的,如果我错了,请纠正我。我对Python还是新手,所以请容忍我 无论如何,我正在尝试创建一种方法来检查文件是否存在,下面是我的代码: def file_exists(self, url): res = False; response = Request(url, method='HEAD', dont_filter=True) if response.status == 200: res = True return r

我相信使用“回调”方法是异步的,如果我错了,请纠正我。我对Python还是新手,所以请容忍我

无论如何,我正在尝试创建一种方法来检查文件是否存在,下面是我的代码:

def file_exists(self, url):
    res = False;
    response = Request(url, method='HEAD', dont_filter=True)
    if response.status == 200:
        res = True
    return res
我认为Request()方法将返回一个响应对象,但它仍然返回一个请求对象,为了捕获响应,我必须为回调创建一个不同的方法


是否有方法在调用Response()方法的代码块中获取响应对象?

Scrapy使用请求和响应对象对网站进行爬网

通常,请求对象在spider中生成,并在系统中传递,直到它们到达下载程序,下载程序执行请求并返回一个响应对象,该响应对象返回到发出请求的spider

除非您手动使用下载程序,否则您使用框架的方式似乎是不正确的。我读了更多关于如何创建合适的蜘蛛的内容


对于存在的文件,spider可以在其parse*()方法中解析刮取的数据时,将相关信息存储在数据库或其他数据结构中,然后您可以在自己的代码中查询它。

刮取使用请求和响应对象对网站进行爬网

通常,请求对象在spider中生成,并在系统中传递,直到它们到达下载程序,下载程序执行请求并返回一个响应对象,该响应对象返回到发出请求的spider

除非您手动使用下载程序,否则您使用框架的方式似乎是不正确的。我读了更多关于如何创建合适的蜘蛛的内容


对于存在的文件,spider在其parse*()方法中解析刮取的数据时,可以将相关信息存储在数据库或其他数据结构中,然后您可以在自己的代码中查询它。

请求
对象不会生成任何内容

Scrapy使用异步下载引擎,接收这些
请求
对象并生成
响应
对象

如果spider中的任何方法返回一个请求对象,它将自动安排在下载程序中,并向指定的
回调返回
响应
对象(即
请求(url,callback=self.my_callback)
)。 更多信息请访问

现在取决于您在何时何地执行此操作,您可以通过告诉下载程序安排一些请求来安排请求:

self.crawler.engine.schedule(Request(url, callback=self.my_callback), spider) 
如果您从spider运行此命令,则此处很可能是self,self.crawler继承自
scrapy.spider

或者,您可以始终使用类似于
请求的方法阻止异步堆栈,例如:

def parse(self, response):
    image_url = response.xpath('//img/@href').extract_first()
    if image_url:
        image_head = requests.head(image_url)
        if 'image' in image_head.headers['Content-Type']:
            item['image'] = image_url

它会减慢爬行器的速度,但实现和管理起来要容易得多。

请求
对象不会生成任何内容

Scrapy使用异步下载引擎,接收这些
请求
对象并生成
响应
对象

如果spider中的任何方法返回一个请求对象,它将自动安排在下载程序中,并向指定的
回调返回
响应
对象(即
请求(url,callback=self.my_callback)
)。 更多信息请访问

现在取决于您在何时何地执行此操作,您可以通过告诉下载程序安排一些请求来安排请求:

self.crawler.engine.schedule(Request(url, callback=self.my_callback), spider) 
如果您从spider运行此命令,则此处很可能是self,self.crawler继承自
scrapy.spider

或者,您可以始终使用类似于
请求的方法阻止异步堆栈,例如:

def parse(self, response):
    image_url = response.xpath('//img/@href').extract_first()
    if image_url:
        image_head = requests.head(image_url)
        if 'image' in image_head.headers['Content-Type']:
            item['image'] = image_url

它会减慢爬行器的速度,但实施和管理起来要容易得多。

如果有人对可能的解决方案感兴趣,我可以通过在一个类似“请求”的函数中执行请求来管理它,比如:

import requests    
request_object = requests.get(the_url_you_like_to_get)
response_object = scrapy.Selector(request_object )
item['attribute'] = response_object .xpath('//path/you/like/to/get/text()').extract_first()

然后继续。

如果有人仍然对一个可能的解决方案感兴趣,我通过在一个类似“请求”的函数中执行请求来管理它,如下所示:

import requests    
request_object = requests.get(the_url_you_like_to_get)
response_object = scrapy.Selector(request_object )
item['attribute'] = response_object .xpath('//path/you/like/to/get/text()').extract_first()

然后继续。

您可能想试试您可能想试试我只是想检查文件是否存在,我不是真的要下载文件。我的爬虫程序将检查所有页面并验证所有文件,如图像和可下载文件(doc、pdf等),这些丢失的文件将添加到我的项目对象名为“missing_files[]”的数组字段中。那么,在我的回答中,你有你需要的一切:)是的,我刚刚使用了requests.head()。谢谢我只是想检查这些文件是否存在,我不打算下载这些文件。我的爬虫程序将检查所有页面并验证所有文件,如图像和可下载文件(doc、pdf等),这些丢失的文件将添加到我的项目对象名为“missing_files[]”的数组字段中。那么,在我的回答中,你有你需要的一切:)是的,我刚刚使用了requests.head()。谢谢一些关于xpath使用上下文的简单介绍可能会更好地说明您的答案如何帮助解决问题。在我的案例中,对于旧版本(如1.5)仍然很有用。+我需要为此解决方案添加一些内容,因为我现在遇到了这个问题,并且遇到了一些问题。使用
requests.get(“http://url.com“”
忘记cookies。例如,如果您需要登录以获取想要刮取的内容,那么您将失去cookie会话,这就好像您没有登录一样。您应该使用来保存它,或者尝试在
请求中实现。get()
。一些关于xpath使用上下文的简单介绍可能会更好地说明您的答案如何帮助解决问题。在我的情况下,对于旧版本(如1.5)仍然很有用。+我需要为此解决方案添加一些内容,因为我现在遇到了这个问题。使用
requests.get(“http://url.com)
忘记了厨师