具有很长的start_urls列表和来自蜘蛛的url yels的Scrapy Crawling

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_test1just_test2 通过下载器只有所有后方可使用 start_urls,使用?(我做了一些测试,似乎答案是没有)

  2. 决定订单的是什么?为什么和如何执行此命令?我们如何控制它?

  3. 这是处理文件中已包含许多URL的好方法吗?还有什么?

非常感谢你!!!

感谢您的回答。但是我还是有些困惑: 默认情况下,Scrapy使用LIFO队列存储未决请求。

  1. requestsSpider的回调函数的made将提供给scheduler.spider函数 做同样的事情start_url's requests?spider start_requests()函数仅生成一个迭代器,而没有给出真正的请求。

  2. 全部requests(start_url和回调的)都在同一个请求的队列中吗?有多少个队列Scrapy


素胚勾勒不出你
浏览 253回答 2
2回答

蝴蝶刀刀

首先,请参阅此主题-我想您会在这里找到所有答案。下载器使用的URL的顺序?仅在使用所有start_url之后,下载程序才会使用just_test1,just_test2发出的请求吗?(我进行了一些测试,答案似乎是否定的)您说得对,答案是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)决定订单的是什么?为什么和如何执行此命令?我们如何控制它?默认情况下,没有预先定义的顺序-你可以不知道什么时候Requests从make_requests_from_url抵达的-它是异步的。有关如何控制订单的信息,请参见此答案。长话短说,您可以使用键覆盖start_requests并标记“ yield” (如)。例如,的值可以是找到该网址的行号。Requestspriorityyield Request(url, meta={'priority': 0})priority这是处理文件中已包含许多URL的好方法吗?还有什么?我认为您应该直接在start_requestsmethod中读取文件并产生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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python