【问题标题】:Scrapy call request in a loop循环中的 Scrapy 调用请求
【发布时间】:2015-11-28 12:43:12
【问题描述】:

我想废弃一个包含带有过滤选项的组合框的网页。 基本 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

,但是请求没有被执行。有人知道那里发生了什么吗?

【问题讨论】:

  • 在循环结束时我添加了 return 语句,一切都开始工作了。

标签: python request web-crawler scrapy


【解决方案1】:

首先,一个Spider类默认使用方法parse。

每个回调应该返回一个Item 或一个dict,或一个迭代器。

你应该在你的parse_product_lines方法中yield request告诉scrapy接下来处理。

【讨论】:

    【解决方案2】:

    Scrapy 不会等待 Request 完成(与其他请求库一样),它会异步调用请求。

    这些请求(和项目)正在由处理这些请求(回调)的每个方法通过产生它们来处理,因为scrapy 将这些方法作为generators 并检查它们是否是项目或请求,返回项目和调度稍后将通过其callback 参数上指定的方法处理的请求。

    所以不要只打电话给Request,而是要由scrapy安排yield Request。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多