Python爬虫如何处理验证码与登录

news2024/11/28 2:36:57

Python爬虫如何处理验证码与登录

Python 爬虫在抓取需要登录的网站数据时,通常会遇到两个主要问题:登录验证验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码,以便进行顺利的数据抓取。

在这里插入图片描述

1. 什么是爬虫登录与验证码?

  • 登录验证:许多网站要求用户登录后才能访问某些页面,因此爬虫也需要具备模拟用户登录的功能,提交正确的用户名和密码后才可以继续抓取登录后的数据。

  • 验证码:验证码通常用来防止自动化行为,比如识别出用户是否为真人。验证码常见的形式有图片验证码、滑动验证码、短信验证等。对于爬虫,处理验证码可能会比较复杂,因为它们通常要求图像识别或者第三方服务的协助。

2. 使用 Python 模拟登录

在登录时,爬虫需要向服务器发送用户名和密码等登录信息,通常这些信息以表单的形式提交。我们可以使用 Python 的 requests 库来处理 HTTP 请求,模拟提交登录表单。

示例:模拟登录一个网站

假设我们要登录一个模拟网站,用户名为“username”,密码为“password”。

Step 1:分析登录请求

首先,在浏览器中打开开发者工具(按 F12),并找到登录请求(通常是 POST 请求)。查看登录所需的字段,包括 URL、表单字段(如 usernamepassword)和其他可能的参数(如 csrf_token)。

Step 2:发送登录请求

以下是一个使用 requests 库进行登录的示例代码:

import requests

# 登录 URL
login_url = 'https://example.com/login'

# 提交表单数据
payload = {
    'username': 'your_username',
    'password': 'your_password',
}

# 创建会话
session = requests.Session()

# 提交 POST 请求进行登录
response = session.post(login_url, data=payload)

# 检查是否登录成功
if "Welcome" in response.text:
    print("登录成功!")
else:
    print("登录失败,请检查用户名和密码。")

在登录成功后,我们的会话对象 session 就会持有该网站的登录状态,之后可以继续使用 session.get() 请求获取登录后的页面。

Step 3:获取并处理 Cookies

一些网站会将登录状态存储在 Cookie 中,requests.Session 会自动保存这些 Cookie,以便在后续的请求中继续保持登录状态。我们也可以手动查看和处理 Cookies:

# 打印 Cookies
print(session.cookies)

3. 验证码的处理方法

验证码的出现为爬虫带来了一些挑战,但我们可以通过多种方式处理验证码。

3.1 图片验证码的处理

图片验证码要求用户识别图像中的字符或数字。这类验证码可以通过以下几种方法解决:

方法 1:手动输入验证码

手动输入验证码是一种最简单但最耗时的方法。在爬虫运行时弹出验证码图片,并要求用户手动输入验证码,然后将输入内容发送给服务器。

import requests
from PIL import Image
from io import BytesIO

# 获取验证码图片
captcha_url = 'https://example.com/captcha'
response = session.get(captcha_url)

# 显示验证码图片
image = Image.open(BytesIO(response.content))
image.show()

# 手动输入验证码
captcha_code = input("请输入验证码:")

# 将验证码发送至登录请求中
payload = {
    'username': 'your_username',
    'password': 'your_password',
    'captcha': captcha_code
}
login_response = session.post(login_url, data=payload)
方法 2:使用 OCR 识别验证码

OCR(光学字符识别)是一种自动化识别图像中字符的技术。常用的 OCR 库是 pytesseract,配合 Pillow 库,可以将验证码图片转为文本。

import pytesseract
from PIL import Image

# 下载并保存验证码图片
captcha_image_path = 'captcha.png'
with open(captcha_image_path, 'wb') as f:
    f.write(response.content)

# 使用 pytesseract 识别验证码
captcha_code = pytesseract.image_to_string(Image.open(captcha_image_path))
print("识别到的验证码:", captcha_code)

OCR 的识别准确率不一定很高,尤其是验证码图像具有干扰线或噪点时。如果准确率不高,可能需要使用图像处理技术预处理验证码图片,提高识别效果。

方法 3:调用第三方验证码识别平台

如果 OCR 无法准确识别验证码,可以使用一些第三方验证码识别平台,如超级鹰、若快等。此类平台通常是收费的,但其识别准确率较高。通过 API 请求,爬虫将验证码图片发送给第三方平台识别,然后获取识别结果。

示例代码如下(以超级鹰为例):

import requests

# 超级鹰 API 接口
api_url = 'http://api.superfastcaptcha.com/api.php'

