当前位置: 首页 > news >正文

从0到1开发政府公报爬虫:基于Querido Diario的实战案例

从0到1开发政府公报爬虫:基于Querido Diario的实战案例

【免费下载链接】querido-diario📰 Diários oficiais brasileiros acessíveis a todos | 📰 Brazilian government gazettes, accessible to everyone.项目地址: https://gitcode.com/gh_mirrors/qu/querido-diario

政府公报是公民获取公共信息的重要渠道,但许多地区的官方网站缺乏标准化的数据接口。本文将以巴西开源项目Querido Diario为基础,带您从零开始构建一个功能完善的政府公报爬虫,掌握数据采集的核心技术与最佳实践。

认识Querido Diario项目

Querido Diario(葡萄牙语意为"亲爱的日记")是一个致力于让巴西政府公报变得人人可及的开源项目。该项目通过构建标准化的爬虫框架,系统地收集和整理各地区的官方出版物,为透明政府和公民监督提供数据支持。

项目的核心代码组织在data_collection/gazette/目录下,采用Scrapy框架实现了模块化的爬虫架构。通过分析该项目,我们可以学习到专业爬虫开发的完整流程和关键技术点。

开发环境搭建

开始之前,需要准备以下开发环境:

  1. 克隆项目代码
git clone https://gitcode.com/gh_mirrors/qu/querido-diario cd querido-diario
  1. 安装依赖项目提供了详细的依赖管理文件:
  • requirements.txt:生产环境依赖
  • requirements-dev.txt:开发环境依赖

安装命令:

pip install -r requirements.txt
  1. 熟悉项目结构核心爬虫代码位于data_collection/gazette/spiders/目录,按巴西各州(如al、am、ap等)组织,每个州目录下包含多个城市的爬虫实现。

爬虫开发核心步骤

1. 分析目标网站结构

开发爬虫的第一步是分析目标政府公报网站的结构。以里约热内卢州的Arraial do Cabo市为例,其爬虫定义在data_collection/gazette/spiders/rj/rj_arraial_do_cabo.py中:

allowed_domains = ["portal.arraial.rj.gov.br"] start_urls = ["https://portal.arraial.rj.gov.br/diarios_oficiais_web"]

关键是确定:

  • 公报列表页面的URL模式
  • 分页机制
  • 公报详情页链接
  • 日期和PDF下载链接的提取规则

2. 创建基础爬虫类

Querido Diario项目设计了多个基础爬虫类,位于data_collection/gazette/spiders/base/目录,封装了不同类型网站的通用爬取逻辑。例如:

  • dosp.py:处理使用DOSP系统的网站
  • siganet.py:处理使用SIGANET系统的网站
  • adminlte.py:处理使用AdminLTE框架的网站

创建新爬虫时,应根据目标网站特点选择合适的基类,例如:

from gazette.spiders.base.dosp import DOSPSpider class RjArraialDoCaboSpider(DOSPSpider): TERRITORY_ID = "3300200" # IBGE城市代码 name = "rj_arraial_do_cabo" allowed_domains = ["portal.arraial.rj.gov.br"] start_urls = ["https://portal.arraial.rj.gov.br/diarios_oficiais_web"]

3. 实现页面解析逻辑

核心解析逻辑在parse方法中实现。以RN州Mossoro市的爬虫为例(rn_mossoro_2023.py):

def parse(self, response): # 提取公报列表 gazette_items = response.css(".edicao") for item in gazette_items: # 提取日期信息 date_text = item.css(".data::text").get() gazette_date = self.parse_date(date_text) # 提取详情页链接 detail_url = item.css("a::attr(href)").get() yield scrapy.Request( url=detail_url, callback=self.parse_gazette_page, cb_kwargs={"gazette_date": gazette_date} ) # 处理分页 next_page = response.css(".proxima a::attr(href)").get() if next_page: yield scrapy.Request(url=next_page, callback=self.parse)

关键步骤包括:

  • 使用CSS选择器或XPath提取页面元素
  • 解析日期并标准化格式
  • 构造详情页请求
  • 实现分页处理逻辑

4. 数据提取与存储

爬虫提取的数据应遵循项目定义的GazetteItem结构:

class GazetteItem(scrapy.Item): date = scrapy.Field() edition_number = scrapy.Field() file_urls = scrapy.Field() files = scrapy.Field() power = scrapy.Field() territory_id = scrapy.Field()

通过pipelines.py配置数据存储方式,支持保存到数据库或本地文件系统。

高级技巧与最佳实践

1. 反反爬策略

政府网站通常有反爬机制,Querido Diario项目通过以下方式应对:

  • 设置合理的请求间隔(在settings.py中配置)
  • 使用随机User-Agent
  • 实现自动重试机制
  • 处理JavaScript渲染的页面(如需要)

2. 增量爬取

为避免重复爬取,项目实现了基于日期范围的增量爬取:

