Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Scrapy在起始url的一部分中对url列表进行爬网_Python_Scrapy - Fatal编程技术网

Python 使用Scrapy在起始url的一部分中对url列表进行爬网

Python 使用Scrapy在起始url的一部分中对url列表进行爬网,python,scrapy,Python,Scrapy,我正试图实现一个爬行蜘蛛与刮痧与以下特点。 基本上,我的起始url包含各种url列表,这些url被划分为多个部分。我只想从一个特定的部分抓取URL,然后抓取它们。 为了做到这一点,我使用restrict\u xpath定义了我的链接提取器,以便将我想要爬网的链接与其他链接隔离开来。 但是,由于restrict\u xpath,当爬行器尝试爬网不是起始url的链接时,它会停止,因为它找不到任何链接。 因此,我尝试添加另一条规则,该规则旨在通过使用应用于start\u url的deny\u域来确保对

我正试图实现一个爬行蜘蛛与刮痧与以下特点。 基本上,我的起始url包含各种url列表,这些url被划分为多个部分。我只想从一个特定的部分抓取URL,然后抓取它们。 为了做到这一点,我使用restrict\u xpath定义了我的链接提取器,以便将我想要爬网的链接与其他链接隔离开来。 但是,由于restrict\u xpath,当爬行器尝试爬网不是起始url的链接时,它会停止,因为它找不到任何链接。 因此,我尝试添加另一条规则,该规则旨在通过使用应用于start\u url的deny\u域来确保对start url之外的链接进行爬网。然而,这个解决方案不起作用。 有人能提出一个可能的策略吗? 现在我的规则是:

    rules = {Rule(LinkExtractor(restrict_xpaths=(".//*[@id='mw-content- text']/ul[19]"), ), callback='parse_items', follow=True), 
     Rule(LinkExtractor(deny_domains='...start url...'), callback='parse_items',follow= True),}

您是通过在这对规则周围使用{}来定义一个集合的。尝试使用()将其设置为元组:

除此之外,您可能希望将“unique=True”传递给规则,以确保不遵循任何返回到“start url”的链接。看

此外,使用“parse_items”作为对两个LinkExtractor的回调有点异味。根据你的解释,我看不出第一个提取器需要回调。。。。它只是提取应该添加到队列中的链接,以便Scraper去获取,对吗


您想要使用/持久化的数据的真正抓取通常发生在“parse_items”回调中(至少这是文档中使用的惯例)。

谢谢,您的建议解决了我的问题。可能是因为括号的缘故。然而,有些事情对我来说似乎有点不清楚,我想知道为什么这样做有效。首先,唯一参数到底做什么?在文档中,它谈到了重复过滤,但我不确定这意味着什么。第二,我不太确定如果去掉第一条规则的回调会发生什么。基本上,当找到遵循第一条规则的链接时会发生什么?唯一标志确保爬行器只匹配一次URL。每次匹配都会调用回调函数。回调函数被传递与请求URL相关联的响应:现在我可以使用unique标志了。关于第一条规则中缺少的回调,即使没有指定,也会为每个url调用它??是的,我想我知道它是如何工作的,如果我错了,请纠正我。基本上,一开始只匹配第一条规则,并遵循链接。然后对每个链接再次计算规则,第二个规则与链接匹配,以便调用parse_项并对内容进行爬网。但是这样做,我会跳过对链接主页内容的爬网吗?通常你会使用两个不同的回调。。。。一个将只返回可遵循的请求,另一个将返回已删除的项目。文件对此非常清楚。如果你需要更多,我建议你再问一个问题。
 rules = (Rule(LinkExtractor(restrict_xpaths=(".//*[@id='mw-content- text']/ul[19]"), ), callback='parse_items', follow=True), 
 Rule(LinkExtractor(deny_domains='...start url...'), callback='parse_items',follow= True),)