Scrapy 爬取网站的部分内容

3 投票
1 回答
1603 浏览
提问于 2025-04-18 13:42

你好,我有一段代码可以扫描一个网站上的所有链接。

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个结果,而不是成千上万的。我哪里做错了呢?

1 个回答

3

如果你想只抓取网站的一部分内容,你需要使用一个叫做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

撰写回答