爬虫案例-爬取某企数据

文章目录

      • 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、查看效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

足球 AI 智能体技术解析:从数据采集到比赛预测的全链路架构

一、引言 在足球运动数字化转型的浪潮中&#xff0c;AI 智能体正成为理解比赛、预测赛果的核心技术引擎。本文从工程实现角度&#xff0c;深度解析足球 AI 的技术架构&#xff0c;涵盖数据采集、特征工程、模型构建、实时计算到决策支持的全链路技术方案&#xff0c;揭示其背后…

怎么配置一个kubectl客户端访问多个k8s集群

怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群&#xff0c;因为有的是把~/.kube/config文件&#xff0c;改为了~/.kube/.config文件&#xff0c;文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑&#xff0c;kubectl找不到要访问集群…

[QMT量化交易小白入门]-四十六、年化收益率118%的回测参数,如何用贪心算法挑选50个两两相关性最小的ETF组合

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读准备工作安装所需库导入所需模块下载所有ETF数…

几何编码:启用矢量模式地理空间机器学习

在 ML 模型中使用点、线和多边形&#xff0c;将它们编码为捕捉其空间属性的向量。 自地理信息系统 (GIS) 诞生之初&#xff0c;“栅格模式”和“矢量模式”之间就存在着显著的区别。在栅格模式下&#xff0c;数据以值的形式呈现在规则的网格上。这包括任何形式的图像&#xff0…

Leetcode98、230:二叉搜索树——递归学习

什么是二叉搜索树&#xff1a;右子树节点 > 根节点 > 左子树节点&#xff0c; 二叉搜索树中的搜索&#xff0c;返回给定值val所在的树节点 终止条件为传进来的节点为空、或者节点的值 val值&#xff0c;返回这个节点&#xff1b; 单程递归逻辑&#xff1a;定义一个resu…

每天学一个 Linux 命令(30):cut

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/30/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…

Tauri 2.3.1+Leptos 0.7.8开发桌面应用--Sqlite数据库选中数据的表格输出

在前期工作的基础上&#xff08;Tauri 2.3.1Leptos 0.7.8开发桌面应用--Sqlite数据库的写入、展示和选择删除_tauri leptos sqlite 选择删除-CSDN博客&#xff09;&#xff0c;实现将选中的数据实时用表格展示出来&#xff0c;效果如下&#xff1a; 1. 后台invoke调用命令 Tau…

使用Tauri 2.3.1+Leptos 0.7.8开发桌面小程序汇总

近期断断续续学习了Rust编程&#xff0c;使用Tauri 2.3.1Leptos 0.7.8开发了一个自用的桌面小程序。Win10操作系统&#xff0c;使用VS Code及rust analyzer插件搭建的开发环境&#xff0c;后期开始使用Roo Code绑定DeepSeek API 辅助编程&#xff0c;对我这个初学者编程帮助很大…

考研英一学习笔记

2024 年全国硕士研究生招生考试 英语&#xff08;一&#xff09;试题 &#xff08;科目代码&#xff1a;201&#xff09; Section Ⅰ Use of English Directions: Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on the ANS…

【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置

【技术笔记】Cadence实现Orcad与Allegro软件交互式布局设置 更多内容见专栏&#xff1a;【硬件设计遇到了不少问题】、【Cadence从原理图到PCB设计】 在做硬件pcb设计的时候&#xff0c;原理图选中一个元器件&#xff0c;希望可以再PCB中可以直接选中。 为了达到原理图和PCB两两…

卷积神经网络(CNN)详解

文章目录 引言1.卷积神经网络&#xff08;CNN&#xff09;的诞生背景2.卷积神经网络&#xff08;CNN&#xff09;介绍2.1 什么是卷积神经网络&#xff1f;2.2 卷积神经网络&#xff08;CNN&#xff09;的基本特征2.2.1 局部感知&#xff08;Local Connectivity&#xff09;2.2.…

8051单片机所有Keil C51汇编伪指令和C语言关键字大全

8051单片机所有Keil C51汇编伪指令和C语言关键字大全 作者将狼才鲸创建日期2025-04-21 CSDN阅读地址&#xff1a;8051单片机所有Keil汇编伪指令和C语言关键字的详细解释 8051单片机所有Keil汇编伪指令和C语言关键字的详细解释&#xff0c;在Keil已安装文件夹D:\Keil_v5\C51\H…

机器视觉的智能手机屏贴合应用

在智能手机制造领域&#xff0c;屏幕贴合工艺堪称"微米级的指尖芭蕾"。作为影响触控灵敏度、显示效果和产品可靠性的关键工序&#xff0c;屏幕贴合精度直接决定了用户体验。传统人工对位方式已无法满足全面屏时代对极窄边框和超高屏占比的严苛要求&#xff0c;而Mast…

运维打铁:网络基础知识

文章目录 一、网络架构1. 网络架构图2. 各层级功能3. 机房网络常见问题及解决方案 二、交换技术1. 交换技术基础2. 交换技术分类3. 广播域相关概念4. ARP 协议5. 三层交换机6. VLAN&#xff08;虚拟局域网&#xff09; 三、路由技术1. 路由器端口类型及功能2. 路由器功能3. 路由…

使用C#和FFmpeg开发RTSP视频播放器的完整指南

RTSP(Real Time Streaming Protocol)是流媒体技术中广泛使用的协议&#xff0c;广泛应用于视频监控、视频会议和在线直播等领域。本文将详细介绍如何使用C#和FFmpeg开发一个功能完整的RTSP视频播放器&#xff0c;涵盖从环境搭建到核心功能实现的全部过程。 一、开发环境准备 …

前端基础之《Vue(9)—混入》

一、什么是混入 1、是一种代码复用的技巧 Vue组件是由若干选项组成的&#xff0c;向组件中混入可复用的选项。 2、作用 比如我封装两个组件&#xff0c;一个是A组件&#xff0c;一个是B组件&#xff0c;发现它里面有相同的选项&#xff0c;就可以用混用的方式来复用它。 二、…

Anything V4/V5 模型汇总

​​​​​​二次元风格生成扩散模型-anything-v4.0Stable Diffusion anything-v5-PrtRE模型介绍及使用深度探索 Anything V5&#xff1a;安装与使用全攻略anything-v5x0.25少儿插画_v1xyn-ai/anything-v4.0

一天学完Servlet!!!(万字总结)

文章目录 前言Servlet打印Hello ServletServlet生命周期 HttpServletRequest对象常用api方法请求乱码问题请求转发request域对象 HttpServletResponse对象响应数据响应乱码问题请求重定向请求转发与重定向区别 Cookie对象Cookie的创建与获取Cookie设置到期时间Cookie注意点Cook…

Springboot整合 xxljob,自定义添加、修改、删除、停止、启动任务

目录 一、模拟登录方式 二、注解方式 三、访问者调用 四、测试 本次自定义方式分为两种&#xff1a;一种是模拟登录&#xff0c;另一种是使用注解的方式 一、模拟登录方式 修改xxl-job-admin工程&#xff0c;在controller里面添加一个MyApiController&#xff0c;在里面添…