深度解析:使用ChromeDriver和webdriver_manager实现无头浏览器爬虫

devtools/2025/2/13 2:47:31/

<a class=爬虫代理" />

问题背景

在现代网络爬虫的实践中,动态网页的内容加载和复杂的反爬虫机制使得数据采集变得愈发困难。传统的静态网页爬取方法已无法满足需求,尤其是在需要模拟用户行为、处理JavaScript渲染的场景下。为此,采用无头浏览器(Headless Browser)技术成为一种有效的解决方案。

无头浏览器能够在后台运行,模拟真实用户的浏览器行为,执行JavaScript脚本,获取动态加载的内容。然而,直接使用SeleniumChromeDriver可能会暴露出自动化的痕迹,导致被目标网站识别为爬虫。为此,需要采取措施,如设置代理IP、伪装User-Agent和处理Cookies,以提高爬虫的隐蔽性和稳定性。

技术架构图与核心模块拆解

以下是使用ChromeDriverwebdriver_manager实现无头浏览器爬虫的技术架构图:

+-------------------+
|   用户请求        |
+-------------------+|v
+-------------------+
|   Selenium        |
|   WebDriver       |
+-------------------+|v
+-------------------+
|   ChromeDriver    |
+-------------------+|v
+-------------------+
|   Chrome浏览器    |
|   (无头模式)      |
+-------------------+|v
+-------------------+
|   目标网站        |
+-------------------+

核心模块拆解:

  1. Selenium WebDriver:用于驱动浏览器,模拟用户行为,如点击、滚动等。
  2. ChromeDriverSelenium与Chrome浏览器之间的桥梁,负责执行Selenium指令。
  3. Chrome浏览器(无头模式):在后台运行的浏览器实例,执行JavaScript,加载动态内容。
  4. 代理IP设置:通过配置代理服务器,隐藏真实IP,避免被目标网站封禁。
  5. User-Agent伪装:修改浏览器的User-Agent,模拟不同的设备和浏览器,降低被识别为爬虫的风险。
  6. Cookies处理:管理和维护Cookies,模拟真实用户的会话状态。

性能对比数据与行业应用案例

在实际应用中,使用无头浏览器爬虫相较于传统的静态网页爬取方法,具有以下优势:

  • 动态内容加载:能够获取JavaScript渲染的动态内容,适用于现代复杂网页。
  • 模拟用户行为:通过模拟点击、滚动等操作,获取完整的网页数据。
  • 爬虫规避:通过设置代理IP、伪装User-Agent和处理Cookies,降低被识别为爬虫的风险。

行业应用案例:

  • 电商价格监控:通过模拟用户行为,获取电商平台的商品价格和库存信息,进行价格监控和竞争分析。
  • 社交媒体数据采集:获取社交媒体平台的用户评论、点赞数等数据,用于舆情分析和市场研究。
  • 招聘信息抓取:从招聘网站获取职位信息,进行人才市场分析和招聘策略制定。

实现代码示例

以下是使用ChromeDriverwebdriver_manager实现无头浏览器爬虫的代码示例,包含代理IP、User-Agent和Cookies的设置,以及采集TikTok视频简介和评论的功能:

