《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)

news2024/11/18 3:38:13

在这里插入图片描述

文章目录

  • 7.1 识别和应对 CAPTCHA
    • 7.1.1 重点基础知识讲解
    • 7.1.2 重点案例:使用Tesseract OCR识别简单CAPTCHA
    • 7.1.3 拓展案例 1:使用深度学习模型识别复杂CAPTCHA
    • 7.1.4 拓展案例 2:集成第三方 CAPTCHA 解决服务
  • 7.2 IP 轮换与代理的使用
    • 7.2.1 重点基础知识讲解
    • 7.2.2 重点案例:使用 requests 库与代理 IP 进行数据抓取
    • 7.2.3 拓展案例 1:结合 Scrapy 和 Scrapy-Redis 使用代理
    • 7.2.4 拓展案例 2:自动切换代理 IP
  • 7.3 用户代理和 Cookie 的管理
    • 7.3.1 重点基础知识讲解
    • 7.3.2 重点案例:使用 requests 库设置用户代理和 Cookie
    • 7.3.3 拓展案例 1:动态更换用户代理
    • 7.3.4 拓展案例 2:使用 session 对象管理 Cookie

7.1 识别和应对 CAPTCHA

在爬虫的世界里,CAPTCHA(全自动区分计算机和人类的公开图灵测试)像是一道守护网站不被自动化工具侵扰的魔法屏障。但对于执着于获取数据的我们来说,总有几种方法可以尝试绕过这个障碍。

7.1.1 重点基础知识讲解

  • OCR(光学字符识别):OCR技术可以识别图片中的文字,对于一些简单的文字型CAPTCHA,使用OCR可能直接破解。
  • 人工智能模型:近年来,随着深度学习技术的发展,一些训练有素的模型能够识别更加复杂的CAPTCHA图像。
  • 第三方解决方案:存在一些服务,如Anti-Captcha、2Captcha等,提供了API接口,可以代替人工识别CAPTCHA。
  • 手动输入:在一些情况下,如果CAPTCHA识别不是频繁的需求,简单直接的方法就是手动输入。

7.1.2 重点案例:使用Tesseract OCR识别简单CAPTCHA

假设你遇到了一个使用简单数字和字母组合的CAPTCHA,我们可以使用Tesseract OCR来尝试自动识别。

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

# 获取CAPTCHA图片
response = requests.get('http://example.com/captcha.jpg')
img = Image.open(BytesIO(response.content))

# 使用Tesseract进行OCR识别
captcha_text = pytesseract.image_to_string(img)
print(f"识别的CAPTCHA文本: {captcha_text}")

7.1.3 拓展案例 1:使用深度学习模型识别复杂CAPTCHA

对于复杂的CAPTCHA,可以使用预先训练好的深度学习模型进行识别。这需要大量的标记数据来训练模型,或者使用现有的模型。

# 这是一个概念性示例,实际使用时需要根据具体模型进行调整
# 假设我们有一个训练好的模型 model.h5 可以加载来识别CAPTCHA

from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np

# 加载模型
model = load_model('model.h5')

# 加载并预处理CAPTCHA图像
img = Image.open('captcha.jpg').convert('L')  # 转换为灰度图像
img = np.resize(img, (1, 28, 28, 1))  # 调整大小和维度以匹配模型

# 预测
prediction = model.predict(img)
captcha_text = ''.join([str(np.argmax(i)) for i in prediction])
print(f"识别的CAPTCHA文本: {captcha_text}")

7.1.4 拓展案例 2:集成第三方 CAPTCHA 解决服务

当自动化方法不可行或不够准确时,可以使用第三方服务来解决CAPTCHA。

import requests

# 使用2Captcha服务解决CAPTCHA
api_key = 'YOUR_2CAPTCHA_API_KEY'
captcha_file = 'captcha.jpg'
with open(captcha_file, 'rb') as file:
    response = requests.post(
        f'http://2captcha.com/in.php?key={api_key}',
        files={'file': file}
    )
if response.ok:
    request_id = response.text.split('|')[1]
    # 检索解决结果
    resolve_url = f'http://2captcha.com/res.php?key={api_key}&action=get&id={request_id}'
    for _ in range(5):  # 尝试5次获取结果
        solve_response = requests.get(resolve_url)
        if solve_response.text.startswith('OK'):
            print(f"CAPTCHA解决方案: {solve_response.text.split('|')[1]}")
            break

