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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
Elasticsearch Serverless检索通用型,资源抵扣包 100CU*H
实时计算 Flink 版,5000CU*H 3个月
简介: Python+Selenium爬虫:豆瓣登录反反爬策略解析
  1. 引言
    在当今互联网时代,数据抓取(爬虫)技术广泛应用于数据分析、市场调研、自动化测试等领域。然而,许多网站采用动态加载技术(如Ajax、React、Vue.js等框架)来渲染页面,传统的requests库无法直接获取动态生成的内容。这时,Selenium成为解决动态页面爬取的重要工具。
    豆瓣作为一个典型的动态加载网站,其登录页面涉及表单提交、动态验证码、Ajax请求等复杂交互。本文将通过Python + Selenium,详细介绍如何模拟登录豆瓣,并处理动态加载的登录页面。
  2. 技术选型与准备工作
    2.1 为什么选择Selenium?
    ● 模拟真实浏览器行为:Selenium可以控制浏览器(如Chrome、Firefox)执行点击、输入、滚动等操作,适用于动态页面。
    ● 处理JavaScript渲染:传统爬虫(如requests)无法执行JS,而Selenium可以完整加载动态内容。
    ● 应对反爬机制:豆瓣等网站可能有验证码、IP限制,Selenium可模拟人类操作降低被封风险。
    2.2 环境准备
    ● Python 3.8+
    ● Selenium库(pip install selenium)
    ● 浏览器驱动(如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)

  1. 完整代码示例
    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() # 关闭浏览器

  1. 总结
    本文通过Selenium实现了豆瓣动态登录页面的自动化操作,涵盖:
  2. 动态页面元素定位(如切换登录方式、输入表单)。
  3. 验证码处理(手动干预或自动化识别)。
  4. 反反爬优化(修改浏览器指纹、代理IP、无头模式)。
    适用场景:
    ● 需要登录才能抓取的数据(如用户主页、私密内容)。
    ● 动态渲染的SPA(单页应用)网站爬取。
    进一步优化方向:
    ● 结合requests+cookies提高效率(避免每次启动浏览器)。
    ● 使用OCR自动识别验证码(如Tesseract、打码平台)。
相关文章
|
8天前
|
数据采集 Web App开发 JavaScript
无头浏览器技术:Python爬虫如何精准模拟搜索点击
无头浏览器技术:Python爬虫如何精准模拟搜索点击
|
9天前
|
数据采集 机器学习/深度学习 Web App开发
Python爬虫如何应对贝壳网的IP封禁与人机验证?
Python爬虫如何应对贝壳网的IP封禁与人机验证?
|
8天前
|
数据采集 Web App开发 JavaScript
Python爬虫解析动态网页:从渲染到数据提取
Python爬虫解析动态网页:从渲染到数据提取
|
17天前
|
数据采集 存储 前端开发
Python爬虫自动化:批量抓取网页中的A链接
Python爬虫自动化:批量抓取网页中的A链接
|
8月前
|
Web App开发 前端开发 JavaScript
探索Python科学计算的边界:利用Selenium进行Web应用性能测试与优化
【10月更文挑战第6天】随着互联网技术的发展,Web应用程序已经成为人们日常生活和工作中不可或缺的一部分。这些应用不仅需要提供丰富的功能,还必须具备良好的性能表现以保证用户体验。性能测试是确保Web应用能够快速响应用户请求并处理大量并发访问的关键步骤之一。本文将探讨如何使用Python结合Selenium来进行Web应用的性能测试,并通过实际代码示例展示如何识别瓶颈及优化应用。
365 5
|
6月前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
218 31
Selenium IDE:Web自动化测试的得力助手
|
6月前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
430 17
Selenium:强大的 Web 自动化测试工具
|
8月前
|
Java 测试技术 C#
自动化测试之美:从Selenium到Appium
【10月更文挑战第3天】在软件开发的海洋中,自动化测试如同一艘航船,引领着质量保证的方向。本文将带你领略自动化测试的魅力,从Web端的Selenium到移动端的Appium,我们将一探究竟,看看这些工具如何帮助我们高效地进行软件测试。你将了解到,自动化测试不仅仅是技术的展示,更是一种提升开发效率和产品质量的智慧选择。让我们一起启航,探索自动化测试的世界!
|
8月前
|
JavaScript 前端开发 测试技术
精通Selenium:从基础到高级的网页自动化测试策略
【10月更文挑战第6天】随着Web应用变得越来越复杂,手动进行功能和兼容性测试变得既耗时又容易出错。自动化测试因此成为了现代软件开发不可或缺的一部分。Selenium是一个强大的工具集,它支持多种编程语言(包括Python),允许开发者编写脚本来模拟用户与Web页面的交互。本文将带领读者从Selenium的基础知识出发,逐步深入到高级的应用场景,通过丰富的代码示例来展示如何高效地进行网页自动化测试。
1538 5
|
8月前
|
Web App开发 IDE 测试技术
自动化测试的利器:Selenium 框架深度解析
【10月更文挑战第2天】在软件开发的海洋中,自动化测试犹如一艘救生艇,让质量保证的过程更加高效与精准。本文将深入探索Selenium这一强大的自动化测试框架,从其架构到实际应用,带领读者领略自动化测试的魅力和力量。通过直观的示例和清晰的步骤,我们将一起学习如何利用Selenium来提升软件测试的效率和覆盖率。

推荐镜像

更多