一场始于 Selector Error 的拯救行动:企查查数据采集故障排查记

爬虫代理

时间轴呈现事故进程

  • 17:00:开发人员小李正在尝试利用 Python 爬虫从企查查(https://www.qcc.com)抓取公司工商信息。原本一切正常,但突然发现信息采集失败,程序抛出大量选择器错误。
  • 17:15:小李发现,尽管请求能正常返回 HTML 页面,但关键数据(公司名称、法人代表、注册资本)的定位选择器失效,抓取到的内容为空或错误。初步判断是网页结构发生了不可预料的变化。
  • 17:30:尝试更新选择器,但新问题接踵而至:动态加载的内容无法被解析,数据仍然缺失。

分析式线索追踪

本地测试日志片段

# 爬虫日志输出
[17:15:23] INFO - 发送 GET 请求至 https://www.qcc.com,状态码 200,请求成功。
[17:15:25] ERROR - 选择器失效!无法找到公司名称元素 (selector: #companyName)。
[17:15:30] DEBUG - HTML 快照保存至 ./snapshots/qcc_17_15_25.html,便于后续分析。

网页结构与选择器对比

  • 原始选择器<font style="color:rgb(38, 38, 38);">#companyName</font> 用于定位公司名称。
  • 快照 HTML 分析:发现 <font style="color:rgb(38, 38, 38);"><div id="companyName"></font> 标签已不存在,取而代之的是动态加载的 <font style="color:rgb(38, 38, 38);"><div class="loader"></font><font style="color:rgb(38, 38, 38);"><script></font> 标签。

解决方案探寻过程

  1. 重新审视网页加载过程
    • 使用浏览器开发者工具(F12)查看网页加载流程,发现关键信息是通过 JavaScript 动态渲染的,原先的静态 HTML 并不含有所需数据。
    • 临时策略:引入 Selenium 模拟浏览器行为,确保 JavaScript 执行,完整加载页面。
  2. 代理 IP 与反爬机制突破
# 引入爬虫代理 IP配置
proxies = {'http': 'http://用户名:密码@域名:端口','https': 'https://用户名:密码@域名:端口',
}
response = requests.get(url, proxies=proxies)
- <font style="color:rgb(38, 38, 38);">企查查对频繁请求有严格限制,需借助代理 IP。参考亿牛云爬虫代理参数(域名、端口、用户名、密码),设置代码:</font>
  1. Cookie 和 User-Agent 设置
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Cookie': 'your-cookie-string'  # 替换为实际有效 Cookie
}
- <font style="color:rgb(38, 38, 38);">仿制正常浏览器行为,避免被服务器识别为爬虫:</font>
  1. 调试选择器工具选择
    • 使用 BeautifulSoup 或 lxml 库解析渲染后的 HTML,结合 XPath 和 CSS 选择器重新定位元素。

改进后的代码实现

# 企查查数据采集解决方案
import requests
from bs4 import BeautifulSoup# 设置代理IP(亿牛云爬虫代理示例 www.16yun.cn)
PROXY_USERNAME = '16YUN'  # 替换为实际用户名
PROXY_PASSWORD = '16IP'  # 替换为实际密码
PROXY_DOMAIN = 'proxy.16yun.cn'
PROXY_PORT = '8080'# 配置代理
proxies = {'http': f'http://{PROXY_USERNAME}:{PROXY_PASSWORD}@{PROXY_DOMAIN}:{PROXY_PORT}','https': f'https://{PROXY_USERNAME}:{PROXY_PASSWORD}@{PROXY_DOMAIN}:{PROXY_PORT}',
}# 设置请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36','Cookie': 'your-cookie-string'  # 替换为实际有效的 Cookie
}# 爬取目标 URL
url = "https://www.qcc.com"# 发送请求
response = requests.get(url, headers=headers, proxies=proxies)
response.encoding = 'utf-8'  # 设置正确编码# 解析网页内容
soup = BeautifulSoup(response.text, 'html.parser')# 示例:解析公司信息(需根据实际页面结构调整选择器)
company_name = soup.select_one('.company-name')  # 假设 .company-name 是公司名称的类名
if company_name:print(f"公司名称: {company_name.text.strip()}")
else:print("未能获取公司名称!")legal_representative = soup.select_one('.legal-rep')  # 假设 .legal-rep 是法人代表的类名
if legal_representative:print(f"法人代表: {legal_representative.text.strip()}")
else:print("未能获取法人代表信息!")registered_capital = soup.select_one('.reg-capital')  # 假设 .reg-capital 是注册资本的类名
if registered_capital:print(f"注册资本: {registered_capital.text.strip()}")
else:print("未能获取注册资本信息!")

