news 2026/6/12 22:05:59

Python 爬虫项目:企业工商信息简易采集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 开发终端中执行以下安装命令,网络卡顿可切换国内镜像源加速下载:

plaintext

pip 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 爬虫整体架构设计

结合简易采集的业务定位,本项目采用模块化单层架构,拆分五大功能模块,模块之间低耦合、逻辑清晰,便于修改与调试,整体执行链路为:参数输入→网络请求→页面解析→数据清洗→数据存储。

  1. 请求模块:统一封装网页请求方法,集成请求头伪装、超时控制、异常捕获、延时调用功能,统一处理网络交互逻辑。
  2. 查询跳转模块:接收待查询企业名称,拼接查询 URL,完成关键词提交与页面跳转,区分列表页与详情页两种返回结果。
  3. 数据解析模块:基于 BeautifulSoup 定位标签,提取原始工商文本,针对混杂文本使用正则表达式拆分字段,完成结构化提取。
  4. 数据清洗模块:去除文本中的空白字符、广告文案、无效符号,统一字段格式,保证输出数据规范统一。
  5. 存储与调度模块:实现 CSV 文件读写、表头管理、数据追加,同时作为程序入口,控制单条查询与批量查询的整体流程。

二、单企业工商信息精准采集(基础实战)

单企业信息采集是本项目的基础功能,适用于单点查询、信息核验场景。本节从页面标签定位、完整代码实现、代码原理拆解、常见问题排查四个维度进行讲解,逐步实现从请求到存储的全流程功能。

2.1 详情页标签定位

通过浏览器 F12 开发者工具进入元素面板,对企业详情页进行标签拆解,明确各工商字段对应的 HTML 节点。页面主体信息容器为 class 等于company-info的 div 标签,内部各字段布局规则如下:

  1. 企业名称:位于容器内 class 为info-name的 h1 标签;
  2. 统一社会信用代码:class 为info-code的 span 标签;
  3. 法定代表人:class 为info-person的 div 标签;
  4. 注册资本、成立日期、经营状态:集中在 class 为info-base的 div 标签内,文本内容连续排布,需正则拆分;
  5. 注册地址:class 为info-address的 div 标签;
  6. 经营范围: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/xhtml+xml,application/xml;q=0.9,*/*;q=0.9", "Accept-Language": "zh-CN,zh;q=0.9" } try: resp = requests.get(url=url, headers=headers, timeout=12) 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_first=False): """ 将单条企业数据写入CSV文件 :param data: 字典格式企业数据 :param file_path: 文件路径 :param is_first: 是否首次写入,控制表头 """ header = ["企业名称", "统一社会信用代码", "法定代表人", "注册资本", "成立日期", "经营状态", "注册地址", "经营范围"] with open(file_path, "a", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=header) 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_first=True) 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函数作为网络交互核心,在原有基础上补充了AcceptAccept-Language请求头,完整模拟主流浏览器的请求特征,进一步降低被拦截概率。timeout=12设置 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,多次运行程序不会清空已有数据。encoding="utf-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/xhtml+xml,application/xml;q=0.9,*/*;q=0.9", "Accept-Language": "zh-CN,zh;q=0.9" } try: resp = requests.get(url=url, headers=headers, timeout=12) 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_first=False): header = ["企业名称", "统一社会信用代码", "法定代表人", "注册资本", "成立日期", "经营状态", "注册地址", "经营范围"] with open(file_path, "a", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=header) 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_first=first_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 基础功能优化
  1. 外部列表导入:将待采集的企业 ID、企业名称存储在本地 TXT、CSV 文件中,程序读取文件内容生成列表,无需在代码内手动维护列表,适配上万条数据的大规模批量采集。
  2. 进度保存与断点续采:新增日志文件记录已完成采集的企业标识,程序意外中断后,下次运行读取日志,从断点位置继续采集,避免重复爬取与数据冗余。
  3. 结果分类存储:区分采集成功与采集失败的企业,分别写入不同文件,便于后期人工核对异常条目。
3.4.2 反爬强化优化
  1. 请求头轮替:除随机 UA 外,维护多组完整请求头,每次请求随机选取一组使用,进一步模拟不同客户端特征。
  2. IP 轮换:当采集体量较大、单 IP 频繁被限制时,接入代理 IP 池,每条请求切换代理地址,分散访问压力。
  3. 分时采集:将大批量企业列表拆分为多个子列表,分时段执行采集任务,避开站点访问高峰。

四、关键词搜索式工商信息采集拓展

部分工商站点不支持通过企业 ID 直接访问详情页,仅提供关键词搜索入口,需要先提交企业名称进行搜索,从搜索结果列表中进入详情页。本节基于现有框架拓展关键词搜索功能,实现 “关键词查询→结果列表解析→跳转详情页→提取数据” 的完整链路。

4.1 搜索页面分析

搜索功能采用 GET 请求,搜索关键词通过 URL 参数传递,搜索结果页以列表形式展示匹配企业,每条列表项包含企业名称与详情页链接。列表结构统一,所有结果项包裹在 class 为search-item的 div 标签内,详情页链接为标签内 a 标签的 href 属性。

4.2 关键词搜索采集核心代码片段

python

运行

# 关键词搜索函数,获取结果列表中的详情链接 def search_company(keyword): """ 根据企业名称关键词搜索,返回详情页链接列表 :param keyword: 企业名称关键词 :return: 详情页URL列表 """ search_url = f"https://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 高阶数据清洗方案

