编程新手求助:用Scrapy与Python3批量下载指定历史报纸PDF
帮你完善Scrapy脚本批量下载《Gaceta》旧报纸PDF
嘿,作为编程和Python零基础的新手,你能写出初始脚本已经超棒了!我来帮你把这个Scrapy脚本补全,让它能自动抓取1843年至1900年的《Gaceta》PDF文件。
完整的Scrapy脚本示例
#!/usr/bin/env python3 from urllib.parse import urljoin import scrapy from scrapy.http import Request class GacetaSpider(scrapy.Spider): name = "gaceta" allowed_domains = ["digesto.asamblea.gob.ni"] # 替换为实际的《Gaceta》年份列表页面URL start_urls = ["https://digesto.asamblea.gob.ni/colecciones/gaceta/"] def parse(self, response): # 提取所有含年份参数的链接(需根据网站实际HTML结构调整选择器) year_links = response.css('a[href*="year="]::attr(href)').getall() # 筛选出1843-1900年的目标链接 filtered_links = [link for link in year_links if self.check_target_year(link)] for link in filtered_links: full_year_url = urljoin(response.url, link) # 发送请求到年份页面,交给parse_year方法处理 yield Request(full_year_url, callback=self.parse_year) def check_target_year(self, link): # 从链接中提取年份并判断是否在目标范围内 try: year = int(link.split('year=')[-1].split('&')[0]) return 1843 <= year <= 1900 except (IndexError, ValueError): return False def parse_year(self, response): # 提取该年份下所有PDF文件的链接(需根据网站实际结构调整选择器) pdf_links = response.css('a[href$=".pdf"]::attr(href)').getall() for pdf_link in pdf_links: full_pdf_url = urljoin(response.url, pdf_link) # 发送下载请求,交给parse_pdf方法保存文件 yield Request(full_pdf_url, callback=self.parse_pdf) def parse_pdf(self, response): # 从URL中提取PDF文件名 filename = response.url.split('/')[-1] # 保存PDF到本地(可修改路径指定保存目录) with open(f"gaceta_pdfs/{filename}", 'wb') as f: f.write(response.body) self.log(f"✅ 已保存文件:{filename}")
关键部分解释(适合零基础理解)
- 模块导入:
urljoin用来拼接完整URL,避免因相对路径导致的请求错误;scrapy和Request是爬虫的核心工具。 - Spider基础配置:
name是爬虫的唯一标识,allowed_domains限制爬虫只爬指定域名,防止误爬其他网站。 - parse方法:爬虫的入口处理函数,负责筛选目标年份的页面链接。这里用CSS选择器定位年份链接,你需要用浏览器的「检查元素」功能查看网站实际的HTML结构,调整
response.css()里的内容。 - check_target_year方法:辅助筛选年份,确保只爬取1843-1900年的内容。
- parse_year方法:进入年份页面后,提取该页面下所有PDF的下载链接,同样需要根据网站实际结构调整CSS选择器。
- parse_pdf方法:负责下载并保存PDF文件,这里指定了保存到
gaceta_pdfs目录,你可以修改路径自定义保存位置。
运行前的准备&注意事项
- 安装Scrapy:打开终端运行
pip install scrapy完成安装。 - 创建Scrapy项目:执行
scrapy startproject gaceta_project,然后把上面的脚本放到gaceta_project/gaceta_project/spiders/目录下。 - 调整选择器:因为每个网站的HTML结构不同,一定要用浏览器检查元素功能,确认年份链接和PDF链接的属性,替换脚本里的CSS选择器。
- 控制请求频率:在项目的
settings.py里添加DOWNLOAD_DELAY = 2,让爬虫每次请求间隔2秒,避免被网站封禁。 - 检查网站规则:先访问
https://digesto.asamblea.gob.ni/robots.txt,确认网站允许爬取这些PDF内容。
如何运行脚本
进入项目目录,在终端执行scrapy crawl gaceta,爬虫就会开始自动下载PDF文件啦!
内容的提问来源于stack exchange,提问作者Til Hund




