Scrapy教程只爬取一页 - 已尝试当前SO回答中的所有方法

2 投票
1 回答
2399 浏览
提问于 2025-04-18 18:03

我在学习Scrapy教程的时候遇到了问题。无论我在网上找到的关于Scrapy只爬取一页的解决方案(包括StackOverflow上的所有相关内容)是什么,我的程序就是只爬取一页。我对Python有一定的经验,几乎可以肯定这不是缩进的问题。以下是我当前的代码,稍微修改过,以反映我找到的其他解决方案。值得注意的是,我也试过parse_item,但也没有成功。

基本上,对于我的爬虫来说,我需要从一个.html页面开始,所以我这样做了,目的是为了自己的学习。请问这是问题所在吗?是不是只需要一个目录就可以了?

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

class DmozSpider(CrawlSpider):
    name = "dmoz"
    allowed_domains = ["mollydesjardin.com"]
    start_urls = [
        "http://www.mollydesjardin.com/"
    ]

    rules = [Rule(SgmlLinkExtractor(allow=()), callback='parse_item')]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

1 个回答

8

对于 CrawlSpider 来说,有一个常见的误区就是:你不应该覆盖内置的 parse() 方法(这个方法是 CrawlSpider 的核心功能所在),除非你非常清楚自己在做什么。

这个警告在文档里有提到,但很多用户都没注意到。

你可以把自己的 parse() 方法改名为 parse_item()(就像你在规则里声明的那样)。

根据你的需求,你可能还想在规则里加上 follow=True,这样在抓取到的页面中找到的链接(在起始网址之后)也会被继续抓取。

撰写回答