繁体   English   中英

具有长start_urls列表的Scrapy Crawling URL的顺序和来自spider的urls yiels

[英]the order of Scrapy Crawling URLs with long start_urls list and urls yiels from spider

救命! 阅读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!"

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

  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. 下载器使用的网址顺序? just_test1just_test2的请求just_test1仅在使用了所有start_urls之后由下载程序使用?(我已经做了一些测试,似乎答案是否定的)
  2. 什么决定订单? 为什么以及如何订购? 我们怎样才能控制它?
  3. 这是处理已经在文件中的这么多网址的好方法吗? 还有什么?

非常感谢你!!!

谢谢你的回答。但我仍然有点困惑: 默认情况下,Scrapy使用LIFO队列来存储待处理的请求。

  1. spiders的回调函数发出的requests将被提供给scheduler 。对start_url's requests执行相同start_url's requests吗?spider start_requests()函数只生成迭代器而不提供实际请求。
  2. 所有requests (start_url和callback)是否都在同一个请求的队列中? Scrapy中有多少个队列?

首先,请看这个主题 - 我想你会在那里找到所有的答案。

下载器使用的网址顺序? Just_test1,just_test2的请求是否仅在使用了所有start_urls之后由下载程序使用?(我已经做了一些测试,似乎答案是否定的)

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

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_url Requests make_requests_from_url到达 - 它是异步的。

请参阅此答案 ,了解如何控制订单。 简而言之,您可以覆盖start_requests并使用priority键标记已产生的Requests (如yield Request(url, meta={'priority': 0}) )。 例如, priority的值可以是找到url的行号。

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

我认为您应该直接在start_requests方法中读取您的文件并生成URL:请参阅此答案

所以,你应该像这样做:

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

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM