You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

编程新手求助:用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,避免因相对路径导致的请求错误;scrapyRequest是爬虫的核心工具。
  • Spider基础配置name是爬虫的唯一标识,allowed_domains限制爬虫只爬指定域名,防止误爬其他网站。
  • parse方法:爬虫的入口处理函数,负责筛选目标年份的页面链接。这里用CSS选择器定位年份链接,你需要用浏览器的「检查元素」功能查看网站实际的HTML结构,调整response.css()里的内容。
  • check_target_year方法:辅助筛选年份,确保只爬取1843-1900年的内容。
  • parse_year方法:进入年份页面后,提取该页面下所有PDF的下载链接,同样需要根据网站实际结构调整CSS选择器。
  • parse_pdf方法:负责下载并保存PDF文件,这里指定了保存到gaceta_pdfs目录,你可以修改路径自定义保存位置。

运行前的准备&注意事项

  1. 安装Scrapy:打开终端运行pip install scrapy完成安装。
  2. 创建Scrapy项目:执行scrapy startproject gaceta_project,然后把上面的脚本放到gaceta_project/gaceta_project/spiders/目录下。
  3. 调整选择器:因为每个网站的HTML结构不同,一定要用浏览器检查元素功能,确认年份链接和PDF链接的属性,替换脚本里的CSS选择器。
  4. 控制请求频率:在项目的settings.py里添加DOWNLOAD_DELAY = 2,让爬虫每次请求间隔2秒,避免被网站封禁。
  5. 检查网站规则:先访问https://digesto.asamblea.gob.ni/robots.txt,确认网站允许爬取这些PDF内容。

如何运行脚本

进入项目目录,在终端执行scrapy crawl gaceta,爬虫就会开始自动下载PDF文件啦!

内容的提问来源于stack exchange,提问作者Til Hund

火山引擎 最新活动