Python 爬虫中的反爬策略及详细应对方法

在构建Python爬虫的过程中,网站为了保护自身资源和用户体验,常常会采取一系列反爬策略来限制或阻止自动化程序的访问。了解这些策略对于设计更智能、更合规的爬虫至关重要。以下是详细的反爬措施及其应对方法:

1. User-Agent 检测

策略描述:
许多网站会检查HTTP请求头中的User-Agent字段,以判断请求是否来自浏览器。如果发现是来自非标准用户代理(如Python默认的requests库),可能会拒绝服务。

应对方法:

  • 修改请求头:模拟真实的浏览器访问。
  • 使用随机的User-Agent字符串:模仿不同的浏览器环境,减少被识别为爬虫的风险。
import requests
from fake_useragent import UserAgentua = UserAgent()
headers = {'User-Agent': ua.random,  # 使用fake_useragent库生成随机User-Agent
}
response = requests.get('https://example.com', headers=headers)

2. IP 封禁

策略描述:
频繁的请求可能导致服务器负载过高,因此一些网站会对短时间内发出大量请求的IP地址进行封禁。

应对方法:

  • 降低请求频率:设置合理的延时,避免过于密集地发送请求。
  • 使用代理池:通过多个代理IP轮流发送请求,分散单个IP的压力。
  • 分布式爬取:利用多台机器或云计算平台,从不同地理位置发起请求。
import time
import randomdef fetch_with_delay(url, delay_min=1, delay_max=3):""" 发送请求并根据设定的时间间隔延迟 """response = requests.get(url)print(f"Request to {url} returned status code: {response.status_code}")sleep_time = random.uniform(delay_min, delay_max)  # 随机延迟time.sleep(sleep_time)# 示例调用
fetch_with_delay('https://example.com')

代理池管理:
可以使用像proxies这样的库或者自己编写代码来管理和轮换代理IP。

proxy_list = ['http://proxy1.example.com:8080', 'http://proxy2.example.com:8080']def get_random_proxy():return {'http': random.choice(proxy_list), 'https': random.choice(proxy_list)}response = requests.get('https://example.com', proxies=get_random_proxy())

3. 验证码

策略描述:
为防止自动化工具滥用,部分网站会在登录或关键操作页面添加图形验证码、滑动验证等机制。

应对方法:

  • OCR 技术:对于简单的图形验证码,可以尝试使用光学字符识别(OCR)技术自动解析。
  • 第三方API:利用专业的验证码识别服务,如打码平台。
  • 手动处理:对于复杂的验证码,可能需要人工介入完成验证过程。

使用Tesseract OCR解析验证码:

from PIL import Image
import pytesseractdef solve_captcha(image_path):image = Image.open(image_path)captcha_text = pytesseract.image_to_string(image)return captcha_text.strip()captcha_solution = solve_captcha('captcha.png')
print("Captcha solution:", captcha_solution)

使用打码平台API:

import requestsdef solve_captcha_api(api_key, captcha_image_url):url = "https://api.captcha_solver_service.com/solve"data = {'key': api_key,'method': 'post','file': requests.get(captcha_image_url).content}response = requests.post(url, files=data)return response.json()['solution']api_key = 'your_api_key'
captcha_solution = solve_captcha_api(api_key, 'https://example.com/captcha.png')
print("Captcha solution from API:", captcha_solution)

4. 动态内容加载

策略描述:
现代网页越来越多地采用JavaScript动态加载内容,传统的HTML解析方式无法直接获取到完整信息。

应对方法:

  • Selenium 或 Puppeteer:使用这些工具模拟真实浏览器行为,执行JavaScript代码,等待页面完全加载后再抓取数据。
  • API 接口:有些网站提供官方API接口,可以直接调用API获取所需数据,避免直接爬取前端渲染的内容。

使用Selenium模拟浏览器:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManagerdriver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get('https://example.com')# 等待元素加载完毕后提取数据
element = driver.find_element(By.ID, 'target-element-id')
data = element.text
print(data)driver.quit()

直接调用API:

api_url = 'https://api.example.com/data'
params = {'param1': 'value1', 'param2': 'value2'}
response = requests.get(api_url, params=params)
data = response.json()
print(data)

5. Cookie 和 Session 管理

策略描述:
网站可能会通过设置Cookie或Session ID跟踪用户的会话状态,确保连续性。某些情况下,缺少必要的Cookie会导致请求失败。

应对方法:

  • 保持会话:使用requests.Session()对象管理整个会话期间的Cookie和Header信息。
  • 登录认证:如果目标网站需要登录,先通过表单提交用户名密码获得合法的Cookie,再进行后续爬取。

使用Session保持会话:

session = requests.Session()# 登录并获取Cookie
login_url = 'https://example.com/login'
data = {'username': 'your_username', 'password': 'your_password'}
session.post(login_url, data=data)# 使用已登录的状态访问其他页面
profile_url = 'https://example.com/profile'
response = session.get(profile_url)
print(response.content)

