Python 爬虫项目:企业工商信息简易采集 前言企业工商信息是商业调研、客户筛选、风险评估、行业分析等工作的核心基础数据包含企业名称、统一社会信用代码、注册地址、法定代表人、注册资本、经营状态、成立日期、经营范围等关键内容。传统人工检索、逐条复制信息的方式效率低下面对批量企业信息采集需求时难以满足业务时效要求。依托 Python 开发轻量化爬虫程序可实现公开工商信息的自动化批量抓取、结构化整理与本地存储大幅降低人力成本提升数据采集效率。本文聚焦公开可访问的企业工商信息查询站点打造简易型工商信息采集爬虫覆盖单企业精准查询、多企业批量遍历两类常用场景完整讲解页面分析、请求封装、数据提取、异常处理、数据持久化全流程。文中所用开发库及工具可通过以下官方链接查阅文档、获取安装资源 Python 官方标准库文档、requests 网络请求库、BeautifulSoup 网页解析库、lxml 解析引擎、re 正则表达式库、csv 数据存储库、time 时间处理库、random 随机数库、fake-useragent 请求头伪装库。全文结合实战代码、底层原理、问题排查、功能优化四大板块展开代码经过实测验证适配主流操作系统兼顾初学者上手与实际业务落地。同时针对工商类站点普遍存在的访问限制、页面结构不规则、信息字段混杂等问题给出对应解决方案所搭建的爬虫框架具备良好复用性修改页面定位规则后即可适配同类型多个工商查询平台。一、项目前期规划与环境准备1.1 业务需求梳理本次项目定位为简易企业工商信息采集爬虫区别于高并发、分布式商业爬虫主打轻量化、易部署、低门槛使用明确两大核心业务需求。 第一单条企业信息采集。输入企业名称或统一社会信用代码定向访问查询页面提取该企业全部公开工商字段适用于少量企业信息补录、单点信息核验场景。 第二批量企业信息采集。预设企业名称列表循环执行查询逻辑批量完成多条数据抓取并统一存储至本地文件适用于企业名录整理、区域企业信息普查等批量作业场景。结合公开工商站点展示规则本次采集目标字段统一规定为企业名称、统一社会信用代码、法定代表人、注册资本、成立日期、经营状态、注册地址、经营范围。所有数据均为平台对外公开内容采集过程严格遵循站点使用规范与网络相关法规。1.2 依赖库说明与环境部署本项目延续 Python 3.8 及以上运行环境依赖库分为 Python 标准库与第三方开源库两类标准库无需额外安装第三方库需通过 pip 工具完成部署。下表汇总所有依赖库的功能定位与具体应用场景表格库名称库类型核心功能应用场景requests第三方库发起 HTTP/HTTPS 请求获取网页源码访问工商查询页面、提交查询参数、拉取页面内容BeautifulSoup第三方库解析 HTML 页面标签定位文本内容从页面标签中提取法人、注册资本、地址等工商字段lxml第三方库高性能 HTML/XML 解析引擎提升复杂页面解析速度兼容格式不规范的网页代码fake-useragent第三方库随机生成浏览器身份标识伪装客户端请求头规避基础访问拦截机制re标准库正则表达式匹配、文本筛选与清洗剔除页面冗余字符、拆分混杂文本、精准提取数字与文本内容csv标准库读写 CSV 表格文件将结构化工商数据批量存储支持 Excel 直接打开编辑time标准库程序延时、时间戳获取设置访问间隔模拟人工操作行为规避访问频率限制random标准库生成随机数值构造随机延时时间避免固定访问节奏被风控识别若此前未安装对应第三方库可在终端、CMD 或 Python 开发终端中执行以下安装命令网络卡顿可切换国内镜像源加速下载plaintextpip install requests pip install beautifulsoup4 pip install lxml pip install fake-useragent安装完成后执行pip list核验库列表确认全部依赖安装成功即可进入后续开发环节。1.3 目标站点页面与访问规则分析工商信息查询类站点普遍采用关键词查询 结果展示的页面逻辑整体分为查询首页、列表页、企业详情页三层结构在编写代码前需完成全链路页面分析。首先是查询逻辑分析。站点查询功能基于 GET 或 POST 请求实现输入企业名称后前端将关键词提交至后端接口返回匹配的企业列表若名称精准匹配会直接跳转至企业详情页面。本次案例中目标站点查询请求为 GET 方式查询关键词通过 URL 参数传递结构清晰无复杂加密参数。其次是页面结构分析。企业详情页为静态 HTML 页面所有工商信息直接渲染在源码中不同字段分布在不同层级的 HTML 标签内部分字段存在文本混杂、换行分割的情况需要结合标签定位与正则表达式联合提取。页面核心信息均包裹在固定 class 属性的容器标签内子标签层级稳定适合自动化解析。最后是反爬与访问规则分析。该类站点为保障服务稳定性会限制单 IP 访问频率短时间内连续发起大量查询请求会触发临时访问限制表现为页面加载缓慢、返回提示文案或直接阻断访问。站点仅校验基础 User-Agent 请求头无 Cookie、Token、验证码等高阶防护仅需配置请求头并添加合理延时即可正常稳定采集数据。1.4 爬虫整体架构设计结合简易采集的业务定位本项目采用模块化单层架构拆分五大功能模块模块之间低耦合、逻辑清晰便于修改与调试整体执行链路为参数输入→网络请求→页面解析→数据清洗→数据存储。请求模块统一封装网页请求方法集成请求头伪装、超时控制、异常捕获、延时调用功能统一处理网络交互逻辑。查询跳转模块接收待查询企业名称拼接查询 URL完成关键词提交与页面跳转区分列表页与详情页两种返回结果。数据解析模块基于 BeautifulSoup 定位标签提取原始工商文本针对混杂文本使用正则表达式拆分字段完成结构化提取。数据清洗模块去除文本中的空白字符、广告文案、无效符号统一字段格式保证输出数据规范统一。存储与调度模块实现 CSV 文件读写、表头管理、数据追加同时作为程序入口控制单条查询与批量查询的整体流程。二、单企业工商信息精准采集基础实战单企业信息采集是本项目的基础功能适用于单点查询、信息核验场景。本节从页面标签定位、完整代码实现、代码原理拆解、常见问题排查四个维度进行讲解逐步实现从请求到存储的全流程功能。2.1 详情页标签定位通过浏览器 F12 开发者工具进入元素面板对企业详情页进行标签拆解明确各工商字段对应的 HTML 节点。页面主体信息容器为 class 等于company-info的 div 标签内部各字段布局规则如下企业名称位于容器内 class 为info-name的 h1 标签统一社会信用代码class 为info-code的 span 标签法定代表人class 为info-person的 div 标签注册资本、成立日期、经营状态集中在 class 为info-base的 div 标签内文本内容连续排布需正则拆分注册地址class 为info-address的 div 标签经营范围class 为info-range的 div 标签内容存在换行与空格。依据以上标签规则即可编写对应的标签定位代码完成字段提取。2.2 单企业采集完整代码python运行# 导入所需库文件 import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent import re import csv import time import random # 初始化全局对象与基础配置 ua UserAgent() # 企业详情页基础URL模板 detail_base_url https://xxx.com/company/{} # 数据存储文件路径 save_path 单企业工商信息.csv # 1. 封装通用网络请求函数 def get_html(url): 发起网络请求获取页面HTML源码 :param url: 目标页面地址 :return: 成功返回源码字符串失败返回None headers { User-Agent: ua.random, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.9, Accept-Language: zh-CN,zh;q0.9 } try: resp requests.get(urlurl, headersheaders, timeout12) resp.encoding utf-8 if resp.status_code 200: return resp.text else: print(f请求失败状态码{resp.status_code}) return None except Exception as e: print(f网络请求异常{str(e)}) return None # 2. 数据清洗函数 def clean_text(text): 清洗文本去除首尾空白、换行、制表符 :param text: 原始文本 :return: 清洗后纯文本 if not text: return # 去除换行、制表符、全角/半角空格 text re.sub(r[\n\r\t ], , text.strip()) return text # 3. 解析企业详情页提取工商数据 def parse_company_info(html): 解析HTML源码提取结构化工商信息 :param html: 详情页源码 :return: 字典格式的企业工商数据 info_data {} soup BeautifulSoup(html, lxml) # 定位主体信息容器 main_box soup.find(div, class_company-info) if not main_box: return None # 提取企业名称 name_tag main_box.find(h1, class_info-name) info_data[企业名称] clean_text(name_tag.get_text()) if name_tag else # 提取统一社会信用代码 code_tag main_box.find(span, class_info-code) info_data[统一社会信用代码] clean_text(code_tag.get_text()) if code_tag else # 提取法定代表人 person_tag main_box.find(div, class_info-person) info_data[法定代表人] clean_text(person_tag.get_text()) if person_tag else # 提取注册地址 addr_tag main_box.find(div, class_info-address) info_data[注册地址] clean_text(addr_tag.get_text()) if addr_tag else # 提取经营范围 range_tag main_box.find(div, class_info-range) info_data[经营范围] clean_text(range_tag.get_text()) if range_tag else # 拆分混杂的基础信息注册资本、成立日期、经营状态 base_tag main_box.find(div, class_info-base) if base_tag: base_text clean_text(base_tag.get_text()) # 正则匹配注册资本 capital_res re.search(r注册资本[:](.*?)成立日期, base_text) info_data[注册资本] capital_res.group(1) if capital_res else # 正则匹配成立日期 date_res re.search(r成立日期[:](.*?)经营状态, base_text) info_data[成立日期] date_res.group(1) if date_res else # 正则匹配经营状态 status_res re.search(r经营状态[:](.*?)$, base_text) info_data[经营状态] status_res.group(1) if status_res else else: info_data[注册资本] info_data[成立日期] info_data[经营状态] return info_data # 4. 数据写入CSV文件函数 def write_to_csv(data, file_path, is_firstFalse): 将单条企业数据写入CSV文件 :param data: 字典格式企业数据 :param file_path: 文件路径 :param is_first: 是否首次写入控制表头 header [企业名称, 统一社会信用代码, 法定代表人, 注册资本, 成立日期, 经营状态, 注册地址, 经营范围] with open(file_path, a, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesheader) if is_first: writer.writeheader() writer.writerow(data) # 5. 单企业查询主函数 def single_company_spider(company_id): 单企业信息采集入口 :param company_id: 企业页面唯一标识 print(开始采集单企业工商信息......) # 拼接详情页URL url detail_base_url.format(company_id) html get_html(url) if not html: print(页面源码获取失败程序终止) return # 解析数据 company_data parse_company_info(html) if not company_data: print(未解析到有效工商信息) return # 写入文件首次写入添加表头 write_to_csv(company_data, save_path, is_firstTrue) print(单企业工商信息采集完成) print(采集数据详情) for k, v in company_data.items(): print(f{k}{v}) # 程序执行入口 if __name__ __main__: # 传入企业页面标识替换为实际目标值即可运行 target_company_id 100001 single_company_spider(target_company_id)2.3 代码模块原理详解2.3.1 基础配置与库导入原理代码开头按规范依次导入标准库与第三方库UserAgent实例化后调用ua.random随机生成浏览器标识规避单一 UA 被识别为爬虫的问题。detail_base_url采用字符串占位符设计工商站点的企业详情页通常以 ID、编码作为 URL 唯一参数通过模板拼接可快速切换不同企业页面提升代码通用性。save_path统一管理存储文件路径后续修改存储位置仅需调整该变量。2.3.2 网络请求函数原理get_html函数作为网络交互核心在原有基础上补充了Accept、Accept-Language请求头完整模拟主流浏览器的请求特征进一步降低被拦截概率。timeout12设置 12 秒请求超时防止网络异常导致程序卡死。try...except异常捕获机制覆盖断网、连接失败、服务器无响应等问题保证程序不会因单次请求异常直接崩溃。同时手动指定页面编码为 utf-8彻底解决中文乱码问题适配国内绝大多数工商类站点。2.3.3 文本清洗函数原理工商信息页面普遍存在换行、空格、制表符等无效空白字符部分标签内文本还会夹杂多余分隔符号。clean_text函数依托正则表达式re.sub全局匹配各类空白字符并替换为空字符串完成文本标准化处理。该函数为通用清洗方法在所有文本提取环节统一调用保证全字段格式一致避免因格式杂乱影响后续查看与数据分析。同时增加空值判断防止空文本触发正则运行异常。2.3.4 页面解析函数原理parse_company_info是提取工商数据的核心逻辑分为标签直接提取与正则拆分两大模式。对于独立标签存储的企业名称、信用代码、法人、地址、经营范围直接通过find方法定位标签并提取文本逻辑简单且稳定性强。针对多字段混杂在同一标签的注册资本、成立日期、经营状态单纯标签定位无法拆分内容因此使用正则表达式re.search进行分组匹配。正则表达式根据页面固定分隔符编写依次截取对应字段内容group(1)提取匹配到的分组文本。同时增加匹配结果判断若字段缺失或正则匹配失败则赋值为空字符串避免程序抛出索引错误提升代码容错能力。所有提取的字段统一存入字典键名对应 CSV 表头实现数据结构化为后续存储提供标准格式。2.3.5 数据存储函数原理write_to_csv基于csv.DictWriter实现字典数据写入适配当前字典格式的工商数据。文件打开模式设置为追加模式a多次运行程序不会清空已有数据。encodingutf-8-sig专门适配 Windows 系统下 Excel 软件解决中文乱码问题newline消除 CSV 文件多余空行。is_first标记用于控制表头写入仅第一次存储数据时生成表头后续数据直接追加防止表头重复。2.3.6 主调度函数原理single_company_spider为单条采集的调度入口按照「拼接 URL→获取源码→解析数据→写入文件」的标准链路执行。每一步均增加空值校验上一环节执行失败则直接终止当前流程并给出提示信息方便开发者快速定位故障点。采集完成后循环打印所有字段内容实现数据可视化核验。2.4 单企业采集常见故障与解决方案结合工商站点特性与代码运行场景整理高频故障现象、成因及对应解决办法如下表所示表格故障现象故障原因解决方案请求返回空白页面或 403 状态码请求头不完善站点拦截陌生客户端补充 Accept、Accept-Language 等请求头更换随机 UA部分字段内容为空标签 class 名称书写错误、页面结构变更重新查看开发者工具核对标签属性区分大小写混杂字段解析失败全部为空正则表达式与页面文本分隔符不匹配复制页面原始文本重新编写正则匹配规则Excel 打开 CSV 文件中文乱码文件编码配置错误固定使用 utf-8-sig 编码写入文件程序长时间无响应未设置请求超时网络连接阻塞在 requests.get 中添加 timeout 参数三、批量企业工商信息采集进阶实战单条采集仅适用于少量信息查询实际业务中更多需要批量采集多家企业数据。本节基于上文基础代码进行迭代开发批量采集功能支持自定义企业标识列表、循环查询、自动延时、批量存储同时增加循环异常处理保障批量任务稳定运行。3.1 批量采集逻辑设计批量采集在单条采集的基础上增加循环遍历逻辑整体流程为定义待采集企业 ID 列表→循环遍历列表中每一个标识→依次执行请求、解析、存储逻辑→单次采集完成后添加随机延时→全部遍历完成后结束程序。针对工商站点访问频率限制批量场景必须强化延时策略采用 2 至 4 秒随机休眠模拟人工间歇查询行为避免短时间高频访问触发站点限制。同时在循环内部增加异常捕获某一条企业信息采集失败时仅跳过当前条目不中断整个批量任务。3.2 批量采集完整代码python运行import requests from bs4 import BeautifulSoup from fake_useragent import UserAgent import re import csv import time import random # 全局配置 ua UserAgent() detail_base_url https://xxx.com/company/{} batch_save_path 批量企业工商信息.csv # 文本清洗函数 def clean_text(text): if not text: return text re.sub(r[\n\r\t ], , text.strip()) return text # 网络请求函数 def get_html(url): headers { User-Agent: ua.random, Accept: text/html,application/xhtmlxml,application/xml;q0.9,*/*;q0.9, Accept-Language: zh-CN,zh;q0.9 } try: resp requests.get(urlurl, headersheaders, timeout12) resp.encoding utf-8 if resp.status_code 200: return resp.text else: print(f页面请求异常状态码{resp.status_code}) return None except Exception as e: print(f网络请求异常{str(e)}) return None # 页面解析函数 def parse_company_info(html): info_data {} soup BeautifulSoup(html, lxml) main_box soup.find(div, class_company-info) if not main_box: return None # 提取基础字段 name_tag main_box.find(h1, class_info-name) info_data[企业名称] clean_text(name_tag.get_text()) if name_tag else code_tag main_box.find(span, class_info-code) info_data[统一社会信用代码] clean_text(code_tag.get_text()) if code_tag else person_tag main_box.find(div, class_info-person) info_data[法定代表人] clean_text(person_tag.get_text()) if person_tag else addr_tag main_box.find(div, class_info-address) info_data[注册地址] clean_text(addr_tag.get_text()) if addr_tag else range_tag main_box.find(div, class_info-range) info_data[经营范围] clean_text(range_tag.get_text()) if range_tag else # 拆分混杂字段 base_tag main_box.find(div, class_info-base) if base_tag: base_text clean_text(base_tag.get_text()) capital_res re.search(r注册资本[:](.*?)成立日期, base_text) info_data[注册资本] capital_res.group(1) if capital_res else date_res re.search(r成立日期[:](.*?)经营状态, base_text) info_data[成立日期] date_res.group(1) if date_res else status_res re.search(r经营状态[:](.*?)$, base_text) info_data[经营状态] status_res.group(1) if status_res else else: info_data[注册资本] info_data[成立日期] info_data[经营状态] return info_data # CSV写入函数 def write_to_csv(data, file_path, is_firstFalse): header [企业名称, 统一社会信用代码, 法定代表人, 注册资本, 成立日期, 经营状态, 注册地址, 经营范围] with open(file_path, a, encodingutf-8-sig, newline) as f: writer csv.DictWriter(f, fieldnamesheader) if is_first: writer.writeheader() writer.writerow(data) # 批量采集主函数 def batch_company_spider(id_list): 批量采集多家企业工商信息 :param id_list: 企业页面标识列表 if not id_list: print(企业标识列表为空任务终止) return print(f批量采集任务启动总计待采集企业数量{len(id_list)}) # 标记是否首次写入文件 first_flag True # 遍历企业ID列表 for index, cid in enumerate(id_list): print(f\n正在采集第{index 1}家企业标识编号{cid}) try: # 拼接URL并请求页面 url detail_base_url.format(cid) html get_html(url) if not html: print(f第{index 1}家企业页面获取失败跳过当前条目) # 随机延时后继续下一条 time.sleep(random.uniform(2, 4)) continue # 解析数据 company_data parse_company_info(html) if not company_data: print(f第{index 1}家企业无有效工商数据跳过当前条目) time.sleep(random.uniform(2, 4)) continue # 写入数据 write_to_csv(company_data, batch_save_path, is_firstfirst_flag) if first_flag: first_flag False print(f第{index 1}家企业采集完成) except Exception as e: print(f第{index 1}家企业采集出现未知异常{str(e)}自动跳过) # 全局随机延时控制访问频率 sleep_sec random.uniform(2, 4) time.sleep(sleep_sec) print(f延时{round(sleep_sec, 2)}秒准备下一条采集) print(\n 全部批量采集任务执行完毕 ) if __name__ __main__: # 自定义待采集企业页面标识列表根据实际需求增删内容 target_id_list [100001, 100002, 100003, 100004, 100005] batch_company_spider(target_id_list)3.3 批量采集新增功能原理讲解3.3.1 列表遍历逻辑原理批量采集核心依托for循环遍历企业标识列表结合enumerate函数同时获取索引与企业 ID索引用于实时展示当前采集进度方便运维人员掌握任务执行情况。程序首先校验列表是否为空空列表直接终止任务避免无效循环运行。3.3.2 分层异常处理原理代码设置两层异常防护机制第一层为流程判断页面获取失败、解析无数据时打印提示信息并执行延时跳过当前条目进入下一次循环第二层为全局try...except捕获未知异常应对页面结构突变、网络突发故障等不可预见问题确保单条数据故障不会导致整个批量任务中断大幅提升批量采集的稳定性。3.3.3 延时策略优化原理批量场景下访问频率管控是重中之重本案例设置2 至 4 秒随机延时放置在循环末尾每完成一条企业信息采集均执行休眠操作。随机延时打破固定访问节奏模拟人工间歇性查询的行为特征有效规避站点基于访问频率的风控拦截。延时区间可根据目标站点松紧程度灵活调整防护严格的站点可适当延长延时时间。3.3.4 表头复用逻辑原理first_flag全局标记仅在第一条数据写入时开启表头生成功能后续循环自动关闭保证整个批量文件仅有唯一一组表头文件格式规范统一便于后续数据统计与查阅。3.4 批量采集优化方向与进阶技巧3.4.1 基础功能优化外部列表导入将待采集的企业 ID、企业名称存储在本地 TXT、CSV 文件中程序读取文件内容生成列表无需在代码内手动维护列表适配上万条数据的大规模批量采集。进度保存与断点续采新增日志文件记录已完成采集的企业标识程序意外中断后下次运行读取日志从断点位置继续采集避免重复爬取与数据冗余。结果分类存储区分采集成功与采集失败的企业分别写入不同文件便于后期人工核对异常条目。3.4.2 反爬强化优化请求头轮替除随机 UA 外维护多组完整请求头每次请求随机选取一组使用进一步模拟不同客户端特征。IP 轮换当采集体量较大、单 IP 频繁被限制时接入代理 IP 池每条请求切换代理地址分散访问压力。分时采集将大批量企业列表拆分为多个子列表分时段执行采集任务避开站点访问高峰。四、关键词搜索式工商信息采集拓展部分工商站点不支持通过企业 ID 直接访问详情页仅提供关键词搜索入口需要先提交企业名称进行搜索从搜索结果列表中进入详情页。本节基于现有框架拓展关键词搜索功能实现 “关键词查询→结果列表解析→跳转详情页→提取数据” 的完整链路。4.1 搜索页面分析搜索功能采用 GET 请求搜索关键词通过 URL 参数传递搜索结果页以列表形式展示匹配企业每条列表项包含企业名称与详情页链接。列表结构统一所有结果项包裹在 class 为search-item的 div 标签内详情页链接为标签内 a 标签的 href 属性。4.2 关键词搜索采集核心代码片段python运行# 关键词搜索函数获取结果列表中的详情链接 def search_company(keyword): 根据企业名称关键词搜索返回详情页链接列表 :param keyword: 企业名称关键词 :return: 详情页URL列表 search_url fhttps://xxx.com/search?kw{keyword} html get_html(search_url) if not html: return [] soup BeautifulSoup(html, lxml) item_list soup.find_all(div, class_search-item) link_list [] for item in item_list: a_tag item.find(a) if a_tag and a_tag.get(href): # 拼接完整详情页链接 full_link https://xxx.com a_tag.get(href) link_list.append(full_link) return link_list # 关键词查询主函数 def search_spider(keyword): print(f正在搜索关键词{keyword}) link_list search_company(keyword) if not link_list: print(未查询到相关企业信息) return print(f共查询到{len(link_list)}条相关企业开始采集数据) first_flag True for link in link_list: html get_html(link) if not html: print(f链接{link}访问失败) time.sleep(random.uniform(2, 3)) continue data parse_company_info(html) if data: write_to_csv(data, 关键词搜索工商信息.csv, first_flag) if first_flag: first_flag False print(f{data[企业名称]} 采集完成) time.sleep(random.uniform(2, 3)) print(关键词搜索采集任务结束)4.3 搜索功能运行原理search_company函数拼接搜索 URL 并发起请求解析搜索结果列表提取每一条企业对应的详情页相对链接拼接域名生成完整 URL 并存入列表。主函数遍历链接列表依次访问详情页、提取数据并存储实现从关键词到工商数据的全链路采集。该模式适配绝大多数仅提供搜索入口的工商查询平台拓展了爬虫的适用范围。五、工商信息爬虫数据处理与落地规范5.1 高阶数据清洗方案除基础空白字符清理外工商数据还存在格式不统一、冗余备注、特殊符号等问题针对不同字段制定专项清洗规则金额字段处理注册资本存在 “万元”“人民币” 等单位标注可通过正则提取纯数字统一数值格式便于后续数据统计分析。日期字段标准化部分成立日期格式混乱可通过字符串截取、正则匹配统一为YYYY-MM-DD标准日期格式。经营范围精简经营范围文本较长可根据业务需求过滤无关描述、精简内容保留核心经营品类。异常状态过滤识别 “注销”“吊销”“停业” 等经营状态标记可单独筛选标记异常经营企业。5.2 多格式存储拓展JSON 存储适合程序二次调用数据使用json.dump将字典数据写入 JSON 文件设置ensure_asciiFalse保证中文正常显示。Excel 存储借助 openpyxl 库直接生成 Excel 文件支持单元格格式设置、样式美化适配办公场景使用。数据库存储数据量达到千条及以上时使用 pymysql 连接 MySQL 数据库创建工商信息数据表实现数据持久化与条件查询。5.3 项目合规与运维规范采集合规仅采集平台对外公开的企业工商信息严禁采集涉密信息、个人隐私信息遵守站点 robots 协议与互联网相关法律法规。运行规范控制采集速度与总请求量不恶意高频访问站点避免对目标服务器造成负担。版本维护工商站点会不定期调整页面标签结构建立版本记录页面变更后及时修改标签定位与正则规则。日志记录增加日志功能记录采集时间、企业名称、执行状态、异常信息便于长期运维与问题追溯。六、项目总结与拓展方向6.1 项目总结本项目完成了简易企业工商信息采集爬虫的全流程开发覆盖单条精准采集、批量列表采集、关键词搜索采集三大主流使用场景融合 requests 请求、BeautifulSoup 标签解析、正则文本处理、CSV 文件存储、异常处理、延时防爬等核心爬虫技术。代码采用模块化设计结构清晰、复用性强新手可直接修改 URL、标签类名、正则规则适配不同工商查询站点。针对工商类站点的访问限制、页面文本混杂等典型问题提供了对应的解决方案与故障排查思路兼顾理论原理与落地实战。从业务角度而言该爬虫可有效替代人工检索大幅提升企业信息采集效率适用于中小企业调研、客户名录整理、区域行业统计等多种业务场景。6.2 功能与技术拓展方向技术拓展引入多线程、异步请求提升批量采集效率对接代理 IP 池、验证码识别模块应对高防护工商站点使用 Selenium、Playwright 适配 JS 动态渲染的工商查询平台。业务拓展增加企业关联信息采集如分支机构、股东信息、变更记录等搭建简易查询工具实现可视化关键词检索与数据导出结合数据分析库对采集的工商数据进行行业分布、注册资本规模等统计分析。自动化运维拓展结合定时任务工具实现每日 / 每周自动增量采集新增企业信息搭建简易管理后台统一管理关键词列表、采集任务、数据文件。