通过这些方法,我们可以在不同情况下尝试绕过CAPTCHA的挑战。重要的是要记住,我们应当尊重网站的防爬策略,合理合法地使用这些技术。在使用第三方服务时,也要考虑到成本和响应时间的因素。

在这里插入图片描述


7.2 IP 轮换与代理的使用

在网络爬虫的探险旅程中,使用代理IP轮换是一种巧妙的伪装技术,可以帮助你的爬虫避开网站的IP封锁,就像是变色龙一样在数据丛林中隐身。

7.2.1 重点基础知识讲解

  • 代理IP的选择:选择高质量的代理IP是关键。这些代理可以是公开的代理,也可以是付费的私有代理服务,关键在于稳定性和匿名度。
  • 轮换策略:合理地轮换代理IP可以避免因频繁请求同一网站而被封禁。轮换策略可以基于时间、请求次数等因素来设置。
  • 请求头设置:使用代理时,还应注意修改请求头中的一些字段,如User-Agent,以更好地模拟正常用户的行为。
  • 错误处理:在使用代理IP时,可能会遇到代理失效的情况,合理的错误处理和重试机制是必不可少的。

7.2.2 重点案例:使用 requests 库与代理 IP 进行数据抓取

假设我们有一系列的代理IP,需要使用这些代理去抓取某个网站的数据。

import requests

# 代理IP列表
proxies_list = [
    {"http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080"},
    {"http": "http://10.10.1.11:3128", "https": "http://10.10.1.11:1080"},
    # 更多代理IP
]

url = "http://example.com/data"

# 轮换使用代理IP抓取数据
for proxy in proxies_list:
    try:
        response = requests.get(url, proxies=proxy, timeout=5)
        print(f"成功获取数据: {response.text[:100]}")
        break  # 成功获取数据后跳出循环
    except Exception as e:
        print(f"代理 {proxy} 请求失败,切换到下一个代理。错误信息:{e}")

7.2.3 拓展案例 1:结合 Scrapy 和 Scrapy-Redis 使用代理

当使用Scrapy框架进行大规模爬虫开发时,结合Scrapy-Redis和代理池可以有效实现分布式爬虫和IP轮换。

# 假设你的Scrapy项目中有一个中间件或代理池服务来管理代理IP
class ProxyMiddleware(object):
    def process_request(self, request, spider):
        # 从代理池中获取代理IP
        proxy = get_proxy_from_pool()  # 假设的函数,需要根据实际情况实现
        request.meta['proxy'] = proxy

7.2.4 拓展案例 2:自动切换代理 IP

在一些情况下,可能需要根据请求的成功与否自动切换代理IP。

import requests

# 初始化代理IP列表和当前代理索引
proxies_list = [...]
current_proxy_index = 0

def fetch_with_auto_rotate_proxy(url):
    global current_proxy_index
    while current_proxy_index < len(proxies_list):
        proxy = proxies_list[current_proxy_index]
        try:
            response = requests.get(url, proxies=proxy, timeout=5)
            print(f"使用代理 {proxy} 成功获取数据")
            return response
        except:
            print(f"使用代理 {proxy} 请求失败,尝试下一个代理")
            current_proxy_index += 1
    print("所有代理尝试完毕,未能成功获取数据")

url = "http://example.com/data"
fetch_with_auto_rotate_proxy(url)

通过这些策略和案例的学习,我们可以更加灵活地使用代理IP来提高爬虫的隐蔽性和效率。记住,使用代理时要遵循网站的规定,合理合法地收集数据。

在这里插入图片描述


7.3 用户代理和 Cookie 的管理

在数据侠的工具箱里,用户代理(User-Agent)和 Cookie 的管理是进行有效的网络爬虫活动时不可或缺的技能。这些工具帮助我们的爬虫更像一个普通用户而不是一个机器人,从而更加自由地在数据的世界里遨游。

7.3.1 重点基础知识讲解

  • 用户代理(User-Agent):用户代理是 HTTP 请求的一部分,它告诉服务器是哪种类型的设备(如桌面、手机)、操作系统和浏览器正在发起请求。通过更换用户代理,爬虫可以伪装成不同的浏览器或设备。
  • Cookie 管理:Cookie 是服务器发送到用户浏览器并保存的小数据片段,用于追踪浏览器会话。管理 Cookie 可以帮助爬虫维持登录状态,访问需要认证的数据。

