【问题标题】:Scrapy - order of crawled urlsScrapy - 抓取网址的顺序
【发布时间】:2018-04-18 09:29:24
【问题描述】:

我遇到了scrapy 和python 的问题。 我有几个链接。我使用循环在一个脚本中从每个脚本中抓取数据。但是爬取数据的顺序是随机的或者至少与链接不匹配。

所以我无法将每个子页面的 url 与输出的数据匹配。

Like:爬取的url、data1、data2、data3。 Data 1, data2, data3 => 没关系,因为它来自一个循环,但是如何添加到循环当前 url 或者我可以设置链接列表的顺序?就像列表中的第一个被作为第一个被爬取一样,第二个被作为第二个被爬取......

【问题讨论】:

标签: python scrapy


【解决方案1】:
# -*- coding: utf-8 -*-
import scrapy


class sth(scrapy.Spider):
    name = 'sth'
    allowed_domain = ['example.com']
    start_urls = [ 
         'https://www.example.com/url1/',
         'https://www.example.com/url2/',
         'https://www.example.com/url3/',
    ]

def parse(self, response):
          for content in response.css('div#content'):
               yield {
                    'data1': content.css('li#name2::text').extract(),
                    'data2': content.css('li#name1::text').extract(),
    }

【讨论】:

    【解决方案2】:

    time.sleep() - 这会是一个解决方案吗?

    【讨论】:

      【解决方案3】:

      好的,看来解决方案在scrapy的settings.py文件中。

      下载延迟 = 3

      请求之间。

      应该取消注释。默认情况下它是评论的。

      【讨论】:

      • 这不是正确的解决方案,它似乎只能解决您的“问题”。 Scrapy 是异步的,这意味着您不能指望传入响应的顺序,这取决于网络速度 (IO)。如果您必须有顺序下载,您将需要自己维护一个堆栈,并且只有在收到最后一个请求的响应后才从其中弹出。但我很确定你不需要那个,因为你可以简单地将 URL 附加到项目本身:yield{ 'url': response.url, ...}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多