架构改进方案

  • 动态加载应对策略:采用 Selenium / Playwright 等框架,模拟人类交互行为加载完整页面。
  • 选择器稳定性保障:利用 XPath 表达式,结合多个属性定位元素;定期更新长效选择器库。
  • 代理池搭建:引入多 IP 代理池,轮询使用不同 IP,提高请求成功率。
  • 数据清洗与过滤:构建专用的数据清洗规则集,去除冗余、异常数据,提升数据质量。

总结

本次故障源于网页动态加载机制与选择器不匹配,辅以合理的代理 IP、请求头配置及动态加载调试工具,成功解决数据采集问题。在爬虫项目中,持续关注目标网站更新动态、优化选择器策略、升级反爬规避方案,是保障数据稳定性抓取的关键。

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

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

相关文章

HCIA项目实践---OSPF的基本配置

9.5.12 OSPF的基本配置 &#xff08;所搭环境如上图所示&#xff09; A 先配置IP地址 (先进入路由器R1的0/0/0接口配置IP地址&#xff0c;再进入环回接口配置IP地址) &#xff08;配置R2路由器的0/0/0和0/0/1以及环回接口的IP地址&#xff09; &#xff08;置R3路由器的0/0/0接…

Java练习(20)

ps:练习来自力扣 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 class Solution {pu…

在ArcGIS JS API中使用WebGL实现波纹扩散特效

在现代WebGIS开发中&#xff0c;ArcGIS JS API 是一个非常强大的工具&#xff0c;它允许开发者创建丰富的地理信息应用。结合WebGL技术&#xff0c;我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

支持向量机原理

支持向量机&#xff08;简称SVM&#xff09;虽然诞生只有短短的二十多年&#xff0c;但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法&#xff0c;不考虑特定的训练数据集&#xff0c;尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源&#xff0c;恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

消息中间件:RabbitMQ镜像集群部署配置全流程

目录 1、特点 2、RabbitMQ的消息传递模式 2.1、简单模式&#xff08;Simple Mode&#xff09; 2.2、工作队列模式&#xff08;Work Queue Mode&#xff09; 2.3、发布/订阅模式&#xff08;Publish/Subscribe Mode&#xff09; 2.4、路由模式&#xff08;Routing Mode&am…

财务主题数据分析-企业盈利能力分析

企业盈利能力数据主要体现在财务三张表中的利润表里面&#xff0c;盈利能力需要重点需要关注的指标有&#xff1a;毛利率、净利率、净利润增长率、营业成本增长率等&#xff1b; 接下来我们分析一下某上市公司披露的财务数据&#xff0c;看看该企业盈利能力如何&#xff1a; …

图数据库neo4j进阶(一):csv文件导入节点及关系

CSV 一、load csv二、neo4j-admin import<一>、导入入口<二>、文件准备<三>、命令详解 一、load csv 在neo4j Browser中使用Cypher语句LOAD CSV,对于数据量比较大的情况,建议先运行create constraint语句来生成约束 create constraint for (s:Student) req…

npm包管理工具

包管理工具 npm 包管理工具 介绍 Node Package Manager&#xff1a;也就是Node包管理工具但是目前已经不仅仅是Node包管理器&#xff0c;在前端项目中我们也使用它来管理依赖的包比如 vue、vue-router、vuex、express、koa 下载和安装 npm属于Node的管理工具&#xff0c;安…

MyBatis映射文件 <resultMap> 元素详解与示例

引言 <resultMap> 是 MyBatis 中最核心的映射配置元素&#xff0c;用于解决数据库字段与 Java 对象属性之间的复杂映射问题&#xff0c;尤其是字段名不一致、嵌套对象关联、集合映射等场景。ResultMap 的设计思想是&#xff0c;对简单的语句做到零配置&#xff0c;对于复…

时间盲注Boolen盲注之获取表、列、具体数据的函数

时间盲注 时间盲注&#xff08;Time-Based Blind SQL Injection&#xff09;是一种利用数据库响应时间的差异来推断数据的SQL注入技术。它的核心原理是通过构造特定的SQL查询&#xff0c;使得数据库在执行查询时产生时间延迟&#xff0c;从而根据延迟的有无来推断数据。 时间…

通过操作系统中的IO模型理解Java中的BIO,NIO,AIO

操作系统中的三种IO模型 阻塞I/O 先来看看阻塞 I/O&#xff0c;当用户程序执行 read&#xff0c;线程会被阻塞 一直等到内核数据准备好&#xff0c;并把数据从内核缓冲区拷贝到应用程序的缓冲区中&#xff0c;当拷贝过程完成&#xff0c;read 才会返回 注意&#xff1a;阻塞…

JUC并发—2.Thread源码分析及案例应用

大纲 1.什么是线程以及并发编程 2.微服务注册中心案例 3.以工作线程模式开启微服务的注册和心跳线程 4.微服务注册中心的服务注册功能 5.微服务注册中心的心跳续约功能 6.微服务的存活状态监控线程 7.以daemon模式运行微服务的存活监控线程 8.一般不常用到的ThreadGrou…

Excel函数公式合并相同项目的行数据

今天公司同事问我&#xff0c;如何将相同项目的数据行的行数据合并起来 于是我首先想到textjoin函数&#xff0c;但是条件筛选怎么办&#xff0c;后来想了下&#xff0c;可以用filter函数或者if IF公式如下 TEXTJOIN("|",TRUE,IF($A$2:$A$30A2,$B$2:$B$30,"&q…

【DeepSeek系列专栏大纲:深入探索与实践深度学习】

第一部分:深度学习基础篇 第1章:深度学习概览 1.1 深度学习的历史背景与发展轨迹 1.2 深度学习与机器学习、传统人工智能的区别与联系 1.3 深度学习的核心组件与概念解析 神经网络基础 激活函数的作用与类型 损失函数与优化算法的选择 1.4 深度学习框架简介与选择建议 第2…

Jenkins 通过 Execute Shell 执行 shell 脚本 七

Jenkins 通过 Execute Shell 执行 shell 脚本 七 一、创建 .sh 文件 项目目录下新建 .sh 文件 jenkins-script\shell\ci_android_master.sh添加 Execute Shell 模块 在 Command 中添加 # 获取 .sh 路径 CI_ANDROID_MASTER_PATH"${WORKSPACE}/jenkins-script/shell/…

NixHomepage - 简单的个人网站

&#x1f4bb; NixHomepage - 简单的个人网站 推荐下个人的开源项目&#xff0c;演示网站&#xff0c;项目链接 https://github.com/nixgnauhcuy/NixHomepage&#xff0c;喜欢的话可以为我的项目点个 Star~ &#x1f4f7; 预览 ⚙️ 功能特性 多平台适配 明亮/暗黑模式切换 W…

八大排序——简单选择排序

目录 1.1基本操作&#xff1a; 1.2动态图&#xff1a; 1.3代码&#xff1a; 代码解释 1. main 方法 2. selectSort 方法 示例运行过程 初始数组 每轮排序后的数组 最终排序结果 代码总结 1.1基本操作&#xff1a; 选择排序&#xff08;select sorting&#xff09;也…

2025有哪些关键词优化工具好用

越来越多的企业和个人开始意识到搜索引擎优化&#xff08;SEO&#xff09;对于网站曝光和业务增长的重要性。在SEO优化的过程中&#xff0c;关键词优化占据着至关重要的地位。关键词是用户在搜索引擎中输入的词语&#xff0c;优化关键词有助于提高网站在搜索结果中的排名&#…