# API 请求参数
params = {
    'username': 'your_username',
    'password': 'your_password',
    'softid': 'your_softid',
    'codetype': 1902,
    'userfile': open(captcha_image_path, 'rb')
}

# 提交请求
response = requests.post(api_url, files=params)
captcha_code = response.json()['pic_str']
print("验证码识别结果:", captcha_code)

3.2 滑动验证码的处理

滑动验证码的设计目的是判断用户行为,通过滑动来解锁。处理滑动验证码的方法通常涉及模拟鼠标的滑动轨迹,这可以通过 Selenium 库实现。

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

# 启动浏览器
driver = webdriver.Chrome()
driver.get("https://example.com/login")

# 找到滑动验证码元素
slider = driver.find_element_by_id("slider")

# 创建动作链
action = ActionChains(driver)

# 点击滑块并开始拖动
action.click_and_hold(slider)

# 模拟拖动过程
for _ in range(5):
    action.move_by_offset(10, 0)  # 模拟小幅度滑动
    time.sleep(0.2)

# 释放鼠标
action.release().perform()

3.3 短信验证码的处理

短信验证码一般需要将验证码发送至手机。处理此类验证码通常涉及手动输入验证码或配合自动化服务。如果要完成这种任务,通常需要爬虫脚本暂停执行,等待用户手动输入验证码,输入后继续进行登录。

4. 综合案例:登录并处理验证码

假设我们需要抓取一个需要验证码的页面,登录步骤如下:

  1. 获取验证码图片并识别;
  2. 使用用户名、密码和验证码提交登录请求;
  3. 验证是否登录成功。

以下是一个完整的示例代码:

import requests
from PIL import Image
from io import BytesIO
import pytesseract

# 创建会话
session = requests.Session()

# Step 1: 获取验证码图片
captcha_url = 'https://example.com/captcha'
captcha_response = session.get(captcha_url)
captcha_image = Image.open(BytesIO(captcha_response.content))
captcha_image.show()  # 显示验证码,便于用户手动输入

# Step 2: 识别或手动输入验证码
captcha_code = input("请输入验证码:")

# Step 3: 发送登录请求
login_url = 'https://example.com/login'
payload = {
    'username': 'your_username',
    'password': 'your_password',
    'captcha': captcha_code
}
login_response = session.post(login_url, data=payload)

# Step 4: 检查是否登录成功
if "Welcome" in login_response.text:
    print("登录成功!")
else:
    print("登录失败,请检查登录信息。")

在以上示例中,我们创建了一个会话,获取验证码并将其显示,允许用户输入验证码,然后将验证码与用户名、密码一起提交进行登录。

5. 总结

在 Python 爬虫中处理登录和验证码是常见的难题。不同类型的验证码有不同的应对策略:

  • 图片验证码:可以使用 OCR 技术识别,也可以通过第三方平台自动识别。
  • 滑动验证码:需要模拟人类行为,通常使用 Selenium 来实现。
  • 短信验证码:通常需要暂停程序并等待用户手动输入。

这些方法可以帮助爬虫应对常见的登录和验证码问题。然而,在使用爬虫时请务必遵循网站的 Robots 协议 和相关法律法规,避免给网站服务器造成负担。

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

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

相关文章

《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析

导读:SQL 诞生于 20 世纪 70 年代,至今已有半个世纪。SQL 语言具有语法简单,低学习门槛等特点,诞生之后迅速普及与流行开来。由于 SQL 具有易学易用的特点,使得开发人员容易掌握,企业若能在其计算机软件中支…

JS实现,防抖节流 + 闭包

防抖(Debounce) 防抖是指短时间内大量触发同一事件,只会在最后一次事件完成后延迟执行一次函数。 防抖的典型应用场景是输入框的搜索建议功能,用户输入时不需要每次输入都去查询,而是在用户停止输入一段时间后才进行…

安卓编程最方便的读写资料类SharedPreferences,多个APP共享

本文介绍Android平台进行数据存储的五大方式,分别如下: 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 5 网络存储数据 下面详细讲解这五种方式的特点 第一种: 使用SharedPreferences存储数据 …

数据分析:转录组差异fgsea富集分析

文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…

Day13杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new Arra…

Avalonia11如何优雅的跨组件通信

背景&#xff1a; 官网只介绍了推荐适用ReactiveUI&#xff0c;没有过多的案例介绍&#xff0c;对于初入桌面应用开发的小白极其不友好。 本文介绍在Avalonia应用中通过ReactiveUI中的MessageBus进行跨组件通信. 假设需求案例&#xff1a; MainWindowViewModel中发送消息&a…

