Python+Selenium爬虫:豆瓣登录反反爬策略解析
1. 引言
在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**
库无法直接获取动态生成的内容。这时,Selenium成为解决动态页面爬取的重要工具。
豆瓣作为一个典型的动态加载网站,其登录页面涉及表单提交、动态验证码、Ajax请求等复杂交互。本文将通过Python + Selenium,详细介绍如何模拟登录豆瓣,并处理动态加载的登录页面。
2. 技术选型与准备工作
2.1 为什么选择Selenium?
- 模拟真实浏览器行为:Selenium可以控制浏览器(如Chrome、Firefox)执行点击、输入、滚动等操作,适用于动态页面。
- 处理JavaScript渲染:传统爬虫(如
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**
)无法执行JS,而Selenium可以完整加载动态内容。 - 应对反爬机制:豆瓣等网站可能有验证码、IP限制,Selenium可模拟人类操作降低被封风险。
2.2 环境准备
- Python 3.8+
- Selenium库(
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">pip install selenium</font>**
) - 浏览器驱动(如ChromeDriver)
- 下载地址:ChromeDriver官网
- 确保驱动版本与浏览器匹配,并加入系统PATH。
3. 分析豆瓣登录页面的动态加载机制
3.1 豆瓣登录页面结构
访问豆瓣登录页(https://accounts.douban.com/passport/login),可以发现:
- 默认显示二维码登录,需点击切换至账号密码登录。
- 输入账号密码后,可能触发动态验证码(如滑块、短信验证码)。
- 登录成功后,页面通过Ajax跳转,而非传统表单提交。
3.2 动态加载的挑战
- 元素延迟加载:部分DOM元素在交互后才会出现(如验证码)。
- Ajax异步请求:登录状态通过JS动态返回,需等待页面更新。
- 反爬检测:频繁请求可能触发IP限制或验证码。
4. Selenium自动化登录豆瓣实战
4.1 初始化Selenium WebDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time# 配置Chrome选项(无头模式、禁用自动化提示)
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])# 启动浏览器
driver = webdriver.Chrome(options=options)
driver.get("https://accounts.douban.com/passport/login")
4.2 切换至账号密码登录
默认页面是二维码登录,需点击切换:
# 等待并点击“密码登录”标签
switch_login = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@class="account-tab-account"]'))
switch_login.click()
4.3 输入账号和密码
# 定位输入框并填写信息
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")username.send_keys("your_email@example.com") # 替换为你的豆瓣账号
password.send_keys("your_password") # 替换为你的密码
4.4 提交登录并等待跳转
# 点击登录按钮
login_button = driver.find_element(By.XPATH, '//a[@class="btn btn-account"]')
login_button.click()# 等待登录成功(检查是否跳转到首页)
WebDriverWait(driver, 10).until(EC.url_contains("www.douban.com"))
print("登录成功!当前页面:", driver.current_url)
5. 完整代码示例
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
import random# 代理配置
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 配置浏览器选项
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_experimental_option("excludeSwitches", ["enable-automation"])# 添加代理认证
options.add_argument(f'--proxy-server=http://{proxyHost}:{proxyPort}')
options.add_extension = None # 禁用扩展# 启动浏览器
driver = webdriver.Chrome(options=options)# 处理代理认证(使用AutoAuth插件)
def enable_proxy_auth(proxyUser, proxyPass):from selenium.webdriver.common.proxy import Proxy, ProxyTypeproxy = Proxy({'proxyType': ProxyType.MANUAL,'httpProxy': f'{proxyHost}:{proxyPort}','sslProxy': f'{proxyHost}:{proxyPort}','noProxy': ''})proxy.add_to_capabilities(options.to_capabilities())enable_proxy_auth(proxyUser, proxyPass)try:# 访问登录页driver.get("https://accounts.douban.com/passport/login")# 切换至账号登录WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@class="account-tab-account"]'))).click()# 模拟人类输入def human_type(element, text):"""模拟人类输入(带随机延迟)"""for char in text:element.send_keys(char)time.sleep(random.uniform(0.1, 0.3))username = driver.find_element(By.ID, "username")password = driver.find_element(By.ID, "password")ActionChains(driver).move_to_element(username).click().perform()human_type(username, "your_email@example.com") # 替换为你的账号ActionChains(driver).move_to_element(password).click().perform()human_type(password, "your_password") # 替换为你的密码# 处理验证码(如有)try:captcha = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, "captcha_image")))if captcha:print("检测到验证码,请手动处理或调用OCR")time.sleep(15) # 留出时间手动输入except:print("无验证码,继续执行")# 提交登录login_btn = driver.find_element(By.XPATH, '//a[@class="btn btn-account"]')ActionChains(driver).move_to_element(login_btn).click().perform()# 等待登录成功try:WebDriverWait(driver, 10).until(EC.url_contains("www.douban.com"))print("登录成功!当前URL:", driver.current_url)except:print("登录失败,可能触发反爬")# 获取Cookiescookies = driver.get_cookies()print("登录后的Cookies:", cookies)finally:driver.quit() # 关闭浏览器
6. 总结
本文通过Selenium实现了豆瓣动态登录页面的自动化操作,涵盖:
- 动态页面元素定位(如切换登录方式、输入表单)。
- 验证码处理(手动干预或自动化识别)。
- 反反爬优化(修改浏览器指纹、代理IP、无头模式)。
适用场景:
- 需要登录才能抓取的数据(如用户主页、私密内容)。
- 动态渲染的SPA(单页应用)网站爬取。
进一步优化方向:
- 结合
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**
+**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">cookies</font>**
提高效率(避免每次启动浏览器)。 - 使用OCR自动识别验证码(如Tesseract、打码平台)。
相关文章:

