为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

素胚勾勒不出你 2021-03-12 14:09:11
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 []我的问题是:下载器使用的URL的顺序?会提出的要求 just_test1,just_test2 通过下载器只有所有后方可使用 start_urls,使用?(我做了一些测试,似乎答案是没有)决定订单的是什么?为什么和如何执行此命令?我们如何控制它?这是处理文件中已包含许多URL的好方法吗?还有什么?非常感谢你!!!感谢您的回答。但是我还是有些困惑: 默认情况下,Scrapy使用LIFO队列存储未决请求。requestsSpider的回调函数的made将提供给scheduler.spider函数 做同样的事情start_url's requests?spider start_requests()函数仅生成一个迭代器,而没有给出真正的请求。全部requests(start_url和回调的)都在同一个请求的队列中吗?有多少个队列Scrapy?
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

首先,请参阅此主题-我想您会在这里找到所有答案。

下载器使用的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)

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

默认情况下,没有预先定义的顺序-你可以不知道什么时候Requestsmake_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


查看完整回答
反对 回复 2021-03-29
  • 2 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信