2016-06-21 1002 views
0

我相信使用“回调”方法是异步的,请纠正我,如果我错了。我对Python仍然很陌生,所以请耐心等待。如何在Scrapy上同步获取请求的Response对象?

无论如何,我试图让一个方法来检查文件是否存在,这里是我的代码:

def file_exists(self, url): 
    res = False; 
    response = Request(url, method='HEAD', dont_filter=True) 
    if response.status == 200: 
     res = True 
    return res 

我想请求()方法会返回一个Response对象,但它仍然会返回一个Request对象,为了捕获Response,我必须为回调创建一个不同的方法。

有什么办法,你调用的响应()方法来获取代码块内的Response对象?

+0

你可能想尝试https://github.com/rolando/scrapy-inline-requests –

回答

0

Request对象不会产生任何东西。

Scrapy使用异步下载器引擎,它将这些对象生成为Request对象并生成Response对象。

如果在蜘蛛任何方法返回它是在下载自动安排一个请求对象,并返回一个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 

它会减慢你的蜘蛛下来,但它是显著更易于实施和管理。

+0

我只是想检查文件是否存在,我不是真的要下载文件。我的抓取工具将检查所有的页面并验证所有文件,如图像和可下载文件(doc,pdf等),那些丢失的文件将被添加到名为“missing_files []”的Item对象的数组字段中。 – eSPiYa

+0

那么你有我需要在那里回答的一切:) – Granitosaurus

+0

是的,我只是使用requests.head()。谢谢! – eSPiYa

0

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

典型地,在蜘蛛中产生和整个系统通过,直到它们到达下载器,其执行该请求并返回行进回到发出请求的蜘蛛一个Response对象请求对象。除非您使用的是下载

手动,好像你正在使用的框架是不正确的方式。我读了更多关于如何创建合适的蜘蛛here

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