Python+Selenium爬虫:豆瓣登录反反爬策略解析
1. 引言 在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的**<font s…...
信息系统运行管理员:临阵磨枪版
信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料,力求完整覆盖考点细节) 第一部分:基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息: 含义:香农 - 减少随机不确定性的东西;…...

电总协议调试助手更新-PowerBus-v1.0.5
电总协议调试助手,该工具主要是用于打包电总协议,用于电总协议的设备调试(精密空调、UPS、基站电源等等)。电总协议校验计算、编码转换比较麻烦,手动组包困难,使用该工具可以大大提高调试效率。 Ver1.0.5版…...

技术文档:变频器干扰问题与解决方案
1. 引言 在现代工业自动化系统中,变频器(Variable Frequency Drive, VFD)因其高效节能和精确调速的特点被广泛应用于电机控制。然而,变频器在运行过程中会产生高频电磁干扰(EMI),对周边设备如P…...

2025认证杯数学建模C题思路+代码+模型:化工厂生产流程的预测和控制
2025认证杯数学建模C题思路代码模型,详细内容见文末名片 在化工厂的生产流程中,往往涉及到多个反应釜、管道和储罐等设备。在 流水线上也有每个位置的温度、压力、流量等诸多参数。只有参数处于正常范 围时,最终的产物才是合格的。这些参数…...

亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号
只要能够巧妙规避平台的检测和风控措施,测评便可安全进行。 自养号测评,它更便于卖家掌控,且能降低风险。现在很多卖家都是自己养号,自己养号都是精养,不是自动的机刷,买家账号掌握在自己手里,更…...

