Python+Selenium爬虫:豆瓣登录反反爬策略解析

news2025/5/16 7:38:51

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, ProxyType
    proxy = 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("登录失败,可能触发反爬")
    
    # 获取Cookies
    cookies = 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、打码平台)。

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

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

相关文章

电总协议调试助手更新-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…

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年迎来爆发式增长。但传统…

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;对靶机进行端口…

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

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

找银子 题解(c++)

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

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实…

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

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

单片机-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;例如传递关键数据、执行代码逻辑或实现攻击行为。 主要应用场景及技术解析 …

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

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

论文阅读与写作:《从探索到突破:解密科研和论文写作的思维密码》

文章目录 一、如何做科研1.科研的步骤2.课题选择3.快速入门一个新领域&#xff1a;读论文&#xff0c;先读综述(1)自己看论文的时候&#xff0c;每篇论文花3-5分钟记录一下自己的idea和一些瞬间的想法(2)高质量文献&#xff1a;顶会顶刊(3)如何检索 4.注重团队协作与学术交流5.…

致远OA绩效考核管理应用【附百度网盘下载链接,官方售价8K】

产品概述 绩效考核管理预置三种考核方式&#xff1a;工作事务考核、关键绩效考核、360度考评&#xff0c;满足不同企业考核需求&#xff0c;从考核等级定义、考核方案设置、考核分发到员工考核&#xff0c;再到考核结果汇总并审批&#xff0c;对绩效考核全过程进行闭环管理&…