【开发实战】彻底了解 ThreadLocal

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 中级 🙉八股文专题:剑指大厂,手撕 J…

基于开源 AI 智能名片、S2B2C 商城小程序的用户获取成本优化分析

摘要&#xff1a;本文围绕用户获取成本&#xff08;CAC&#xff09;这一关键指标展开深入剖析&#xff0c;详细阐述其计算方式&#xff0c;并紧密结合开源 AI 智能名片与 S2B2C 商城小程序的独特性质&#xff0c;从多个维度探讨如何通过挖掘新的获客渠道、巧妙运用私域流量池等…

KV260 - PYNQ 主目录 - U盘挂载

目录 1. 简介 2. 具体操作 2.1 查看 USB 设备 2.2 查看 U 盘设备节点 2.3 挂载 U 盘到指定目录 2.4 查看挂载状态 2.5 卸载 U 盘 3. 总结 1. 简介 在 KV260 使用 Jupyter Lab 可以非常方便开发各种应用。有时不方便在 PC 端连接 U 盘&#xff0c;那么可以把 U 盘连在 …

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了&#xff0c;金媒婚恋相亲系统已经更新至最新的10.4版本了&#xff01;本人作为商业用户也已经更新至最新的旗舰版了&#xff0c;更新的内容是啥&#xff01;这个官方都有列出&#xff0c;一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…

用环形数组实现队列(多种高级方法,由浅入深)

同普通数组实现的队列相比&#xff0c;普通数组的头结点和尾节点都是固定的&#xff0c;在进行移除的时候如果移除了一个节点&#xff0c;后面所有节点都需要进行移除操作&#xff0c;需要的时间复杂度更高 在环形数组中&#xff0c;确定了头尾指针的环形数组很好地解决了这一…

【毫米波雷达(七)】自动驾驶汽车中的精准定位——RTK定位技术

一、什么是RTK&#xff1f; RTK&#xff0c;英文全名叫做Real-time kinematic&#xff0c;也就是实时动态。这是一个简称&#xff0c;全称其实应该是RTK&#xff08;Real-time kinematic&#xff0c;实时动态&#xff09;载波相位差分技术。 二、RTK的组装 如上图所示&#x…

小北的字节跳动青训营与调用模型:调用模型:OpenAI API vs 微调开源Llama2/ChatGLM(持续更新中~~~)

前言 最近&#xff0c;字节跳动的青训营再次扬帆起航&#xff0c;作为第二次参与其中的小北&#xff0c;深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮&#xff0c;更是一个连接未来与梦想的桥梁~ 小北的青训营 X M…

通过DNS服务器架构解释DNS请求过程

在前面的章节&#xff0c;这里&#xff0c;基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中&#xff0c;DNS请求和响应的数据包是怎么流动的&#xff0c;会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。…

Netty实现WebSocket Server是否开启压缩深度分析

是否开启压缩会直接影响与客户端是否能够成功握手。 一、具体分析 通常客户端发起与Websocket连接一般是以下形式。 1&#xff09;包含6个必要的Header Request Headers Sec-WebSocket-Version: 13 Sec-WebSocket-Key: Nlpc0kiHFjRom5/62lj8bA Connection: Upgrade Upgrade…

IntelliJ IDEA 2023.2——配置说明

IntelliJ IDEA 2023.2——配置说明 IntelliJ IDEA 的官方下载地址 IntelliJ IDEA 官网下载地址 一路上NEXT 到结尾&#xff1a; 继续NEXT 下一步: 界面如下图所示 界面如下图所示 ctrl F 查找 “码猿趣事” 查找【idea99】

算法通关(4)-- 前缀树

前缀数原理和代码 原理 前缀树&#xff08;Trie树&#xff09;&#xff0c;也称为字典树&#xff0c;是一种用于高效存储和检索字符串的数据结构。它是一种树形结构&#xff0c;能够利用字符串的公共前缀来减少存储空间和查询时间。 现在有“acb”,"cba","ac…

【CSS】“flex: 1“有什么用?

flex 属性的组成 flex 属性是一个复合属性&#xff0c;包含以下三个子属性&#xff1a; flex-grow&#xff1a;决定元素在容器中剩余空间的分配比例。默认值为 0&#xff0c;表示元素不会扩展。当设置为正数时&#xff0c;元素会按照设定比例扩展。flex-shrink&#xff1a;决…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…