SiFli-SDK 编译
1.编译报错 scons: *** No SConstruct file found. 出现这个错误是没有正确进入到工程目录执行编译命令,例如应该进入project目录中。 2.scons: *** [build_em-lb525_hcpu\src\resource\strings\en_us.c] AttributeError : dict object has no attribute iteritem…...
React 第四十一节Router 中 useActionData 使用方法案例以及注意事项
一、useActionData前言 useActionData 是 React Router 提供的一个钩子函数,用于获取在路由的 action 函数中返回的数据。它通常与表单提交(通过 <Form> 组件)配合使用,用于处理表单提交后的服务器响应数据(如错…...

C++多态实现的必要条件剖析
在C中,多态的一个必要条件确实是通过基类的指针或引用调用虚函数。这一要求背后的原因与C如何实现动态绑定(运行时多态)密切相关。下面详细解释了为什么需要使用基类的指针或引用来实现多态。 动态绑定与静态绑定 静态绑定(编译期…...

C语言_自动义类型:联合和枚举
1. 联合体 1.1 联合体类型的声明 与结构体相似,联合体也是有一个或多个成员(可以是不同类型)构成;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间,所以联合体也叫ÿ…...

汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐
导读 在汽车紧固件防锈涂装领域,敦普牌紧固件无铬锌铝涂料,是专为汽车紧固件打造的水性涂料,集防锈、环保、高性价比于一体。它有何独特之处?让我们一探究竟。 1、敦普紧固件无铬锌铝涂料是什么产品? 敦普紧固件无铬…...

掘金中亚货代蓝海,易境通货代系统解锁数字化制胜密码!
2025年,中亚地区正成为全球物流行业的新蓝海。中亚五国因其独特的地缘位置和“一带一路”倡议的深化推进,正逐渐成为全球物流行业的战略要地。 在政策红利、基建升级与市场需求的叠加效应下,中亚物流市场预计在2025年迎来爆发式增长。但传统…...
Python内存管理:赋值、浅拷贝与深拷贝解析
赋值与共享资源 在Python中,直接赋值操作(如 list2 list1)会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2,因为它们指向同一个对象。 注意: 赋值等于完全共享资源 如果我们不希望这样完全共享&…...

W1R3S: 1.0.1靶场
W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.249 3,对靶机进行端口…...
深度学习-分布式训练机制
1、分布式训练时,包括train.py的全部的代码都会在每个gpu上运行吗? 在分布式训练(如使用 PyTorch 的 DistributedDataParallel,DDP)时,每个 GPU 上运行的进程会执行 train.py 的全部代码,但通过…...

[Mamba轻量化]DefMamba: Deformable Visual State Space Model,CVPR2025
paper 文章目录 AbstractMethod整体模型架构可变形状态空间模型 Experiments Abstract 然而,大多数现有的视觉Mamba方法使用预定义的扫描顺序将图像展平为1D序列,导致模型在特征提取过程中对图像空间结构信息的利用能力减弱。为解决这一问题࿰…...
CSRF 和 XSS 攻击分析与防范
CSRF 和 XSS 攻击分析与防范 CSRF (跨站请求伪造) 什么是 CSRF? CSRF (Cross-Site Request Forgery) 是一种攻击方式,攻击者诱使用户在已登录目标网站的情况下,执行非预期的操作。 攻击流程: 用户登录可信网站 A在不登出 A 的…...

找银子 题解(c++)
题目 思路 首先,这道题乍一看,应该可以用搜索来做。 但是,搜索会不会超时间限制呢? 为了防止时间超限,我们可以换一种做法。 先创立两个二维数组,一个是输入的数组a,一个是数组b。 假设 i 行 j 列的数…...
中国版 Cursor?腾讯推出 AI 编程助手 CodeBuddy,重新定义编程体验
人工智能(AI)技术的迅猛发展正深刻地变革着各个行业,编程领域也不例外。以原生 IDE 体验见长的 Cursor,凭借其 Agent 模式在 AI 编程领域脱颖而出,对 GitHub Copilot 以及 VS Code 与 JetBrains 全家桶的地位发起挑战。…...

JVM学习专题(二)内存模型深度剖析
目录 1.JVM结构体系 编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧: 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器: 3.方法区 4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…...

密码学实验:凯撒密码
密码学实验:凯撒密码 一、实验目的 掌握凯撒密码的数学原理:理解字符移位与模运算的结合,实现加解密算法。理解暴力破解本质:通过穷举有限密钥空间,掌握利用语言特征破解密文的方法。编程实践:用Python实…...
linux备份与同步工具rsync
版权声明:原创作品,请勿转载! 文章目录 版权声明:原创作品,请勿转载! 实验环境介绍: 1.工具介绍 2.详细介绍 2.1 本地模式(用得少) 2.2 远程模式 2.3 守护进程模式…...
PYTHON训练营DAY26
一、函数 (一)不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好!欢迎学习Python函数定义!"print(message)greet()(二&#x…...

WPS一旦打开,就会修改默认打开方式,怎么解?
目录 前言 解决方法 结语 前言 电脑上同时存在WPS和微软的Office全家桶,但是我更喜欢用Office全家桶。前几天刚在设置改过来,忘记更改pdf文件打开默认应用。结果没过几天,不小心用WPS打开pdf文件时候,给我把默认设置全改回去了…...
从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例
产品部门定义了一个如下概念性的“知识奇点工程师”,他们构建的不仅仅是一个数据库或知识图谱,而是一个活的、能自我进化的知识生态系统,是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性,不亚于为AI引擎…...

单片机-STM32部分:12、I2C
飞书文档https://x509p6c8to.feishu.cn/wiki/MsB7wLebki07eUkAZ1ec12W3nsh 一、简介 IIC协议,又称I2C协议,是由PHILP公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备,IIC属于半双工同步通信方式。 IIC是一种同步…...

Payload的定义及核心概念
在IT领域,Payload(有效载荷) 指数据传输或操作中承载实际功能或信息的主体部分,与协议头、元数据等辅助内容区分。其核心特点是完成特定目标,例如传递关键数据、执行代码逻辑或实现攻击行为。 主要应用场景及技术解析 …...
idea插件使用
文章目录 在哪里安装插件常用插件 在哪里安装插件 离线下载插件请参考我的文章–>可复用性代码 在线下载 插件 :File(文件) —> Settings(设置) —> Plugins(插件) 常用插件 汉化插件:Chinese (Simplified) Language Pack /中文语言包。作者:…...

计算机网络笔记(二十四)——4.6互联网的路由选择协议
4.6.1有关路由选择协议的几个基本概念 路由选择协议是计算机网络中维护和生成路由表的核心机制。 1. 路由选择的核心目标 转发(Forwarding):路由器基于本地转发表,将分组从输入链路转移到输出链路(单台路由器的本地…...
UniApp 微信小程序绑定动态样式 :style 避坑指南
在使用 UniApp 开发跨端应用时,绑定动态样式 :style 是非常常见的操作。然而,很多开发者在编译为 微信小程序 时会遇到一个奇怪的问题: 原本在 H5 中可以正常渲染的样式,在微信小程序中却不生效! 让我们通过一个示例来…...