爬虫案例-爬取某企数据
文章目录
- 1、准备要爬取企业名称数据表
- 2、爬取代码
- 3、查看效果
1、准备要爬取企业名称数据表
| 企业名称 |
|---|
| 绍兴市袍江王新国家庭农场 |
| 绍兴市郑杜粮油专业合作社 |
| 绍兴市越城区兴华家庭农场 |
| 绍兴市越城区锐意家庭农场 |
| 绍兴市越城区青甸畈家庭农场 |
| 绍兴市袍江王新国家庭农场 |
| 绍兴市袍江月明家庭农场 |
| 绍兴市越城区夏景权鲜果园 |
| 绍兴市越城区匡群家庭农场 |
| 绍兴市袍江赵成兴家庭农场 |
| 绍兴市越城区真香果园 |
| 绍兴市越城区聚客来家庭农场 |
| 绍兴市越城区果真不错果园 |
| 绍兴市越城区亮丰家庭农场 |
| 绍兴县富盛镇北山粮油专业合作社 |
| 绍兴市袍江银军家庭农场 |
| 绍兴市袍江仲康家庭农场 |
| 绍兴市越城区娜家果园 |
| 绍兴市越城区建峰家庭农场 |
| 绍兴市越城区国信家庭农场 |
2、爬取代码
import time
import requests
from bs4 import BeautifulSoup
import re
import json
import pandas as pd
import jsonpath
from datetime import datetime
import random
from urllib3.exceptions import ConnectTimeoutError# 初始化会话和请求头
session = requests.Session()url = "https://www.qcc.com/web/search?"header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36 Edg/135.0.0.0","accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","accept-encoding": "gzip, deflate, br, zstd","accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","cookie": "" #填写自己cookie}proxy_url = 'http://api.89ip.cn/tqdl.html?api=1&num=60&port=&address=%E5%B9%BF%E4%B8%9C%E7%9C%81&isp='
test_url = 'http://httpbin.org/ip' # 用于测试代理是否有效的地址valid_proxies = []
# 获取有效代理池和构造代理字典
def get_valid_proxies():try:resp = requests.get(proxy_url, timeout=10)resp.raise_for_status()proxy_ips = re.findall(r'\d+\.\d+\.\d+\.\d+:\d+', resp.text)for ip in proxy_ips:proxy = {'http': f'http://{ip}', 'https': f'http://{ip}'}try:# 测试代理是否有效(设置短超时快速筛选)test_resp = requests.get(test_url, proxies=proxy, timeout=5)if test_resp.status_code == 200:valid_proxies.append(proxy)# 构造代理字典print( {'http': f'http://{ip}','https': f'http://{ip}'})except (requests.exceptions.ProxyError, ConnectTimeoutError, requests.exceptions.Timeout):#print(f"无效代理: {ip}")continuereturn valid_proxiesexcept Exception as e:print(f"获取代理失败: {e}")return None# 测试获取有效代理池
#get_valid_proxies()
#随机选择一个有效代理IP
def get_proxy():"""获取代理"""try:# 随机选择一个代理ip_port = random.choice(get_valid_proxies())print("选择的代理IP:", ip_port)except Exception as e:print(f"获取代理失败: {e}")return None# 初始化数据存储列表(放在循环外部)
company_data = []
# 读取Excel文件
red_execl= pd.read_excel(r"C:\Users\zzx\Desktop\浙江_绍兴_1.xlsx")company_names = red_execl.iloc[:,0].tolist()
#print(company_names)def safe_jsonpath(data, path, default="",strict_type=False):"""安全解析 JSONPath,返回第一个匹配值或默认值- 自动处理 None、空列表、类型不匹配- 根据 default 参数类型自动转换返回值类型"""result = jsonpath.jsonpath(data, path)# 处理无效路径或非列表结果if not isinstance(result,list) or len(result) == 0:return defaultvalue = result[0]# 处理空值和类型转换if value is None:return default# 类型处理逻辑if strict_type:if isinstance(value, type(default)):return valuereturn defaulttry:return type(default)(value) # 根据 default 的类型转换结果except (TypeError, ValueError,):return default
TAG_LIST = ["高新技术企业", "科技型中小企业", "专精特新小巨人企业","专精特新中小企业", "创新型中小企业", "制造业单项冠军企业","制造业单项冠军产品企业", "独角兽企业", "瞪羚企业", "企业技术中心","重点实验室", "技术创新示范企业", "技术先进型服务企业","众创空间", "隐形冠军企业"
]
def parse_tags(data):"""解析企业标签"""tags_info = safe_jsonpath(data, "$..TagsInfoV2", default=[])return { f"是否{tag}": "是" if any(t.get('Name') == tag for t in tags_info) else "否" for tag in TAG_LIST }def process_company_data(name):"""处理单个公司数据"""max_retries = 3for attempt in range(max_retries):try:proxies = get_proxy()'''proxies = {'http': 'http://120.24.73.25:8181','https': 'http://120.24.73.25:8181'}'''params = {"key": name}response = session.get(url,headers=header,params=params,proxies=proxies,timeout=10)#print(response.json())if response.status_code != 200:raise Exception(f"状态码: {response.status_code}")if "验证码" in response.text:raise Exception("触发反爬验证码")# 用BeautifulSoup提取所有<script>标签soup = BeautifulSoup(response.text, 'html.parser')#print(soup)scripts = soup.find_all('script')#print(scripts)# 正则匹配目标变量(例如window.__INITIAL_STATE__)pattern = re.compile(r'window\.__INITIAL_STATE__\s*=\s*({.*?});', re.DOTALL)for script in soup.find_all('script'):if script.string and (match := pattern.search(script.string)):data = json.loads(match.group(1))#print(data)#国标行业--码值credit_code = safe_jsonpath(data, "$..CreditCode", default="")#org_code = ""#if len(credit_code) >= 10: # 确保可以安全切片org_code = f"{credit_code[8:-2]}-{credit_code[-2]}"if credit_code else ""#成立日期处理start_date = safe_jsonpath(data, "$..StartDate",default=0)#formatted_date = ""#if isinstance(start_date, (int, float)) and start_date > 0:formatted_date = datetime.fromtimestamp(start_date / 1000).strftime("%Y-%m-%d")if start_date else ""#营业期限allottedSpan = safe_jsonpath(data, "$..allottedSpan",default=0)formatted_allottedSpan = datetime.fromtimestamp(allottedSpan / 1000).strftime("%Y-%m-%d")if allottedSpan else ""company_info = {"企业名称": re.sub(r'<[^>]+>', '', safe_jsonpath(data, "$..Name", default="")),"法定代表人": safe_jsonpath(data, "$..OperName", default=""),"登记状态": safe_jsonpath(data, "$..ShortStatus", default=""),"成立日期": formatted_date,"注册资本": safe_jsonpath(data, "$..RegistCapi", default=""),# "实缴资本":jsonpath.jsonpath(data,"$..RegistCapi")[0],# "人员":jsonpath.jsonpath(data,"$..companyScale")[0],"国标行业--码值": safe_jsonpath(data, "$..IndustryCode", default="") + safe_jsonpath(data, "$..SmallCategoryCode", default=""),"国标行业--中文": safe_jsonpath(data, "$..SmallCategory", default=""),"统一社会信用代码": safe_jsonpath(data, "$..CreditCode", default=""),"组织机构代码": org_code,"登记号": safe_jsonpath(data, "$..No", default=""),"纳税人识别号": safe_jsonpath(data, "$..CreditCode", default=""),#"纳税人资质": "一般纳税人","核准日期": safe_jsonpath(data, "$..CheckDate",default=""),"登记机关": safe_jsonpath(data, "$..City", default="") + safe_jsonpath(data, "$..County",default="") + "市场监督管理局","企业类型": safe_jsonpath(data, "$..EconKind", default=""),#"营业期限": formatted_allottedSpan ,"所属地区": safe_jsonpath(data, "$..Province", default="") + safe_jsonpath(data, "$..City",default="") + safe_jsonpath(data, "$..County", default=""),# "英文名": jsonpath.jsonpath(data, "$..EnglishName")[0],# "经营范围": jsonpath.jsonpath(data, "$..Scope")[0],"电话": safe_jsonpath(data, "$..ContactNumber", default=0),"注册地址": safe_jsonpath(data, "$..Address", default=""),"官网": safe_jsonpath(data, "$..GW", default=""),"邮箱": safe_jsonpath(data, "$..Email", default=""),"企业规模": safe_jsonpath(data, "$..Scale", default="")}print(company_info)#合并标签信息return {**company_info,**parse_tags(data)}breakexcept Exception as e:print(f"尝试 {attempt + 1}/{max_retries} 失败: {e}")time.sleep(10)return NoneBATCH_SIZE = 10 #
# 主处理循环
for index, name in enumerate(company_names):print(f"处理第 {index + 1} 家公司: {name}")# 获取公司数据info = process_company_data(name)if info:company_data.append(info)else:print(f"警告:{name} 数据为空")# 每处理10个公司保存一次if (index+1) % BATCH_SIZE == 0:pd.DataFrame(company_data).to_excel("temp_result.xlsx", index=False)# 随机延迟time.sleep(30 + random.randint(5, 15))
if company_data:df = pd.DataFrame(company_data)df.to_excel(r"C:\Users\zzx\Desktop\company_data.xlsx",index=False)print("数据添加成功")
else:print("所有公司数据获取失败")
3、查看效果
相关文章:
爬虫案例-爬取某企数据
文章目录 1、准备要爬取企业名称数据表2、爬取代码3、查看效果 1、准备要爬取企业名称数据表 企业名称绍兴市袍江王新国家庭农场绍兴市郑杜粮油专业合作社绍兴市越城区兴华家庭农场绍兴市越城区锐意家庭农场绍兴市越城区青甸畈家庭农场绍兴市袍江王新国家庭农场绍兴市袍江月明…...
VAE-LSTM异常检测模型复刻报告
VAE-LSTM异常检测模型复刻报告 复刻背景 本报告记录了我复刻VAE-LSTM异常检测模型的完整过程。原论文提出了一种结合变分自编码器(VAE)和长短期记忆网络(LSTM)的异常检测方法,用于时间序列数据。 环境配置 复刻过程中使用的环境配置如下: Python 3.…...
学习笔记—C++—string(一)
目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器(二) string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…...
OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…...
GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)
今天偶然发现天梯赛的代码还保存着,于是决定写下这篇题解,也算是复盘一下了 L1本来是打算写的稳妥点,最后在L1-6又想省时间,又忘记了insert,replace这些方法怎么用,也不想花时间写一个文件测试,…...
MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)
专栏:MySQL数据库成长记 个人主页:手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…...
zkPass案例实战之合约篇
目录 一、contracts/contracts/ProofVerifier.sol 1. License 和 Solidity 版本 2. 导入依赖 3. 合约声明和默认分配器地址 4. 验证证明 5. 验证分配器签名 6. 验证验证者签名 7. 签名前缀处理 8. 签名恢复 总结 二、contracts/contracts/SampleAttestation.sol 1. …...
15.FineReport动态展示需要的列
1.首先连接自带的sqlite数据库,具体方法参考下面的链接 点击查看连接sqlite数据库 2.文件 – 新建普通报表 3.新建数据库查询 4.查询自带的销售明细表 5.把数据添加到格子中,并设置边框颜色等格式 6.查询新的数据集:column 7.点笔 8.全部添…...
Windows云主机远程连接提示“出现了内部错误”
今天有人反馈说有个服务器突然连不上了,让我看下什么问题,我根据他给的账号密码试了下发现提示“出现了内部错误”,然后就是一通排查 先是查看安全组,没发现特别的问题,因为也没有调过这块的配置 然后通过控制台登录进…...
最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程
大家好,我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作,想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体,以一个销售行业数据为例,可以快速实现自动清洗Exc…...
如何安装Visio(win10)
首先下载下面这些文件 HomeStudent2021Retail.img officedeploymenttool_17531-20046.exe office中文语言包.exe 确保这些文件都在一个文件夹内(我已经上传这些资源,这些资源都是官网下载的) 官网资源下载教程 1.下载Office镜像࿰…...
建筑安全员 A 证与 C 证:差异决定职业方向
在建筑行业的职业发展道路上,安全员 A 证和 C 证就像两条不同的岔路,它们之间的差异,在很大程度上决定了从业者的职业方向。 从证书性质和用途来看,A 证是从业资格证书,更像是一把开启安全管理高层岗位的 “金钥匙”。…...
Java Arrays工具类解析(Java 8-17)
一、Arrays工具类概述 java.util.Arrays是Java集合框架中提供的数组操作工具类,包含各种静态方法用于操作数组(排序、搜索、比较、填充、复制等)。自Java 8到17版本,Arrays类不断增强了功能,特别是引入了并行操作和St…...
(19)VTK C++开发示例 --- 分隔文本读取器
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本例采用坐标和法线(x y z nx ny nz)的纯文本文件,并将它们读入vtkPolyData并显示…...
Redis从入门到实战先导篇
前言:本节内容包括虚拟机VMware的安装,Linux系统的配置,FinalShell的下载与配置,Redis与其桌面客户端的安装指导,便于后续黑马Redis从入门到实战的课程学习 目录 主要内容 0.相关资源 1.VMware安装 2.Linux与CentOS安装 3.Fi…...
WebSocket是h5定义的,双向通信,节省资源,更好的及时通信
浏览器和服务器之间的通信更便利,比http的轮询等效率提高很多, WebSocket并不是权限的协议,而是利用http协议来建立连接 websocket必须由浏览器发起请求,协议是一个标准的http请求,格式如下 GET ws://example.com:3…...
uniapp中使用<cover-view>标签
文章背景: uniapp中遇到了原生组件(canvas)优先级过高覆盖vant组件 解决办法: 使用<cover-view>标签 踩坑: 我想实现的是一个vant组件库中动作面板的效果,能够从底部弹出框,让用户进行选择,我直…...
JavaScript 防抖和节流
方法一:使用lodash库的debounce方法 方法二:手写防抖函数 function debounce(fn,t){// 1.声明一个定时器变量 因为需要多次赋值 使用let声明let timer // 返回一个匿名函数return function(){if(timer){// 如果定时器存在清除之前的定时器 clearTimeout(…...
Spring Boot 启动时 `converting PropertySource ... to ...` 日志详解
Spring Boot 启动时 converting PropertySource ... to ... 日志详解 1. 日志背景 在 Spring Boot 应用启动过程中,会加载并处理多种 配置源(如 application.properties、系统环境变量、命令行参数等)。这些配置源会被封装为 PropertySource…...
分割数据集中.json格式标签转化成伪彩图图像
一、前言 图像分割任务中,分割数据集的转换和表示方式对于模型训练至关重要。目前主要有两种常见的分割结果表示方法: 1. 转化为TXT文件 这种方式通常使用一系列的点(坐标)来表示图像中每个像素的类别标签。每个点通常包含像素…...
Linux之彻底掌握防火墙-----安全管理详解
—— 小 峰 编 程 目录: 一、防火墙作用 二、防火墙分类 1、逻辑上划分:大体分为 主机防火墙 和 网络防火墙 2、物理上划分: 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...
SwiftUI 常用控件简介
SwiftUI 是苹果公司推出的现代化声明式 UI 框架,用于构建 iOS、macOS、watchOS 和 tvOS 应用程序用户界面。以下是一些常用的 SwiftUI 控件: 1. 文本控件 Text: 显示一段文本。 2. 图像控件 Image: 显示图片,可以从系统图标、网络或本地资…...
HCIP-H12-821 核心知识梳理 (6)
ospf dr-priority命令默认值为1,取值范围为0~255.DHCPv6使用IPv6组播地址FF05::1:3用于中继代理和服务器之间的通信。VRF路由表里的OSPF外部路由允许被路由汇总(asbr-summary)在IS-IS网络中,直连的两台路由器不管是P2P网络类型或是Broadcast网…...
Docker 安装配置教程(配置国内源)
## 一、Windows 安装 Docker Desktop 1. 系统要求: - Windows 10 64位:专业版、企业版或教育版 - 必须开启 Hyper-V 和容器功能 - 至少 4GB 内存 2. 安装步骤: - 访问 Docker 官网下载 Docker Desktop - 双击安装程序 - 按照向导完成安装 - 重启电脑 ## 二、macOS 安装 Dock…...
初识分布式事务原理
事务是指符合ACID特性的操作就是事务,在同一个数据库中,如果要分别对表A和表B进行插入和删除操作,如果其中一个操作执行失败,可以对当前数据库进行回滚,使其回滚到执行操作前的状态,但是现有的系统架构都是…...
# 构建和训练一个简单的CBOW词嵌入模型
构建和训练一个简单的CBOW词嵌入模型 在自然语言处理(NLP)领域,词嵌入是一种将词汇映射到连续向量空间的技术,这些向量能够捕捉词汇之间的语义关系。在这篇文章中,我们将构建和训练一个简单的Continuous Bag of Words…...
Qt本地化-检测系统语言
获取系统语言,可以通过QLocale的接口 // 获取系统默认区域设置QLocale systemLocale QLocale::system();// 获取语言代码 (例如 "zh", "en", "ja" 等)QString language systemLocale.name().split(_).first(); //输出zh// 或者直接…...
Collection集合,List集合,set集合,Map集合
文章目录 集合框架认识集合集合体系结构Collection的功能常用功能三种遍历方式三种遍历方式的区别 List集合List的特点、特有功能ArrayList底层原理LinkedList底层原理LinkedList的应用场list:电影信息管理模块案例 Set集合set集合使用哈希值红黑树HashSet底层原理HashSet集合元…...
c++中iota容器和fill的区别
在C 中,std::iota 和 std::fill 都是标准库中的函数,用于对序列进行操作,它们的功能和用法如下: std::iota 功能:std::iota 函数用于将一个连续的递增序列赋值给指定范围的元素。它接受三个参数,第一个参…...
【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系
层叠,优先级与继承的关系 前文概括 【CSS】层叠,优先级与继承(一):超详细层叠知识点 【CSS】层叠、优先级与继承(二):超详细优先级知识点 【CSS】层叠,优先级与继承&am…...

