当前位置: 首页 > article >正文

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实现了豆瓣动态登录页面的自动化操作,涵盖:

  1. 动态页面元素定位(如切换登录方式、输入表单)。
  2. 验证码处理(手动干预或自动化识别)。
  3. 反反爬优化(修改浏览器指纹、代理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. 引言 在当今互联网时代&#xff0c;数据抓取&#xff08;爬虫&#xff09;技术广泛应用于数据分析、市场调研、自动化测试等领域。然而&#xff0c;许多网站采用动态加载技术&#xff08;如Ajax、React、Vue.js等框架&#xff09;来渲染页面&#xff0c;传统的**<font s…...

信息系统运行管理员:临阵磨枪版

信息系统运行管理员考试 - 全覆盖详细背诵大纲 (根据考情分析和原始材料&#xff0c;力求完整覆盖考点细节) 第一部分&#xff1a;基础知识与运维概览 Chapter 1: 信息系统运维概述 (上午题 5分) 信息&#xff1a; 含义&#xff1a;香农 - 减少随机不确定性的东西&#xff1b…...

电总协议调试助手更新-PowerBus-v1.0.5

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

技术文档:变频器干扰问题与解决方案

1. 引言 在现代工业自动化系统中&#xff0c;变频器&#xff08;Variable Frequency Drive, VFD&#xff09;因其高效节能和精确调速的特点被广泛应用于电机控制。然而&#xff0c;变频器在运行过程中会产生高频电磁干扰&#xff08;EMI&#xff09;&#xff0c;对周边设备如P…...

2025认证杯数学建模C题思路+代码+模型:化工厂生产流程的预测和控制

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

亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号

只要能够巧妙规避平台的检测和风控措施&#xff0c;测评便可安全进行。 自养号测评&#xff0c;它更便于卖家掌控&#xff0c;且能降低风险。现在很多卖家都是自己养号&#xff0c;自己养号都是精养&#xff0c;不是自动的机刷&#xff0c;买家账号掌握在自己手里&#xff0c;更…...

SiFli-SDK 编译

1.编译报错 scons: *** No SConstruct file found. 出现这个错误是没有正确进入到工程目录执行编译命令&#xff0c;例如应该进入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 提供的一个钩子函数&#xff0c;用于获取在路由的 action 函数中返回的数据。它通常与表单提交&#xff08;通过 <Form> 组件&#xff09;配合使用&#xff0c;用于处理表单提交后的服务器响应数据&#xff08;如错…...

C++多态实现的必要条件剖析

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

C语言_自动义类型:联合和枚举

1. 联合体 1.1 联合体类型的声明 与结构体相似&#xff0c;联合体也是有一个或多个成员&#xff08;可以是不同类型&#xff09;构成&#xff1b;但是编译器只为最大的成员分配足够的内存空间 联合体的特点是所有成员共用同一块内存空间&#xff0c;所以联合体也叫&#xff…...

汽车紧固件涂层18问:看敦普无铬锌铝涂料如何为螺丝防锈防腐

导读 在汽车紧固件防锈涂装领域&#xff0c;敦普牌紧固件无铬锌铝涂料&#xff0c;是专为汽车紧固件打造的水性涂料&#xff0c;集防锈、环保、高性价比于一体。它有何独特之处&#xff1f;让我们一探究竟。​ 1、敦普紧固件无铬锌铝涂料是什么产品&#xff1f; 敦普紧固件无铬…...

掘金中亚货代蓝海,易境通货代系统解锁数字化制胜密码!

2025年&#xff0c;中亚地区正成为全球物流行业的新蓝海。中亚五国因其独特的地缘位置和“一带一路”倡议的深化推进&#xff0c;正逐渐成为全球物流行业的战略要地。 在政策红利、基建升级与市场需求的叠加效应下&#xff0c;中亚物流市场预计在2025年迎来爆发式增长。但传统…...

Python内存管理:赋值、浅拷贝与深拷贝解析

赋值与共享资源 在Python中&#xff0c;直接赋值操作&#xff08;如 list2 list1&#xff09;会导致两个变量共享同一个内存地址。这意味着对 list1 的修改会直接影响到 list2&#xff0c;因为它们指向同一个对象。 注意: 赋值等于完全共享资源 如果我们不希望这样完全共享&…...

W1R3S: 1.0.1靶场

W1R3S: 1.0.1 来自 <W1R3S: 1.0.1 ~ VulnHub> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.249 3&#xff0c;对靶机进行端口…...

深度学习-分布式训练机制

1、分布式训练时&#xff0c;包括train.py的全部的代码都会在每个gpu上运行吗&#xff1f; 在分布式训练&#xff08;如使用 PyTorch 的 DistributedDataParallel&#xff0c;DDP&#xff09;时&#xff0c;每个 GPU 上运行的进程会执行 train.py 的全部代码&#xff0c;但通过…...

[Mamba轻量化]DefMamba: Deformable Visual State Space Model,CVPR2025

paper 文章目录 AbstractMethod整体模型架构可变形状态空间模型 Experiments Abstract 然而&#xff0c;大多数现有的视觉Mamba方法使用预定义的扫描顺序将图像展平为1D序列&#xff0c;导致模型在特征提取过程中对图像空间结构信息的利用能力减弱。为解决这一问题&#xff0…...

CSRF 和 XSS 攻击分析与防范

CSRF 和 XSS 攻击分析与防范 CSRF (跨站请求伪造) 什么是 CSRF&#xff1f; CSRF (Cross-Site Request Forgery) 是一种攻击方式&#xff0c;攻击者诱使用户在已登录目标网站的情况下&#xff0c;执行非预期的操作。 攻击流程&#xff1a; 用户登录可信网站 A在不登出 A 的…...

找银子 题解(c++)

题目 思路 首先&#xff0c;这道题乍一看&#xff0c;应该可以用搜索来做。 但是&#xff0c;搜索会不会超时间限制呢&#xff1f; 为了防止时间超限,我们可以换一种做法。 先创立两个二维数组&#xff0c;一个是输入的数组a&#xff0c;一个是数组b。 假设 i 行 j 列的数…...

中国版 Cursor?腾讯推出 AI 编程助手 CodeBuddy,重新定义编程体验

人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻地变革着各个行业&#xff0c;编程领域也不例外。以原生 IDE 体验见长的 Cursor&#xff0c;凭借其 Agent 模式在 AI 编程领域脱颖而出&#xff0c;对 GitHub Copilot 以及 VS Code 与 JetBrains 全家桶的地位发起挑战。…...

JVM学习专题(二)内存模型深度剖析

目录 1.JVM结构体系 ​编辑 2.跨平台特性 3.JVM整体结构及内存模型 1.栈内存 1、栈帧&#xff1a; 1.局部变量表 2.操作数栈 3.动态链接 4.方法出口 2、创建对象 2.程序计数器&#xff1a; 3.方法区 ​4.堆 5.本地方法区 6.总结 1.JVM结构体系 JDK、JRE 和 JVM…...

密码学实验:凯撒密码

密码学实验&#xff1a;凯撒密码 一、实验目的 掌握凯撒密码的数学原理&#xff1a;理解字符移位与模运算的结合&#xff0c;实现加解密算法。理解暴力破解本质&#xff1a;通过穷举有限密钥空间&#xff0c;掌握利用语言特征破解密文的方法。编程实践&#xff1a;用Python实…...

linux备份与同步工具rsync

版权声明&#xff1a;原创作品&#xff0c;请勿转载&#xff01; 文章目录 版权声明&#xff1a;原创作品&#xff0c;请勿转载&#xff01; 实验环境介绍&#xff1a; 1.工具介绍 2.详细介绍 2.1 本地模式&#xff08;用得少&#xff09; 2.2 远程模式 2.3 守护进程模式…...

PYTHON训练营DAY26

一、函数 &#xff08;一&#xff09;不带参数的函数 # 定义一个简单的问候函数 def greet():"""打印一句问候语。"""message "大家好&#xff01;欢迎学习Python函数定义&#xff01;"print(message)greet()&#xff08;二&#x…...

WPS一旦打开,就会修改默认打开方式,怎么解?

目录 前言 解决方法 结语 前言 电脑上同时存在WPS和微软的Office全家桶&#xff0c;但是我更喜欢用Office全家桶。前几天刚在设置改过来&#xff0c;忘记更改pdf文件打开默认应用。结果没过几天&#xff0c;不小心用WPS打开pdf文件时候&#xff0c;给我把默认设置全改回去了…...

从概念到可工程化智能体的转变路径——以“知识奇点工程师”为例

产品部门定义了一个如下概念性的“知识奇点工程师”&#xff0c;他们构建的不仅仅是一个数据库或知识图谱&#xff0c;而是一个活的、能自我进化的知识生态系统&#xff0c;是整个“Neuralink for Education”宏伟蓝图的基石。他们的工作难度和重要性&#xff0c;不亚于为AI引擎…...

单片机-STM32部分:12、I2C

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

Payload的定义及核心概念

在IT领域&#xff0c;Payload&#xff08;有效载荷&#xff09; 指数据传输或操作中承载实际功能或信息的主体部分&#xff0c;与协议头、元数据等辅助内容区分。其核心特点是完成特定目标&#xff0c;例如传递关键数据、执行代码逻辑或实现攻击行为。 主要应用场景及技术解析 …...

idea插件使用

文章目录 在哪里安装插件常用插件 在哪里安装插件 离线下载插件请参考我的文章–>可复用性代码 在线下载 插件 &#xff1a;File(文件) —> Settings(设置) —> Plugins(插件) 常用插件 汉化插件&#xff1a;Chinese (Simplified) Language Pack /中文语言包。作者:…...

计算机网络笔记(二十四)——4.6互联网的路由选择协议

4.6.1有关路由选择协议的几个基本概念 路由选择协议是计算机网络中维护和生成路由表的核心机制。 1. 路由选择的核心目标 转发&#xff08;Forwarding&#xff09;&#xff1a;路由器基于本地转发表&#xff0c;将分组从输入链路转移到输出链路&#xff08;单台路由器的本地…...

UniApp 微信小程序绑定动态样式 :style 避坑指南

在使用 UniApp 开发跨端应用时&#xff0c;绑定动态样式 :style 是非常常见的操作。然而&#xff0c;很多开发者在编译为 微信小程序 时会遇到一个奇怪的问题&#xff1a; 原本在 H5 中可以正常渲染的样式&#xff0c;在微信小程序中却不生效&#xff01; 让我们通过一个示例来…...