【问题标题】:Scrapy crawl only part of a websiteScrapy 只抓取网站的一部分
【发布时间】:2022-03-10 16:04:29
【问题描述】:

您好,我有以下代码来扫描给定站点中的所有链接。

from scrapy.item import Field, Item
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class SampleItem(Item):
    link = Field()


class SampleSpider(CrawlSpider):
    name = "sample_spider"
    allowed_domains = ["domain.com"]
    start_urls = ["http://domain.com"]

    rules = (
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        item = SampleItem()
        item['link'] = response.url
        return item

如果我只想检查全球网站的一部分,我该怎么做?例如,我尝试仅扫描一个国际站点的法语部分,其域的结构为:domain.com/fr/fr。所以我尝试过:

from scrapy.item import Field, Item
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor


class SampleItem(Item):
    link = Field()


class SampleSpider(CrawlSpider):
    name = "sample_spider"
    allowed_domains = ["domain.com/fr/fr"]
    start_urls = ["http://domain.com/fr/fr"]

    rules = (
        Rule(LinkExtractor(), callback='parse_page', follow=True),
    )

    def parse_page(self, response):
        item = SampleItem()
        item['link'] = response.url
        return item

但是蜘蛛只返回 3 个结果而不是数千个。我究竟做错了什么?

【问题讨论】:

    标签: python hyperlink scrapy web-crawler


    【解决方案1】:

    要仅抓取网站的一部分,您必须使用 LinkExtractor。您可以通过发送scrapy genspider -t crawl domain domain.com获取样品。

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.contrib.linkextractors import LinkExtractor
    from scrapy.contrib.spiders import CrawlSpider, Rule
    
    from test.items import testItem
    
    
    class DomainSpider(CrawlSpider):
        name = 'domain'
        allowed_domains = ['domain.com']
        start_urls = ['http://www.domain.com/fr/fr']
    
        rules = (
            Rule(LinkExtractor(allow=r'fr/'), callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            i = testItem()
            #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
            #i['name'] = response.xpath('//div[@id="name"]').extract()
            #i['description'] = response.xpath('//div[@id="description"]').extract()
            return i
    

    【讨论】:

    • 嘿,非常感谢!我试过了,但我收到一条错误消息“导入错误:没有名为项目的模块”。有什么想法吗?
    • 是的,您需要一个 items.py 文件。两个提示:1)RTFM :-) 2)使用scrapy命令行工具生成项目和蜘蛛,它会确保你拥有所有你需要的文件夹和文件,并给你例子。
    • 尽管我的项目中已经有一个名为“items”的项目文件,并且包含在我的项目文件夹中,其中包含蜘蛛文件夹。这是 items.py 中的代码。它是使用命令行工具“scrapy startproject ...”创建的
    • 如果你在 myproject/myproject/items.py 有一个文件,你可以用from myproject.items import MyItem 导入它。大写很重要,因此请确保您正确拼写了项目类别名称等。
    • 这是抓取 fr/ 示例 fr/test/myside.php 下的所有内容还是仅抓取 fr/ ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多