爬虫案例-爬取某企数据

news2025/5/18 20:12:38

文章目录

      • 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}")
                continue
            return valid_proxies
    except 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 default

    value = result[0]

    # 处理空值和类型转换
    if value is None:
        return default
    # 类型处理逻辑
    if strict_type:
        if isinstance(value, type(default)):
            return value
        return default
    try:
        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 = 3
    for 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)}
                    break

        except Exception as e:
            print(f"尝试 {attempt + 1}/{max_retries} 失败: {e}")
            time.sleep(10)
    return None


BATCH_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.coloradmin.cn/o/2341398.html

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

相关文章

学习笔记—C++—string(一)

目录 string 为什么学习string的类 string类的常用接口 string类对象的常见构造 string类对象的访问及遍历操作 operator[] 迭代器 范围for auto 迭代器&#xff08;二&#xff09; string类对象的容量操作 size,length,max_size,capacity,clear基本用法 reserve 提…

GPLT-2025年第十届团体程序设计天梯赛总决赛题解(共计266分)

今天偶然发现天梯赛的代码还保存着&#xff0c;于是决定写下这篇题解&#xff0c;也算是复盘一下了 L1本来是打算写的稳妥点&#xff0c;最后在L1-6又想省时间&#xff0c;又忘记了insert&#xff0c;replace这些方法怎么用&#xff0c;也不想花时间写一个文件测试&#xff0c…

MySQL数据库精研之旅第十期:打造高效联合查询的实战宝典(一)

专栏&#xff1a;MySQL数据库成长记 个人主页&#xff1a;手握风云 目录 一、简介 1.1. 为什么要使用联合查询 1.2. 多表联合查询时的计算 1.3. 示例 二、内连接 2.1. 语法 2.2. 示例 三、外连接 4.1. 语法 4.2. 示例 一、简介 1.1. 为什么要使用联合查询 一次查询需…

15.FineReport动态展示需要的列

1.首先连接自带的sqlite数据库&#xff0c;具体方法参考下面的链接 点击查看连接sqlite数据库 2.文件 – 新建普通报表 3.新建数据库查询 4.查询自带的销售明细表 5.把数据添加到格子中&#xff0c;并设置边框颜色等格式 6.查询新的数据集&#xff1a;column 7.点笔 8.全部添…

Windows云主机远程连接提示“出现了内部错误”

今天有人反馈说有个服务器突然连不上了&#xff0c;让我看下什么问题&#xff0c;我根据他给的账号密码试了下发现提示“出现了内部错误”&#xff0c;然后就是一通排查 先是查看安全组&#xff0c;没发现特别的问题&#xff0c;因为也没有调过这块的配置 然后通过控制台登录进…

最新扣子(Coze)案例教程:Excel数据生成统计图表,自动清洗数据+转换可视化图表+零代码,完全免费教程

大家好&#xff0c;我是斜杠君。 知识星球群有同学和我说每天的工作涉及很多数据表的重复操作&#xff0c;想学习Excel数据表通过大模型自动转数据图片的功能。 今天斜杠君就带大家一起搭建一个智能体&#xff0c;以一个销售行业数据为例&#xff0c;可以快速实现自动清洗Exc…

如何安装Visio(win10)

首先下载下面这些文件 HomeStudent2021Retail.img officedeploymenttool_17531-20046.exe office中文语言包.exe 确保这些文件都在一个文件夹内&#xff08;我已经上传这些资源&#xff0c;这些资源都是官网下载的&#xff09; 官网资源下载教程 1.下载Office镜像&#xff0…

建筑安全员 A 证与 C 证:差异决定职业方向

在建筑行业的职业发展道路上&#xff0c;安全员 A 证和 C 证就像两条不同的岔路&#xff0c;它们之间的差异&#xff0c;在很大程度上决定了从业者的职业方向。 从证书性质和用途来看&#xff0c;A 证是从业资格证书&#xff0c;更像是一把开启安全管理高层岗位的 “金钥匙”。…

