如何在Scrapy上同步获取Request的Response对象?

时间:2016-06-21 08:52:28

标签: 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 res

我认为Request()方法将返回一个Response对象,但它仍然返回一个Request对象,以捕获Response,我必须为回调创建一个不同的方法。

有没有办法在你调用Response()方法的代码块中获取Response对象?

3 个答案:

答案 0 :(得分:1)

Request个对象无法生成任何内容。

Scrapy使用异步Downloader引擎,该引擎接收这些Request个对象并生成Response个对象。

如果您的蜘蛛中的任何方法返回一个Request对象,它将自动在下载程序中安排,并将Response对象返回到指定的callback(即Request(url, callback=self.my_callback))。 点击scrapy's architecture overview

了解详情

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

self.crawler.engine.schedule(Request(url, callback=self.my_callback), spider) 

如果您从蜘蛛spider运行此操作,此处很可能是self,而self.crawler是从scrapy.Spider继承的。

或者,您始终可以使用类似requests之类的内容来阻止异步堆栈:

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

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

答案 1 :(得分:1)

如果任何人仍然对可能的解决方案感兴趣–我通过使用“ requests”之类的“内部” scrapy函数进行请求来管理它,

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()

然后继续。

答案 2 :(得分:0)

Scrapy使用Request和Response对象来抓取网站。

通常,请求对象在蜘蛛中生成并传递到系统,直到它们到达Downloader,Downloader执行请求并返回一个Response对象,该对象返回发出请求的蜘蛛。

除非您手动使用下载程序,否则您使用框架的方式似乎不正确。我会更多地了解如何创建适当的蜘蛛here

至于文件存在,你的蜘蛛可以在解析*()方法中解析数据时将相关信息存储在数据库或其他数据结构中,然后你可以用自己的代码查询它。