Scrapy无法抓取起始URL中的数据

2 投票
1 回答
2143 浏览
提问于 2025-04-30 11:48

我正在尝试使用scrapy爬取整个网站。根据scrapy的文档,

start_urls - 这是一个网址列表,爬虫会从这些网址开始爬取, 如果没有指定特定的网址,爬虫会从这里列出的页面开始下载。接下来生成的网址 将会是从start_urls中的数据逐步产生的。

所以根据这个定义,scrapy应该会爬取在start_urls中提到的页面上的所有子网址,但实际上它只爬取我指定的网址。我确实按照Scrapy - 爬取整个网站中提到的规则进行了设置,但这并没有帮助。它只抓取并输出我在start_urls中指定的页面。

这是我代码的一部分:

class AcdivocaFirstSpider(scrapy.Spider):
    name = "example_sample"
    allowed_domains = ["example.org"]
    start_urls = ["http://www.example.org/site/id/home"]
    rules = rules = [Rule(SgmlLinkExtractor(), callback='parse_item', follow=True)]

    def parse(self, response):
        filename = response.url.split("/")[-1] #so eg it would name 'home'
        open(filename, 'wb').write(response.body)

这段代码只生成了一个包含“主页”提取HTML数据的文件。我该如何让它从主页开始递归地爬取整个网站呢?

任何帮助都非常感谢。谢谢。

暂无标签

1 个回答

3

有两件事情需要改变:

  • 为了使用规则,应该把 AcdivocaFirstSpider 变成 scrapy.contrib.spiders.CrawlSpider 的子类,而不是 scrapy.Spider

后续的链接将会根据起始链接中的数据依次生成。

这句话有点误导。单独的 scrapy.Spider 对那些起始链接并没有什么特别的处理:它只是下载这些链接,然后把响应的内容传给 parse() 方法。如果 parse() 方法被实现为生成更多的请求,那确实可以说 后续的链接将会根据这些链接的数据生成,但这并不是自动发生的。

  • 使用 scrapy.contrib.spiders.CrawlSpider 时,你不应该重写内置的 parse() 方法,因为这个方法是用来检查规则和生成页面请求的。所以你需要把 parse 改名为 parse_item(正如你规则中提到的)

请查看 文档中关于爬虫规则的警告。

撰写回答