7.3.2 重点案例:使用 requests 库设置用户代理和 Cookie

让我们来看一个使用 Python requests 库,同时设置用户代理和 Cookie 来抓取需要登录后才能访问的页面的例子。

import requests

url = "http://example.com/secret-data"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
cookies = {
    'session_token': 'YOUR_SESSION_TOKEN_HERE'
}

response = requests.get(url, headers=headers, cookies=cookies)
print(response.text)

7.3.3 拓展案例 1:动态更换用户代理

为了让爬虫在每次请求时都使用不同的用户代理,我们可以使用 fake_useragent 库来动态生成用户代理字符串。

from fake_useragent import UserAgent
import requests

ua = UserAgent()
url = "http://example.com"

# 每次请求使用不同的用户代理
for _ in range(5):
    headers = {'User-Agent': ua.random}
    response = requests.get(url, headers=headers)
    print(f"使用用户代理 {headers['User-Agent']} 访问 {url}")

7.3.4 拓展案例 2:使用 session 对象管理 Cookie

requests 库的 Session 对象可以自动管理 Cookie,使得爬虫在多次请求之间保持某些状态(如登录状态)。

import requests

# 创建一个 session 对象
session = requests.Session()

# 首先登录以获取 Cookie
login_url = "http://example.com/login"
credentials = {'username': 'user', 'password': 'pass'}
session.post(login_url, data=credentials)

# 现在 session 中已经保存了登录状态,我们可以访问需要认证的页面
secret_url = "http://example.com/secret-data"
response = session.get(secret_url)
print(response.text)

通过掌握用户代理和 Cookie 的管理技巧,你的爬虫将能够更加自由地在网络世界中探索,获取那些隐藏的、需要认证才能访问的珍贵数据。记得,使用这些技术时要遵守目标网站的使用条款,尊重用户数据的隐私和安全。

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

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

相关文章

【RabbitMQ(一)】:基本介绍 | 配置安装与快速入门

应该是新年前最后一篇博客了&#xff0c;明天浅浅休息一下&#xff0c;提前祝大家新年快乐捏&#xff01;&#x1f60a;&#x1f60a;&#x1f60a; 01. 基础理解 1.1 同步调用和异步调用 &#x1f449; 同步调用 的时候调用者会 阻塞 等待被调用函数或方法执行完成&#xff…

TELNET 远程终端协议

远程终端协议 TELNET TELNET 是一个简单的远程终端协议&#xff0c;也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册&#xff08;即登录&#xff09;到远地的另一个主机上&#xff08;使用主机名或 IP 地址&#xff09;。 TELNET 能将用户的击键传到…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后&#xff0c;立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品&#xff0c;提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞&#xff0c;攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…

ZOJ 3537 Cake 【区间DP + 凸多边形三角剖分】

Cake 题意 给定平面坐标上的 n n n 个点&#xff0c;如果是凸多边形的话&#xff0c;就用最少的花费把这个多边形剖分成若干个三角形&#xff0c;剖分的线段端点只能是原多边形的顶点&#xff0c;一条线段的花费为&#xff1a; ∣ x i x j ∣ ∣ y i y j ∣ m o d p |x_i…

微信小程序开发学习笔记《16》uni-app框架

微信小程序开发学习笔记《16》uni-app框架 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、uni-app简介 **uni-app是一个使用Vue.js 开发所有前端应用的框架。**开发者编写一套代码&#xff…

70.SpringMVC怎么和AJAX相互调用的?

70.SpringMVC怎么和AJAX相互调用的&#xff1f; &#xff08;1&#xff09;加入Jackson.jar&#xff08;2&#xff09;在配置文件中配置json的消息转换器.(jackson不需要该配置HttpMessageConverter&#xff09; <!‐‐它就帮我们配置了默认json映射‐‐> <mvc:anno…

NTLM||LM算法lsasswinlogon进程

来填坑了&#xff0c;这篇blog我们就来讲一下mimikatz能抓到开机的密码的原理 1.lsass&&winlogon 不知道大家有没有好奇过&#xff0c;我们每次开机输入密码之后&#xff0c;电脑又怎么知道我们是否输入正确呢&#xff1f; &#xff1a;这就要的得益于我们的两个进程…

