我认为使用“回调”方法是异步的,如果我错了请纠正我。我仍然是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对象?
答案 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。
至于文件存在,你的蜘蛛可以在解析*()方法中解析数据时将相关信息存储在数据库或其他数据结构中,然后你可以用自己的代码查询它。