# 在基类中实现 def __init__(self, start=None, end=None, *args, **kwargs): super().__init__(*args, **kwargs) self.start_date = self._parse_date(start) if start else None self.end_date = self._parse_date(end) if end else None

3. 错误处理与日志

完善的错误处理机制确保爬虫稳定性:

def parse_gazette_page(self, response, gazette_date): try: # 提取PDF链接 pdf_url = response.css("a.download::attr(href)").get() if not pdf_url: self.logger.warning("No PDF found for %s", gazette_date) return yield GazetteItem( date=gazette_date, file_urls=[pdf_url], territory_id=self.TERRITORY_ID, power="executive" ) except Exception as e: self.logger.error("Error parsing gazette: %s", str(e))

测试与部署

1. 本地测试

使用Scrapy命令行工具测试爬虫:

scrapy crawl rj_arraial_do_cabo -o output.json

2. 项目测试套件

项目提供了测试框架,位于tests/目录,包含日期解析、内容提取等单元测试:

pytest tests/

3. 部署选项

  • 本地定时任务:使用系统crontab或scheduler.py
  • 云服务部署:可配置在ScrapingHub等平台(配置文件:scrapinghub.yml)

总结

通过Querido Diario项目的实战案例,我们学习了政府公报爬虫的完整开发流程,从环境搭建到高级功能实现。核心要点包括:

  1. 选择合适的基础爬虫类,提高代码复用
  2. 实现稳健的页面解析逻辑
  3. 处理反爬机制和异常情况
  4. 遵循数据标准化格式
  5. 编写可维护的测试用例

这个项目不仅展示了专业爬虫开发的最佳实践,更为公民获取公共信息提供了有力工具。希望本文能帮助您快速掌握政府数据采集的核心技术,为透明政府建设贡献力量!

您可以通过项目的CONTRIBUTING.md文档了解如何参与该开源项目,贡献自己开发的爬虫或改进现有代码。

【免费下载链接】querido-diario📰 Diários oficiais brasileiros acessíveis a todos | 📰 Brazilian government gazettes, accessible to everyone.项目地址: https://gitcode.com/gh_mirrors/qu/querido-diario

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/446977/

相关文章:

  • 2026-03-07
  • 2026年北京海淀/朝阳/昌平继承律师事务所深度测评:从专业能力到服务体验的选型指南 - 小白条111
  • D++源码解析:深入理解高性能Discord机器人的底层实现
  • Crabviz开发者指南:如何为你的编辑器扩展贡献代码,支持更多语言
  • DeepSearcher终极指南:如何用AI实现多模态内容生成与智能检索
  • 小程序商城平台怎么选?一文看懂呱呱赞、有赞、微盟差别 - 企业数字化改造和转型
  • Nano Stores性能优化终极指南:如何通过原子化存储减少不必要的重渲染
  • 从零到一:2026版Visual Studio全栈开发环境搭建与C#实战入门
  • 2026年商旅公司排名一览表:5款高性价比工具助力企业差旅管理
  • K8s运行中文版WordPress
  • 10个必学Ponysay命令:让你的终端充满小马活力
  • 为什么Transactional-email-templates是事务性邮件开发的终极解决方案
  • Crescento性能优化指南:流畅运行在低端设备的秘诀
  • I.1 个人作业:阅读和提问
  • 深入解析:限制 Docker Desktop 的资源使用
  • 【Torch安装cuda版本】
  • 笔记之旋转矩阵Rotation Matrix《机器人学-林沛群》
  • [豪の算法奇妙冒险] 代码随想录算法训练营第五十二天 | Carl101-孤岛的总面积、Carl102-沉没孤岛、Carl103-水流问题、Carl104-建造最大岛屿
  • 2026年北京离婚律师深度测评:海淀/朝阳/西城TOP3律所的选型逻辑与实战能力拆解 - 小白条111
  • django-analytical高级用法:自定义用户追踪与事件分析实战教程
  • 公众号模板去哪找?2026年3个最佳公众号排版软件推荐 - 鹅鹅鹅ee
  • 2026公众号SVG动效工具推荐:5款专业工具助你排版升级 - 鹅鹅鹅ee
  • i.1.1 记录《现代软件工程讲义-构建之法》阅读与思考过程
  • OpenClaw数据库操作技能
  • 概率机器学习模型评估终极指南:pyprobml项目中的10个最佳实践
  • 重磅!腾讯 QQ 官方接入 OpenClaw“小龙虾”:一键创建机器人,1分钟极速部署!
  • win库社区贡献指南:如何参与项目开发与改进
  • 【机器学习算法】决策树和随机森林在计算机视觉中的应用
  • 终极Nano Stores测试指南:从零开始构建可靠状态管理测试策略
  • REAL-Video-Enhancer核心功能解析:从帧率插值到超分辨率的完整指南