第七课:Python反爬攻防战:Headers/IP代理与验证码

news2025/4/21 13:55:49

在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和应用这些技术。

一、常见反爬机制解析

1.1 基于Headers的反爬

许多网站通过检查请求头(Headers)中的User-Agent字段来判断请求是否来自爬虫。如果User-Agent字段不符合预期,网站可能会拒绝服务或返回错误页面。

1.2 基于IP的反爬

为了限制爬虫对网站的访问频率,网站通常会记录访问者的IP地址。当某个IP地址在短时间内发送大量请求时,网站可能会暂时或永久封禁该IP地址。

1.3 基于验证码的反爬

验证码是网站用来区分人类用户和自动化脚本的一种有效手段。当检测到异常访问模式时,网站可能会要求访问者输入验证码以验证其身份。

二、随机User-Agent生成

为了绕过基于Headers的反爬机制,我们可以使用随机User-Agent来模拟不同浏览器的访问请求。Python中的fake_useragent库可以帮助我们轻松实现这一点。

安装命令

pip install fake-useragent

示例代码

import requests
from fake_useragent import UserAgent
 
# 生成一个随机的User-Agent
ua = UserAgent()
random_user_agent = ua.random
 
# 设置请求头
headers = {
    'User-Agent': random_user_agent
}
 
# 发送请求
response = requests.get('https://www.example.com', headers=headers)
print(response.text)

三、代理IP池搭建实战

为了绕过基于IP的反爬机制,我们可以使用代理IP来隐藏真实的IP地址。搭建一个代理IP池,并随机选择代理IP进行请求,可以大大降低被封禁的风险。

示例代码

3.1 爬取代理IP

首先,我们需要从一些提供免费代理IP的网站爬取代理IP信息。

import requests
from bs4 import BeautifulSoup
 
def get_proxy_ips():
    # 替换为实际代理IP网站
    url = "https://www.example-proxy-website.com"
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    proxy_ips = []
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            soup = BeautifulSoup(response.text, 'html.parser')

            # 假设代理IP信息在一个表格中,通过查找表格行(tr)来获取数据
            rows = soup.find_all('tr')

            # 跳过表头行
            for row in rows[1:]:
                cols = row.find_all('td')
                ip = cols[0].text
                port = cols[1].text
                proxy = f"{ip}:{port}"
                proxy_ips.append(proxy)
        return proxy_ips
    except requests.RequestException as e:
        print(f"请求错误: {e}")
        return []
 
proxy_ips = get_proxy_ips()
print(proxy_ips)
3.2 验证代理IP

爬取到的代理IP不一定都能正常使用,因此我们需要进行可用性验证。

def check_proxy(proxy):
    test_url = "https://www.baidu.com"
    
    # 可以代理的字典数据
    proxies = {
        "http": f"http://{proxy}",
        "https": f"https://{proxy}"
    }
    try:

        # 测试代理地址
        response = requests.get(test_url, proxies=proxies, timeout=5)
        if response.status_code == 200:
            return True
        return False
    except requests.RequestException:
        return False
 
valid_proxy_ips = []
for proxy in proxy_ips:
    if check_proxy(proxy):
        valid_proxy_ips.append(proxy)

# 输出可以进行代理的正确地址
print(valid_proxy_ips)
3.3 使用代理IP进行请求

最后,我们可以使用验证通过的代理IP来发送请求。

import random
 
# 随机选择一个可用的代理IP
proxy = random.choice(valid_proxy_ips)
proxies = {
    "http": f"http://{proxy}",
    "https": f"https://{proxy}"
}
 
# 设置请求头
headers = {
    'User-Agent': random_user_agent
}
 
# 发送请求
response = requests.get('https://www.example.com', headers=headers, proxies=proxies)
print(response.text)

四、验证码识别基础方案

验证码识别是绕过基于验证码反爬机制的关键。虽然验证码识别技术相对复杂,但我们可以使用一些开源的OCR(文字识别)库来实现基本的验证码识别。

示例代码

4.1 安装必要的库

从Tesseract-OCR官网下载并安装Tesseract-OCR

首先,我们需要安装Pillow和pytesseract库。Pillow用于图像处理,pytesseract是Tesseract-OCR的Python接口。

pip install pillow pytesseract

注意:你还需要从Tesseract-OCR官网下载并安装Tesseract-OCR,并设置环境变量TESSDATA_PREFIX指向包含tessdata的目录。

4.2 验证码识别

假设我们已经下载了一张验证码图片captcha.jpg,我们可以使用以下代码进行识别。

from PIL import Image
import pytesseract
 
# 打开验证码图片
image = Image.open('captcha.jpg')
 
# 进行OCR识别
text = pytesseract.image_to_string(image, lang='eng')
 
print('识别结果:', text)

识别完成以后,根据前边学习的内容,把图片中的内容填写到输入框即可

总结

本文通过详细解析常见的反爬机制,并提供了随机User-Agent生成、代理IP池搭建以及验证码识别的基础方案,帮助读者更好地理解和应对Python爬虫中的反爬挑战。希望这些技术和示例代码能对大家的爬虫开发有所帮助。

关注我!!🫵 持续为你带来Python相关内容。

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

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

相关文章

MySql的安装及数据库的基本操作命令

1.MySQL的安装 1.1进入MySQL官方网站 1.2点击下载 1.3下拉选择MySQL社区版 1.4选择你需要下载的版本及其安装的系统和下载方式 直接安装以及压缩包 建议选择8.4.4LST LST表明此版本为长期支持版 新手建议选择红框勾选的安装方式 1.5 安装包下载完毕之后点击安装 2.数据库…

VsCode导入时选择相对路径