import time
import base64
import zipfile
import string
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains# 代理服务器配置(以亿牛云爬虫代理 www.16yun.cn为例)
proxy_host = "proxy.16yun.cn"  # 代理服务器域名
proxy_port = "3111"  # 代理服务器端口
proxy_user = "16yun"  # 代理用户名
proxy_pass = "16IP"  # 代理密码# 创建代理认证扩展
def create_proxy_auth_extension(proxy_host, proxy_port, proxy_username, proxy_password, scheme='http', plugin_path=None):if plugin_path is None:plugin_path = f'/tmp/{proxy_username}_{proxy_password}@{proxy_host}.zip'manifest_json = """{"version": "1.0.0","manifest_version": 2,"name": "Proxy Auth","permissions": ["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background": {"scripts": ["background.js"]},"minimum_chrome_version": "22.0.0"}"""background_js = string.Template("""var config = {mode: "fixed_servers",rules: {singleProxy: {scheme: "${scheme}",host: "${host}",port: parseInt(${port})},bypassList: ["foobar.com"]}};chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});function callbackFn(details) {return {authCredentials: {username: "${username}",password: "${password}"}};}chrome.webRequest.onAuthRequired.addListener(callbackFn,{urls: ["<all_urls>"]},['blocking']);""").substitute(host=proxy_host,port=proxy_port,username=proxy_username,password=proxy_password,scheme=scheme,)with zipfile.ZipFile(plugin_path, 'w') as zp:zp.writestr("manifest.json", manifest_json)zp.writestr("background.js", background_js)return plugin_path# 创建代理认证扩展
proxy_auth_plugin_path = create_proxy_auth_extension(proxy_host=proxy_host,proxy_port=proxy_port,proxy_username=proxy_user,proxy_password=proxy_pass
)# 设置Chrome选项
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('lang

http://www.ppmy.cn/devtools/158359.html

相关文章

【c++】字符串 string 以及与右值结合

【c】字符串 string 以及与右值结合 std::string 类介绍 std::string 是 C 标准库中的一个用于处理字符串的类&#xff0c;定义在头文件 <string> 中。std::string 封装了一个可变长度的字符数组&#xff0c;可以动态地存储和操作文本字符串。 在使用char类型指针指向…

2025影视泛目录站群程序设计_源码二次开发新版本无缓存刷新不变实现原理

1. 引言 本设站群程序计书旨在详细阐述苹果CMS泛目录的创新设计与实现&#xff0c;介绍无缓存刷新技术、数据统一化、局部URL控制及性能优化等核心功能&#xff0c;以提升网站访问速度和用户体验。 2. 技术概述 2.1 无缓存刷新技术 功能特点&#xff1a; 内容不变性&#x…

halcon三维点云数据处理(十四)在3D场景中去除背景的三种方式

目录 一、基于二值化去除背景二、基于参考平面去除背景三、基于参考场景去除背景四、总结 一、基于二值化去除背景 在2D空间中&#xff1a;reduce_object_model_3d_by_view (Regions, ObjectModel3DScene, [], [], ObjectModel3DReduced) 首先二值化得到region&#xff0c;然后…

对React中类组件和函数组件的理解?

React 中的 类组件 和 函数组件 是两种不同的组件定义方式&#xff0c;它们都可以用来创建 UI&#xff0c;但在语法、特性和使用场景上有一些区别。以下是它们的详细对比和理解&#xff1a; 1. 类组件&#xff08;Class Components&#xff09; 特点 基于 ES6 的类&#xff1a…

UIAbility 生命周期方法

生命周期流程图 UIAbility的生命周期官方文档地址https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/uiability-lifecycle-V13 1. onCreate(want: Want, launchParam: LaunchParam) 触发时机&#xff1a;Ability首次创建时 作用&#xff1a;初始化核心资源…

Lucene 中的并发错误:如何修复乐观并发失败

作者&#xff1a;来着 Elastic Benjamin Trent 及 Ao Li 感谢 CMU PASTA 实验室开发的确定性并发测试框架 Fray&#xff0c;我们找到了一个棘手的 Lucene 漏洞并将其修复。 是的&#xff0c;另一个修复错误博客。但这个故事有一个转折&#xff0c;一位开源英雄突然出现并拯救了…

Stylelint 如何处理 CSS 预处理器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Android Studio:键值对存储sharedPreferences

一、了解 SharedPreferences SharedPreferences是Android的一个轻量级存储工具&#xff0c;它采用的存储结构是Key-Value的键值对方式&#xff0c;类似于Java的Properties&#xff0c;二者都是把Key-Value的键值对保存在配置文件中。不同的是&#xff0c;Properties的文件内容形…