循环中的 Scrapy 调用请求
Scrapy call request in a loop
我想删除一个包含带有过滤选项的组合框的网页。
基础 url 相同,但请求负载取决于所选的组合框值。我有一个可用选项列表,并且我创建了一个循环来遍历组合框值并执行请求。代码如下:
def parse_product_lines(self, response):
options = json.loads(response.body_as_unicode())
product_lines = options['products']
for product_line in product_lines:
payload = self.prepare_payload(product_line)
scrapy.Request('http://example.com',
method="POST",
body=urllib.urlencode(payload),
callback=self.parse_items)
def parse_items(self, response):
print response
,但没有执行请求。有人知道那里发生了什么吗?
首先,一个Spider
class默认使用方法parse
。
每个回调应该 return 一个 Item
或一个 dict
,或者一个迭代器。
你应该 yield request
在你的 parse_product_lines
方法中告诉 scrapy 处理下一个。
Scrapy 不会等待 Request
完成(像其他请求库一样),它会异步调用请求。
这些请求(和项目)由每个处理这些请求(回调)的方法处理,因为 scrapy 将这些方法作为 generators
并检查它们是项目还是请求,返回项目,并安排稍后通过其 callback
参数中指定的方法处理请求。
所以不要只调用Request
,而是yield Request
由scrapy安排。
我想删除一个包含带有过滤选项的组合框的网页。 基础 url 相同,但请求负载取决于所选的组合框值。我有一个可用选项列表,并且我创建了一个循环来遍历组合框值并执行请求。代码如下:
def parse_product_lines(self, response):
options = json.loads(response.body_as_unicode())
product_lines = options['products']
for product_line in product_lines:
payload = self.prepare_payload(product_line)
scrapy.Request('http://example.com',
method="POST",
body=urllib.urlencode(payload),
callback=self.parse_items)
def parse_items(self, response):
print response
,但没有执行请求。有人知道那里发生了什么吗?
首先,一个Spider
class默认使用方法parse
。
每个回调应该 return 一个 Item
或一个 dict
,或者一个迭代器。
你应该 yield request
在你的 parse_product_lines
方法中告诉 scrapy 处理下一个。
Scrapy 不会等待 Request
完成(像其他请求库一样),它会异步调用请求。
这些请求(和项目)由每个处理这些请求(回调)的方法处理,因为 scrapy 将这些方法作为 generators
并检查它们是项目还是请求,返回项目,并安排稍后通过其 callback
参数中指定的方法处理请求。
所以不要只调用Request
,而是yield Request
由scrapy安排。