如何用Scrapy爬取网站及其子目录的所有Wayback Machine归档页面
解决Scrapy爬取Wayback Machine归档页面停止的问题
你的代码只爬取起始URL就停止,核心原因是普通的scrapy.Spider不支持rules属性,rules是CrawlSpider的专属配置,用于自动跟进符合规则的链接。按照以下修改可以实现遍历所有目标归档页面:
修改要点:
- 爬虫类继承
CrawlSpider而非scrapy.Spider - 重命名
parse方法(不能用parse作为规则的callback,会覆盖CrawlSpider的核心解析逻辑) - 规则中添加
follow=True,让爬虫持续跟进符合条件的链接 - 简化正则表达式写法,用原始字符串避免转义混乱
修改后的完整代码:
import scrapy from scrapy.crawler import CrawlerProcess from scrapy.item import Item, Field from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy.utils.project import get_project_settings try: from urllib.parse import urlparse except ImportError: from urlparse import urlparse class VSItem(Item): value = Field() class vsSpider(CrawlSpider): name = "lever" start_urls = [ "https://web.archive.org/web/20051120125133/http://www.novi.k12.mi.us/default.aspx" ] rules = ( Rule( LinkExtractor(allow=r'https://web.archive.org/web/\d{14}/http://www.novi.k12.mi.us/.*'), callback="parse_archive_page", follow=True ), ) def parse_archive_page(self, response): it = VSItem() it["value"] = response.css("input[name='__VIEWSTATE']").extract() yield it process = CrawlerProcess(get_project_settings()) process.crawl(vsSpider) process.start()
额外说明:
- 如果需要爬取该域名下所有时间戳的归档页面,还可以考虑先爬取Wayback Machine的站点归档列表页面(比如
https://web.archive.org/web/*/http://www.novi.k12.mi.us/),从中提取所有可用的时间戳链接,再遍历爬取,这样能更全面地覆盖所有归档版本。 - 注意遵守Wayback Machine的爬虫规则,避免请求频率过高导致被限制。
内容的提问来源于stack exchange,提问作者user4819461
相关产品推荐
相关产品推荐