6. robots.txt 规则

策略描述:
虽然不是严格意义上的反爬手段,但遵守网站的robots.txt文件是道德和法律上的要求。该文件规定了哪些路径允许或禁止爬虫访问。

应对方法:

  • 尊重规则:在爬取前检查目标网站的robots.txt,遵循其指示,不访问被禁止的URL。
  • 联系网站管理员:对于特别重要的数据需求,可以通过正式渠道与网站所有者沟通,寻求合作或特别许可。

检查robots.txt规则:

import urllib.robotparserrp = urllib.robotparser.RobotFileParser()
rp.set_url('https://example.com/robots.txt')
rp.read()can_fetch = rp.can_fetch('*', '/path/to/resource')
if can_fetch:print("Can fetch the resource.")
else:print("Cannot fetch the resource.")

7. 加密参数

策略描述:
一些网站为了防止爬虫,会在URL或POST请求中加入加密的参数,使得常规的参数猜测无效。

应对方法:

  • 逆向工程:分析JavaScript代码,找出加密算法,并尝试实现相应的解密逻辑。
  • 抓包分析:使用网络调试工具(如Fiddler、Wireshark)捕获并分析实际请求的数据包,理解参数结构。

逆向工程示例:

假设某个网站在每次请求时都会附加一个名为token的参数,这个参数是由JavaScript函数生成的。你可以通过查看网站源码找到该函数,并将其移植到Python中执行。

// JavaScript中的原始加密函数
function generateToken() {// 加密逻辑...return encryptedValue;
}
# Python版本的加密函数
def generate_token():# 根据JavaScript代码实现相同的加密逻辑pass# 在Python中调用
token = generate_token()
response = requests.get('https://example.com', params={'token': token})

8. 行为检测

策略描述:
高级别的反爬系统能够监测用户的行为模式,比如鼠标移动轨迹、点击间隔时间等,以此判断是否为机器人。

应对方法:

  • 模拟人类行为:尽量让爬虫的行为接近真实用户,例如随机化浏览速度、模拟鼠标动作等。
  • 绕过检测:有时可以通过修改请求特征或使用特定插件来绕过行为检测。

模拟人类行为:

import random
import timedef simulate_human_behavior():# 模拟人类行为,例如随机滚动页面、点击链接等scroll_distance = random.randint(100, 500)click_interval = random.uniform(0.5, 2.0)# 实际操作可以根据具体场景调整print(f"Scrolling down by {scroll_distance}px and clicking after {click_interval:.2f}s")simulate_human_behavior()
time.sleep(click_interval)  # 模拟点击后的停顿

使用特定插件绕过检测:

有些浏览器插件可以帮助绕过行为检测,如StealthPlugin用于Selenium,它可以在启动浏览器时不暴露自动化脚本的存在。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium_stealth import stealthoptions = Options()
options.add_argument("--headless")  # 无头模式
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(options=options)stealth(driver,languages=["en-US", "en"],vendor="Google Inc.",platform="Win32",webgl_vendor="Intel Inc.",renderer="Intel Iris OpenGL Engine",fix_hairline=True,)driver.get('https://example.com')
# 继续执行其他操作...

结语

面对日益复杂的反爬策略,编写高效的爬虫不仅需要掌握编程技巧,还需要具备一定的安全意识和伦理观念。始终遵守法律法规,尊重网站的规定,合理利用公共资源,这样才能保证爬虫项目的长期稳定运行。同时,随着技术的发展,不断学习新的方法和技术也是必不可少的。希望这篇文章能帮助你更好地理解和应对各种反爬挑战,开发出更加智能且合规的爬虫应用。

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

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

相关文章

FreeSWITCH 简单图形化界面38 - 使用uniapp中使用JsSIP进行音视频呼叫

FreeSWITCH 简单图形化界面38 - 在uniapp中使用JsSIP进行音视频呼叫 0、测试环境1、学习uniapp2、测试代码main.jsutils/render.jsstore/data.jspages/index/index.vuepages.json 3、效果4、难点 0、测试环境 http://myfs.f3322.net:8020/ 用户名:admin&#xff0c…

【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块

目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…

嵌入式硬件杂谈(八)电源的“纹波”到底是什么?

纹波的引入:在我们嵌入式设备中,很多时候电路电源的纹波很敏感,纹波太大会导致系统不工作,因此设计一个纹波很小的电路就是我们的需求了。 电路的纹波是什么? 纹波(Ripple)是指电源输出中叠加在…

Linux系统之stat命令的基本使用