【前后端的那些事】webrtc入门demo(代码)

文章目录 前端代码apivue界面 后端modelwebsocketconfigresource 龙年到了&#xff0c;先祝福各位龙年快乐&#xff0c;事业有成&#xff01; 最近在搞webrtc&#xff0c;想到【前后端的那些事】好久都没有更新了&#xff0c;所以打算先把最近编写的小demo发出来。 p2p webrt…

Android 移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&#xff0c;部分库下载异…

【Dubbo源码二:Dubbo服务导出】

入口 Dubbo服务导出的入口&#xff1a;服务导出是在DubboBootstrapApplicationListener在监听到ApplicationContextEvent的ContextRefreshedEvent事件后&#xff0c;会触发dubboBootstrap.start(), 在这个方法中最后会导出Dubbo服务 DubboBootstrapApplicationListener Dub…

【北邮鲁鹏老师计算机视觉课程笔记】03 edge 边缘检测

【北邮鲁鹏老师计算机视觉课程笔记】03 1 边缘检测 有几种边缘&#xff1f; ①实体上的边缘 ②深度上的边缘 ③符号的边缘 ④阴影产生的边缘 不同任务关注的边缘不一样 2 边缘的性质 边缘在信号突变的地方 在数学上如何寻找信号突变的地方&#xff1f;导数 用近似的方法 可以…

【DDD】学习笔记-领域模型与函数范式

函数范式 REA 的 Ken Scambler 认为函数范式的主要特征为&#xff1a;模块化&#xff08;Modularity&#xff09;、抽象化&#xff08;Abstraction&#xff09;和可组合&#xff08;Composability&#xff09;&#xff0c;这三个特征可以帮助我们编写简单的程序。 通常&#…

电商网站基础布局——以小兔鲜为例

项目准备 /* base.css */ /* 內减模式 */ * {margin: 0;padding: 0;box-sizing: border-box; }/* 设置网页统一的字体大小、行高、字体系列相关属性 */ body {font: 16px/1.5 "Helvetica Neue", Helvetica, Arial, "Microsoft Yahei","Hiragino Sans…

编码安全风险是什么,如何进行有效的防护

2011年6月28日晚20时左右&#xff0c;新浪微博突然爆发XSS&#xff0c;大批用户中招&#xff0c;被XSS攻击的用户点击恶意链接后并自动关注一位名为HELLOSAMY的用户&#xff0c;之后开始自动转发微博和私信好友来继续传播恶意地址。不少认证用户中招&#xff0c;也导致该XSS被更…

【深蓝学院】移动机器人运动规划--第4章 动力学约束下的运动规划--笔记

0. Outline 1. Introduction 什么是kinodynamic&#xff1f; 运动学&#xff08;Kinematics&#xff09;和动力学&#xff08;Dynamics&#xff09;都是力学的分支&#xff0c;涉及物体的运动&#xff0c;但它们研究的焦点不同。 运动学专注于描述物体的运动&#xff0c;而…

反应式编程

反应式编程 前言1 反应式编程概览2 初识 Reactor2.1 绘制反应式流图2.2 添加 Reactor 依赖 3.使用常见的反应式操作3.1 创建反应式类型3.2 组合反应式类型3.3 转换和过滤反应式流3.4 在反应式类型上执行逻辑操作 总结 前言 你有过订阅报纸或者杂志的经历吗?互联网的确从传统的…

第66讲管理员登录功能实现

项目样式初始化 放assets目录下&#xff1b; border.css charset "utf-8"; .border, .border-top, .border-right, .border-bottom, .border-left, .border-topbottom, .border-rightleft, .border-topleft, .border-rightbottom, .border-topright, .border-botto…

WWW 万维网

万维网概述 万维网 WWW (World Wide Web) 并非某种特殊的计算机网络。 万维网是一个大规模的、联机式的信息储藏所。 万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点&#xff0c;从而主动地按需获取丰富的信息。 这种访问方式称为“链接”。 万维网是分…

线上编程答疑解惑回顾,初学编程中文编程在线屏幕共享演示

线上编程答疑解惑回顾&#xff0c;初学编程中文编程在线屏幕共享演示 一、学编程过程中有不懂的怎么办&#xff1f; 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载——常用工具下载——编…