除基础空白字符清理外,工商数据还存在格式不统一、冗余备注、特殊符号等问题,针对不同字段制定专项清洗规则:

  1. 金额字段处理:注册资本存在 “万元”“人民币” 等单位标注,可通过正则提取纯数字,统一数值格式,便于后续数据统计分析。
  2. 日期字段标准化:部分成立日期格式混乱,可通过字符串截取、正则匹配统一为YYYY-MM-DD标准日期格式。
  3. 经营范围精简:经营范围文本较长,可根据业务需求过滤无关描述、精简内容,保留核心经营品类。
  4. 异常状态过滤:识别 “注销”“吊销”“停业” 等经营状态标记,可单独筛选标记异常经营企业。

5.2 多格式存储拓展

  1. JSON 存储:适合程序二次调用数据,使用json.dump将字典数据写入 JSON 文件,设置ensure_ascii=False保证中文正常显示。
  2. Excel 存储:借助 openpyxl 库直接生成 Excel 文件,支持单元格格式设置、样式美化,适配办公场景使用。
  3. 数据库存储:数据量达到千条及以上时,使用 pymysql 连接 MySQL 数据库,创建工商信息数据表,实现数据持久化与条件查询。

5.3 项目合规与运维规范

  1. 采集合规:仅采集平台对外公开的企业工商信息,严禁采集涉密信息、个人隐私信息,遵守站点 robots 协议与互联网相关法律法规。
  2. 运行规范:控制采集速度与总请求量,不恶意高频访问站点,避免对目标服务器造成负担。
  3. 版本维护:工商站点会不定期调整页面标签结构,建立版本记录,页面变更后及时修改标签定位与正则规则。
  4. 日志记录:增加日志功能,记录采集时间、企业名称、执行状态、异常信息,便于长期运维与问题追溯。

六、项目总结与拓展方向

6.1 项目总结

本项目完成了简易企业工商信息采集爬虫的全流程开发,覆盖单条精准采集、批量列表采集、关键词搜索采集三大主流使用场景,融合 requests 请求、BeautifulSoup 标签解析、正则文本处理、CSV 文件存储、异常处理、延时防爬等核心爬虫技术。

代码采用模块化设计,结构清晰、复用性强,新手可直接修改 URL、标签类名、正则规则适配不同工商查询站点。针对工商类站点的访问限制、页面文本混杂等典型问题,提供了对应的解决方案与故障排查思路,兼顾理论原理与落地实战。从业务角度而言,该爬虫可有效替代人工检索,大幅提升企业信息采集效率,适用于中小企业调研、客户名录整理、区域行业统计等多种业务场景。

6.2 功能与技术拓展方向

  1. 技术拓展:引入多线程、异步请求提升批量采集效率;对接代理 IP 池、验证码识别模块,应对高防护工商站点;使用 Selenium、Playwright 适配 JS 动态渲染的工商查询平台。
  2. 业务拓展:增加企业关联信息采集,如分支机构、股东信息、变更记录等;搭建简易查询工具,实现可视化关键词检索与数据导出;结合数据分析库,对采集的工商数据进行行业分布、注册资本规模等统计分析。
  3. 自动化运维拓展:结合定时任务工具,实现每日 / 每周自动增量采集新增企业信息;搭建简易管理后台,统一管理关键词列表、采集任务、数据文件。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 22:05:54

Python 爬虫项目:请求头与基础伪装技巧

前言 随着网络平台反爬体系不断完善,绝大多数网站都会对来访客户端进行身份校验。直接使用requests库默认配置发起请求,客户端标识、请求特征会被服务器快速识别为爬虫程序,进而出现请求拦截、状态码 403、页面跳转、IP 封禁等问题。请求头是…

作者头像 李华
网站建设 2026/6/12 21:58:08

如何精准控制Windows电脑风扇:FanControl完全配置指南

如何精准控制Windows电脑风扇:FanControl完全配置指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa…

作者头像 李华
网站建设 2026/6/12 21:57:06

别再乱拔线了!用Wireshark抓包分析USB PD的Soft Reset和Hard Reset全过程

深入解析USB PD协议中的Reset机制:从报文捕获到实战诊断当我们面对一个突然停止充电的USB-C设备时,大多数人的第一反应是反复插拔线缆。这种"物理疗法"虽然有时能解决问题,但对于真正理解USB Power Delivery(PD&#xf…

作者头像 李华
网站建设 2026/6/12 21:55:58

新手零踩坑|OpenClaw v2.7.9 最稳落地配置方案【附部署包】

📌前言 坐拥数十万GitHub星标的OpenClaw,重构本地智能体落地新模式。定制化整合部署包完成架构预编译、网关预设、技能插件预装,规避原版零散部署的兼容性隐患,支持私有化本地部署、多终端互联、飞书/企业微信等多渠道接入。依托…

作者头像 李华
网站建设 2026/6/12 21:51:00

PAR-CLIP-seq :描绘RNA-蛋白质相互作用图谱

PAR-CLIP-seq(Photoactivatable Ribonucleoside-Enhanced Crosslinking and lmmunoprecipitation sequencing)即基于光活化核糖核苷的交联和免疫沉淀测序技术[1],将具有光活性的核糖核苷类似物4sU掺入到新转录的RNA中,再通过分析碱…

作者头像 李华