【问题标题】:the order of Scrapy Crawling URLs with long start_urls list and urls yiels from spider具有长 start_urls 列表和 urls 的 Scrapy Crawling URL 的顺序来自蜘蛛
【发布时间】:2013-05-28 08:31:06
【问题描述】:

帮助!阅读Scrapy的源代码对我来说并不容易。 我有一个很长的start_urls 列表。一个文件大约有 3,000,000 个。所以,我把start_urls 写成这样:

start_urls = read_urls_from_file(u"XXXX")
def read_urls_from_file(file_path):
    with codecs.open(file_path, u"r", encoding=u"GB18030") as f:
        for line in f:
            try:
                url = line.strip()
                yield url
            except:
                print u"read line:%s from file failed!" % line
                continue
    print u"file read finish!"

同时,我的蜘蛛的回调函数是这样的:

  def parse(self, response):
        self.log("Visited %s" % response.url)
        return  Request(url=("http://www.baidu.com"), callback=self.just_test1)
    def just_test1(self, response):
        self.log("Visited %s" % response.url)
        return Request(url=("http://www.163.com"), callback=self.just_test2)
    def just_test2(self, response):
        self.log("Visited %s" % response.url)
        return []

我的问题是:

  1. 下载器使用的url的顺序?将提出的请求 just_test1,just_test2 仅供下载者使用 start_urls都用了吗?(我做了一些测试,好像 答案是否定的)
  2. 什么决定了订单?这个顺序为什么以及如何?我们如何控制它?
  3. 这是处理文件中已有这么多 url 的好方法吗?还有什么?

非常感谢!!!

感谢您的回答。但我仍然有点困惑: By default, Scrapy uses a LIFO queue for storing pending requests.

  1. 蜘蛛的回调函数生成的requests 将提供给 scheduler.谁对start_url's requests做同样的事情?蜘蛛 start_requests() 函数只生成一个迭代器而不给出 真正的要求。
  2. 所有requests(start_url 和callback)会在同一个请求的队列中吗?Scrapy 中有多少个队列?

【问题讨论】:

    标签: python python-2.7 web-scraping scrapy web-crawler


    【解决方案1】:

    首先,请看thread - 我想你会在那里找到所有答案。

    下载器使用的网址的顺序?将提出的请求 just_test1,just_test2 只供下载器使用 start_urls 都用了吗?(我做了一些测试,好像答案 否)

    你是对的,答案是No。行为完全异步:当蜘蛛启动时,start_requests 方法被调用(source):

    def start_requests(self):
        for url in self.start_urls:
            yield self.make_requests_from_url(url)
    
    def make_requests_from_url(self, url):
        return Request(url, dont_filter=True)
    

    什么决定了顺序?这个顺序为什么以及如何?我们该如何控制 是吗?

    默认情况下,没有预定义的顺序 - 您无法知道来自 make_requests_from_urlRequests 何时到达 - 它是异步的。

    请参阅this answer,了解如何控制订单。 长话短说,您可以覆盖start_requests 并使用priority 键(如yield Request(url, meta={'priority': 0}))标记产生Requests。比如priority的值可以是找到url的行号。

    这是处理这么多网址的好方法吗? 文件?还有什么?

    我认为您应该直接在start_requests 方法中读取您的文件并生成网址:请参阅this answer

    所以,你应该这样做:

    def start_requests(self):
        with codecs.open(self.file_path, u"r", encoding=u"GB18030") as f:
            for index, line in enumerate(f):
                try:
                    url = line.strip()
                    yield Request(url, meta={'priority': index})
                except:
                    continue
    

    希望对您有所帮助。

    【讨论】:

    猜你喜欢
    • 2021-11-11
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多