Python爬虫实战:5分钟搞定政府网站公开数据抓取(附完整代码)

发布时间:2026/7/24 17:03:09

Python爬虫实战:5分钟搞定政府网站公开数据抓取(附完整代码) Python爬虫实战5分钟高效抓取政府公开数据指南政府网站作为权威数据来源蕴藏着大量有价值的公开信息。对于数据分析师、市场研究人员或政策观察者来说能够快速获取这些结构化数据至关重要。本文将手把手教你用Python构建一个高效、合规的政府数据抓取工具整个过程仅需5分钟即可完成核心功能搭建。1. 准备工作与环境配置在开始编写爬虫之前我们需要确保开发环境准备就绪。推荐使用Python 3.8及以上版本这是目前大多数爬虫库支持最稳定的版本。首先安装必要的依赖库pip install requests beautifulsoup4 pandas这三个库构成了我们爬虫的基础工具链requests用于发送HTTP请求beautifulsoup4解析HTML文档pandas数据清洗和存储提示建议在虚拟环境中安装这些依赖避免污染全局Python环境。可以使用python -m venv myenv创建虚拟环境。政府网站通常采用以下几种数据提供方式静态HTML页面传统方式动态加载的JSON接口现代网站常用文件下载如Excel、PDF等我们将重点针对第二种情况——通过API接口获取JSON数据这是目前最高效的获取方式。2. 分析目标网站结构以某地方政府采购网为例我们需要获取其招标公告数据。打开浏览器开发者工具Chrome中按F12切换到Network选项卡然后刷新页面。观察网络请求特别关注XHR类型的请求这些通常是数据接口。找到类似/api/announcement/list这样的端点这就是我们的目标接口。关键参数通常包括pageSize每页数据量pageNum当前页码categoryId分类ID_t时间戳防缓存通过多次请求观察我们可以确定哪些参数是必需的哪些是可选的。例如参数名是否必需说明pageSize是每页返回记录数pageNum是当前页码_t是13位时间戳keyword否搜索关键词3. 构建请求头与参数政府网站通常对爬虫较为友好但仍需模拟浏览器行为以避免被拒绝服务。以下是一个典型的请求头配置headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Referer: https://www.example.gov.cn/, Accept: application/json, text/javascript, */*; q0.01, Accept-Language: zh-CN,zh;q0.9, Content-Type: application/x-www-form-urlencoded; charsetUTF-8 }对于POST请求我们需要构造表单数据。观察接口请求参数通常以form-data形式发送import time params { pageSize: 10, pageNum: 1, _t: int(time.time() * 1000) # 生成13位时间戳 }4. 发送请求与处理响应使用requests库发送POST请求import requests url https://www.example.gov.cn/api/announcement/list response requests.post(url, headersheaders, dataparams) if response.status_code 200: data response.json() print(f成功获取{len(data[list])}条数据) else: print(f请求失败状态码{response.status_code})处理返回的JSON数据时建议进行以下检查检查response.status_code确保请求成功检查返回数据是否包含预期的字段处理可能的分页逻辑5. 数据存储与后续处理获取到数据后我们可以选择多种存储方式。对于结构化数据Pandas提供了便捷的处理方法import pandas as pd # 假设data[list]是我们获取的数据列表 df pd.DataFrame(data[list]) # 保存为CSV文件 df.to_csv(government_data.csv, indexFalse, encodingutf_8_sig) # 保存为Excel文件 df.to_excel(government_data.xlsx, indexFalse)对于更复杂的场景可以考虑存储到数据库如MySQL、MongoDB定期增量更新添加数据清洗和转换逻辑6. 实战技巧与注意事项在实际操作中有几个关键点需要注意请求频率控制添加适当的延迟如time.sleep(1)避免短时间内发送大量请求错误处理网络异常捕获数据格式验证重试机制实现from retrying import retry retry(stop_max_attempt_number3, wait_fixed2000) def safe_request(url, headers, params): try: response requests.post(url, headersheaders, dataparams, timeout10) return response.json() except Exception as e: print(f请求异常{str(e)}) raise数据更新策略记录最后更新时间只获取新增或变更的数据避免重复处理相同数据合规性检查确认目标数据确实属于公开范围遵守网站的robots.txt规定不获取敏感或个人隐私信息7. 完整代码示例以下是一个完整的政府数据抓取示例包含了上述所有关键要素import requests import time import pandas as pd from retrying import retry # 配置请求头 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36, Referer: https://www.example.gov.cn/, Content-Type: application/x-www-form-urlencoded; charsetUTF-8 } # 重试装饰器 retry(stop_max_attempt_number3, wait_fixed2000) def fetch_data(page_num, page_size10): url https://www.example.gov.cn/api/announcement/list params { pageSize: page_size, pageNum: page_num, _t: int(time.time() * 1000) } try: response requests.post(url, headersheaders, dataparams, timeout10) response.raise_for_status() return response.json()[list] except Exception as e: print(f第{page_num}页获取失败: {str(e)}) return [] # 主程序 def main(): all_data [] for page in range(1, 6): # 获取前5页数据 print(f正在获取第{page}页数据...) page_data fetch_data(page) all_data.extend(page_data) time.sleep(1) # 礼貌性延迟 if all_data: df pd.DataFrame(all_data) df.to_csv(government_procurement.csv, indexFalse, encodingutf_8_sig) print(f成功保存{len(df)}条数据到CSV文件) else: print(未获取到有效数据) if __name__ __main__: main()这个脚本实现了分页数据获取请求重试机制错误处理数据存储请求频率控制在实际项目中根据具体需求可能需要调整参数或添加更多功能但这个框架已经涵盖了政府数据抓取的核心流程。

相关新闻