(19)VTK C++开发示例 --- 分隔文本读取器

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 本例采用坐标和法线&#xff08;x y z nx ny nz&#xff09;的纯文本文件&#xff0c;并将它们读入vtkPolyData并显示…

Redis从入门到实战先导篇

前言&#xff1a;本节内容包括虚拟机VMware的安装&#xff0c;Linux系统的配置&#xff0c;FinalShell的下载与配置&#xff0c;Redis与其桌面客户端的安装指导,便于后续黑马Redis从入门到实战的课程学习 目录 主要内容 0.相关资源 1.VMware安装 2.Linux与CentOS安装 3.Fi…

JavaScript 防抖和节流

方法一&#xff1a;使用lodash库的debounce方法 方法二&#xff1a;手写防抖函数 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 应用启动过程中&#xff0c;会加载并处理多种 配置源&#xff08;如 application.properties、系统环境变量、命令行参数等&#xff09;。这些配置源会被封装为 PropertySource…

分割数据集中.json格式标签转化成伪彩图图像

一、前言 图像分割任务中&#xff0c;分割数据集的转换和表示方式对于模型训练至关重要。目前主要有两种常见的分割结果表示方法&#xff1a; 1. 转化为TXT文件 这种方式通常使用一系列的点&#xff08;坐标&#xff09;来表示图像中每个像素的类别标签。每个点通常包含像素…

Linux之彻底掌握防火墙-----安全管理详解

—— 小 峰 编 程 目录&#xff1a; 一、防火墙作用 二、防火墙分类 1、逻辑上划分&#xff1a;大体分为 主机防火墙 和 网络防火墙 2、物理上划分&#xff1a; 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…

# 构建和训练一个简单的CBOW词嵌入模型

构建和训练一个简单的CBOW词嵌入模型 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词嵌入是一种将词汇映射到连续向量空间的技术&#xff0c;这些向量能够捕捉词汇之间的语义关系。在这篇文章中&#xff0c;我们将构建和训练一个简单的Continuous Bag of Words…

Collection集合,List集合,set集合,Map集合

文章目录 集合框架认识集合集合体系结构Collection的功能常用功能三种遍历方式三种遍历方式的区别 List集合List的特点、特有功能ArrayList底层原理LinkedList底层原理LinkedList的应用场list:电影信息管理模块案例 Set集合set集合使用哈希值红黑树HashSet底层原理HashSet集合元…

使用DDR4控制器实现多通道数据读写(九)

一、本章概括 在上一节中&#xff0c;我们概括了工程的整体思路&#xff0c;并提供了工程框架&#xff0c;给出了读写DDR4寄存器的接口列表和重点时序图。当然&#xff0c;对于将DDR4内存封装成FIFO接口&#xff0c;其中的重点在于对于读写DDR4内存地址的控制&#xff0c;相对于…

深度解析n8n全自动AI视频生成与发布工作流

工作流模版地址&#xff1a;Fully Automated AI Video Generation & Multi-Platform Publishing | n8n workflow template 本文将全面剖析基于n8n平台的这个"全自动AI视频生成与多平台发布"工作流的技术架构、实现原理和关键节点&#xff0c;帮助开发者深入理解…

pycharm调试typescript

前言 搜索引擎搜索调试typescript&#xff0c;都是vscode&#xff0c;但是没看懂。 vscode界面简洁&#xff0c;但是适配起来用不习惯&#xff0c;还是喜欢用pycharm。 安装软件 安装Node.js https://nodejs.org/zh-cn 判断是否安装成功 node -v npm install -g typescrip…

spring-ai之Advisors API

1、 Spring AI Advisors API 提供了一种灵活而强大的方法来拦截、 修改和增强 Spring 应用程序中的 AI 驱动的交互。 通过利用 Advisors API&#xff0c;开发人员可以创建更复杂、可重用和可维护的 AI 组件。主要优势包括封装重复的生成式 AI 模式、转换发送到大型语言模型 &…