Linux系统之stat命令的基本使用 一、stat命令 介绍二、stat命令帮助2.1 查询帮助信息2.2 stat命令的帮助解释 三、stat命令的基本使用3.1 查询文件信息3.2 查看文件系统状态3.3 使用格式化输出3.4 以简洁形式打印信息 四、注意事项 一、stat命令 介绍 stat 命令用于显示文件或文…

uniapp开发微信小程序实现获取“我的位置”

1. 创建GetLocation项目 使用HBuilder X创建一个项目GetLocation,使用Vue3。 2. 在腾讯地图开放平台中创建应用 要获取位置,在小程序中需要使用腾讯地图或是高德地图。下面以腾讯地图为例。 (1)打开腾讯地图开放平台官方网址:腾讯位置服务 - 立足生态,连接未来 (2)注册…

基于NodeMCU的物联网空调控制系统设计

最终效果 基于NodeMCU的物联网空调控制系统设计 项目介绍 该项目是“物联网实验室监测控制系统设计(仿智能家居)”项目中的“家电控制设计”中的“空调控制”子项目,最前者还包括“物联网设计”、“环境监测设计”、“门禁系统设计计”和“小…

easegen将教材批量生成可控ppt课件方案设计

之前客户提出过一个需求,就是希望可以将一本教材,快速的转换为教学ppt,虽然通过人工程序脚本的方式,已经实现了该功能,但是因为没有做到通用,每次都需要修改脚本,无法让客户自行完成所有流程&am…

从安全角度看 SEH 和 VEH

从安全角度看 SEH 和 VEH 异常处理程序是处理程序中不可预见的错误的基本方法之一 https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/exceptions/ SEH——结构化异常处理程序 就其工作方式而言,异常处理程序与其他处理程序相比相当基础&#xff0…

nexus docker安装

#nexus docker 安装 docker pull sonatype/nexus3 mkdir -p /data/nexus-data docker run -itd -p 8081:8081 --privilegedtrue --name nexus3 \ -v /data/nexus-data:/var/nexus-data --restartalways docker.io/sonatype/nexus3 #访问 http://192.168.31.109:8081/ 用户名&am…

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈: Spark Core:实现了…

CSS---实现盒元素div内input/textarea的focus状态时给父元素加属性!

注意兼容性,低版本浏览器无效 要实现当 textarea 文本框获得焦点时,自动给其父元素添加类名或样式,您可以使用 CSS 的 :focus-within 伪类选择器。这个选择器会在元素本身或其任何子元素获得焦点时应用样式。 示例代码 假设您有以下 HTML 结…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间:2011-2020年 2、来源:国家统计局 3、指标:省份、时间、城镇职工基本医疗保险年末参保人数 4、范围:31省 5、指标解释:参保人数指报告期末按国家有关…

Bert中文文本分类

这是一个经典的文本分类问题,使用google的预训练模型BERT中文版bert-base-chinese来做中文文本分类。可以先在Huggingface上下载预训练模型备用。https://huggingface.co/google-bert/bert-base-chinese/tree/main 我使用的训练环境是 pip install torch2.0.0; pi…

【无标题】学生信息管理系统界面

网页是vue框架,后端直接python写的没使用框架

macos安装maven以及.bash_profile文件优化

文章目录 下载和安装maven本地仓库配置国内镜像仓库配置.bash_profile文件优化 下载和安装maven maven下载地址 存放在/Library/Java/env/maven目录 本地仓库配置 在maven-3.9.9目录下创建maven-repo目录作为本地文件仓库打开setting配置文件 在setting标签下,添…

用Excel表格在线发布期末考试成绩单

每到期末,发布学生的期末考试成绩单便是老师们的一项重要任务。以往,传统的纸质成绩单分发效率低还易出错,而借助 Excel 表格在线发布,则开启了全新高效模式。 老师们先是精心整理各科成绩,录入精准无误的分数到 Excel…

WPF 绘制过顶点的圆滑曲线(样条,贝塞尔)

项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: -------------------…

python监控数据处理应用服务Socket心跳解决方案

1. 概述 从网页、手机App上抓取数据应用服务,涉及到多个系统集成协同工作,依赖工具较多。例如,使用Frida进行代码注入和动态分析,以实现对网络通信的监控和数据捕获。在这样的集成环境中,手机模拟器、手机中应用、消息…

商品线上个性定制,并实时预览3D定制效果,是如何实现的?

商品线上3D个性化定制的实现涉及多个环节和技术,以下是详细的解释: 一、实现流程 产品3D建模: 是实现3D可视化定制的前提,需要对产品进行三维建模。可通过三维扫描仪或建模师进行建模,将产品的外观、结构、材质等细…

Python PyMupdf 去除PDF文档中Watermark标识水印

通过PDF阅读或编辑工具,可在PDF中加入Watermark标识的PDF水印,如下图: 该类水印特点 这类型的水印,会在文件的字节流中出现/Watermark、EMC等标识,那么,我们可以通过改变文件字节内容,清理掉…