自动导入时总是以db://开头了,而我们通常需要的是相对路径,对VsCode进行如下设置: 打开 VSCode 设置: 使用快捷键 Ctrl ,(Windows/Linux)或 Cmd ,(Mac)。 或者在菜单栏中选择 …

计算机视觉|3D卷积网络VoxelNet:点云检测的革新力量

一、引言 在科技快速发展的背景下,3D 目标检测技术在自动驾驶和机器人领域中具有重要作用。 在自动驾驶领域,车辆需实时、准确感知周围环境中的目标物体,如行人、车辆、交通标志和障碍物等。只有精确检测这些目标的位置、姿态和类别&#x…

AI数字人源码开发---SaaS化源码部署+PC+小程序一体化

#数字人#数字人分身#123数字人#数字人分身源码部署搭建 AI数字人源码开发步骤 确定功能需求:首先确定需要实现的功能和特性,包括语音识别、自然语言处理、人脸识别等功能。这些功能将构成AI数字人的核心功能。 开发AI数字人源码:使用合适的…

Linux网络相关内容与端口

网络相关命令 ping命令测试连接状态 wget命令:非交互式文件下载器,可以在命令行内下载网络文件 使用ctrlc可以中止下载 curl命令:可以发送http网络请求,用于文件下载、获取信息等 其实和浏览器打开网站一样,cu…

【招聘精英】

我们公司是一个位于石家庄的一个科技型新型技术公司。主要做人力资源、用工、科技等方面。 有意向回石家庄的或者已经在石家庄的技术大咖、软件大牛、产品大佬、UI大神可以来了解一下。 现在招聘 高级前端开发 高级java开发 其他岗位也可以联系。 有意向的朋友可以私信我。 -…

ESP8266 NodeMCU 与 Atmega16 微控制器连接以发送电子邮件

NodeMCU ESP8266 AVR 微控制器 ATmega16 的接口 Atmega16 是一款低成本的 8 位微控制器,比以前版本的微控制器具有更多的 GPIO。它具有所有常用的通信协议,如 UART、USART、SPI 和 I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业有广泛的应用。 Atmega1…

MongoDB用户管理和复制组

用户管理 1、建用户时,use到的库就是此用户的验证库 2、登录时必须明确指定验证库才能登录 3、通常管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库 4、如果直接登录到数据库,不进行use(示例&#xff…

SQLAlchemy系列教程:集成Pydantic增强数据处理能力

本教程介绍如何将Pydantic用于数据验证,SQLAlchemy用于数据库操作,从而通过强大的数据处理能力增强Python应用程序。 介绍 在现代web开发中,确保数据的有效性和完整性至关重要。Pydantic和SQLAlchemy是两个功能强大的Python库,可…

【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 有一个特殊的结点&…

IP,MAC,ARP 笔记

1.什么是IP地址 IP 地址是一串由句点分隔的数字。IP 地址表示为一组四个数字,比如 192.158.1.38 就是一个例子。该组合中的每个数字都可以在 0 到 255 的范围内。因此,完整的 IP 寻址范围从 0.0.0.0 到 255.255.255.255。 IP 地址不是随机的。它们由互…

【记录】Python3|Linux下安装Virtualenv和virtualenvwrapper用于处理虚拟环境

之前写过一篇Anaconda的:【安装】Python3|Windows下安装Anaconda、pytorch,以及修改pip默认安装路径_anaconda pip修改安装的包路径-CSDN博客 还写过一篇专门讲所有虚拟环境的:【记录】环境|Ubuntu18.04 Python 开发环…

VSTO(C#)Excel开发3:Range对象 处理列宽和行高

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

Selenium库打开指定端口(9222、9333等)浏览器【已解决!!!】

就是在写动态爬虫爬取数据的过程中,如果用selenium的话,有一个缺点,就是当我们去测试一个网站能不能爬取,它都会重新换端口打开一个浏览器,不会使用上一次使用的浏览器,在实际使用过程中这样调试很烦&#…

蓝桥杯备考:倍增算法详解

如果我们想暴力求解的话&#xff0c;我们的时间复杂度是O&#xff08;N&#xff09;b最大是10的9次方&#xff0c;这时候我们一定会超时 #include <iostream> using namespace std;typedef long long LL; LL a,b,p;LL ret 1; int main() {cin >> a >> b &g…

SQL经典查询

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

## DeepSeek写水果记忆配对手机小游戏

DeepSeek写水果记忆配对手机小游戏 提问 根据提的要求&#xff0c;让DeepSeek整理的需求&#xff0c;进行提问&#xff0c;内容如下&#xff1a; 请生成一个包含以下功能的可运行移动端水果记忆配对小游戏H5文件&#xff1a; 要求 可以重新开始游戏 可以暂停游戏 卡片里的水果…

【GoTeams】-5:引入Docker

本文目录 1. Dokcer-compose回顾下Docker知识编写docker-compose.yaml运行docker 2. 部署go服务编写dockerfile 1. Dokcer-compose 这里简单先用一下win版本的Docker&#xff0c;后期开发好了部署的时候再移植到服务器下进行docker部署。 输入命令docker-compose version 就可…

将自定义vue组件加载在Mapbox或Maplibre的marker和popup上

1. 使用场景 在开发WebGIS应用时&#xff0c;我们常需要将自定义UI组件与地图元素结合。本文介绍如何将Vue组件集成到Mapbox/Maplibre的Marker标记点和Popup弹窗中&#xff0c;实现动态交互式的地图功能。 2. 为什么需要特殊处理&#xff1f; 在常规开发中我们大多的处理是 …

GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题

LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249&#xff0c; webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间&#xff0c;下面介绍下如何修改配置这个区间。 从页面上修改这个区间&#xff0c;端口区间尽量设置大…