规则元组在Scrapy Crawl Spiders中如何工作?

问题描述 投票:0回答:1

我的代码可以工作,但我想知道有关爬行蜘蛛中的

rules
元组的一些事情。

  1. scrapy如何在上一条规则运行完毕后迭代规则?

    • 例如。在我完成生成

      title
      plot
      url
      后,scrapy 继续执行下一个对页面进行分页的规则,在此之后,它返回到抓取链接的第一个规则。重复循环,直到不再有“下一页按钮”

      • scrapy如何知道进入下一条规则,我可以控制这个吗?如果我希望它根据 parse_item 中的某些条件遵循

        nth
        规则,然后遵循第二条规则,该怎么办?

      • 为什么最后一条规则完成后又循环回到第一条规则,我可以控制这个吗?

      • 规则循环是否仅在无法遵循其中一条规则时才会中断?如果我访问的页面根本没有可供抓取的链接怎么办?即使下一页可能有抓取链接,程序也会停止吗

  2. callback
    follow
    属性如何工作?我可以只将函数传递到
    callback
    中吗?为什么提取单个链接不需要我将
    follow
    设置为 true?

我学习网络抓取很有趣。希望您能帮忙,谢谢!

我的代码:

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class TranscriptsSpider(CrawlSpider):
    name = "transcripts"
    allowed_domains = ["subslikescript.com"]
    start_urls = ["https://subslikescript.com/movies_letter-X"]

    rules = (
        Rule(LinkExtractor(restrict_xpaths='//ul[@class="scripts-list"]/a'), callback="parse_item", follow=True),
        Rule(LinkExtractor(restrict_xpaths="(//a[@rel =  'next'])[1]")),
        )

    def parse_item(self, response):
        article = response.xpath("//article[@class='main-article']")
        title = article.xpath("./h1/text()").get()
        plot = article.xpath("./p/text()").get()

        yield {
            "title": title,
            "plot": plot, 
            "url": response.url,
        }
python web-scraping scrapy
1个回答
0
投票

Scrapy 如何在前一条规则完成后迭代规则:

1.1 一条规则完成后,Scrapy 按照规则中定义的顺序继续执行下一条规则。这是按顺序发生的。它会迭代所有规则,直到找到当前页面的匹配规则或到达规则列表的末尾。

1.2 您可以通过在代码中调用适当的回调函数来控制到下一个规则的转换。您可以定义需要转移到另一个规则的条件,并使用yield调用适当的回调函数并将控制权转移到另一个规则。

1.3 如果当前页面没有要处理的链接,Scrapy 在最后一个规则完成后不会返回到第一个规则。这取决于由于处理前一页而将哪些 URL 添加到蜘蛛。如果没有新的 URL 需要处理,Scrapy 将退出。

1.4 仅当没有要处理的 URL 且没有要添加的新链接时,规则循环才会中断。如果下一页上可能有处理链接,程序将继续运行。

callback 和 follow 属性如何工作:

callback
:该属性指定将调用哪个函数来处理符合此规则的页面。您只能将函数传递给
callback

follow
:此属性确定是否应遵循当前页面上的链接以及是否应将规则应用于它们进行处理。如果
follow
设置为
True
,Scrapy 将跟随此链接并根据规则处理页面。如果 follow 设置为 False,Scrapy 将不会关注此链接。

例如,如果您只想从页面中提取一个链接而不关注任何其他链接,则可以将此规则的

follow
设置为
False

Rule(LinkExtractor(allow=['/page/\d+/']), callback='parse_page', follow=False)

这确保了Scrapy不会跟随当前页面上的其他分页页面,而是会在每个分页页面上调用parse_page。

因此,重要的是要了解您可以完全控制要处理的页面、要应用的规则以及要在蜘蛛中调用的回调函数。您可以根据您的解析逻辑来控制所有这些。

我还建议尝试使用

scrapy.Spider
来描述数据收集的逻辑。这样的话,你的逻辑就会更明确、更容易理解,并且不会出现潜在的错误

© www.soinside.com 2019 - 2024. All rights reserved.