Python爬虫(一):爬虫伪装

一、网站防爬机制概述

在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类:

  1. 身份验证机制:直接将未经授权的爬虫阻挡在外
  2. 反爬技术体系:通过各种技术手段增加爬虫获取数据的难度

面对这些防御措施,我们需要让爬虫行为尽可能模拟普通用户,才能成功获取所需数据。本文将全面解析爬虫伪装的核心技术。

二、核心伪装策略详解

2.1 Request Headers伪装

通过访问百度,我们可以观察到Request Headers中的关键字段:

  • Referer:指示请求来源页面

  • User-Agent:包含操作系统、浏览器等客户端信息
    在这里插入图片描述
    处理策略

  1. 对于检查Referer的网站,必须添加合理的Referer值
  2. 为每个请求添加真实有效的User-Agent
import requestsheaders = {'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','Referer': 'https://www.baidu.com/','Accept-Language': 'zh-CN,zh;q=0.9',
}response = requests.get('https://www.example.com', headers=headers)

2.2 IP限制解决方案

网站通常会监控IP的访问频率,超出阈值即判定为爬虫并封锁。

应对方案

  1. 间歇性访问:在请求间设置随机延迟

    import time
    import randomtime.sleep(random.uniform(1, 3))  # 1-3秒随机延迟
    
  2. IP代理池:对于大规模持续爬取,需使用代理IP

    proxies = {'http': 'http://user:pass@10.10.1.10:3128','https': 'http://user:pass@10.10.1.10:1080',
    }
    response = requests.get('https://example.com', proxies=proxies)
    

三、高级反爬机制破解

即使做好基础伪装,仍可能遇到以下复杂情况:

3.1 不规则动态参数

网址中包含无规则的长串参数时,可采用Selenium模拟浏览器:

from selenium import webdriverdriver = webdriver.Chrome()
driver.get("https://example.com")
html = driver.page_source
driver.quit()

3.2 动态校验码

需分析生成规则,常见解决方案:

  • OCR识别(如Tesseract)
  • 第三方验证码识别服务
  • 人工干预(少量请求时)

3.3 动态交互验证

需要模拟用户操作才能通过验证:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChainselement = driver.find_element(By.ID, "slider")
ActionChains(driver).drag_and_drop_by_offset(element, 100, 0).perform()

3.4 分批次异步加载

解决信息不完整问题:

# 滚动页面触发加载
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)  # 等待内容加载

四、综合解决方案

  1. 多维度伪装组合

    • 轮换User-Agent
    • 使用会话保持cookies
    • 合理设置请求间隔
    • 必要时使用代理IP
  2. 智能切换策略

    if "验证码" in response.text:# 切换到Selenium方案
    elif "IP限制" in response.text:# 切换代理IP
    
  3. 遵守爬取伦理

    • 控制请求频率
    • 尊重robots.txt
    • 不爬取敏感数据

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

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

相关文章

快速使用 Flutter Card 组件指南

目录 一、引言 二、Card 的基本用法 三、主要属性 3.1 elevation (阴影高度) 3.2 shape (形状) 3.3 color (颜色) 3.4 margin (外边距) 3.5 完整示例 四、结合 ListTile 组件使用 五、带图片的 Card 示例 六、注意事项 相关推荐 一、引言 Card 是 Flutter 提供的一个…

C语言内存管理和编译优化实战

参考: C语言内存管理“玄学”:从崩溃到精通的避坑指南C语言编译优化实战:从入门到进阶的高效代码优化技巧

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表; 分别是: 订单主表:jjy_orderMain订单产…

CppCon 2015 学习:Live Lock-Free or Deadlock

这段内容是介绍一场关于**“实用无锁编程(Practical Lock-Free Programming)”**的讲座提纲,重点在C中的并发编程。下面是详细的中文理解和分析: 讲座大纲和内容理解 主题概览 适当的“guru崇拜”和“祈求” → 开场调侃&#…

centos7编译安装LNMP架构

一、LNMP概念 LNMP架构是一种常见的网站服务器架构,由Linux操作系统、Nginx Web服务器、MySQL数据库和PHP后端脚本语言组成。 1 用户请求:用户通过浏览器输入网址,请求发送到Nginx Web服务器。 2 Nginx处理:Nginx接收请求后&…

Spark 写文件

Repartition Spark 输出文件数量 假设每个 Task 的输出数据都包含了全部 8 个分区值,那么最终的文件生成情况如下: 总文件数 = Task 数量 分区组合数 假设: ​Task 数量​:200 ​分区组合数​:8 个 (from_cluster 和 ds 的组合) 则: ​总文件数​:200 8 = ​1600 …

自定义protoc-gen-go生成Go结构体,统一字段命名与JSON标签风格

背景 在日常的 Go 微服务开发中,Protocol Buffers(protobuf) 是广泛使用的数据交换格式。其配套工具 protoc-gen-go 会根据 .proto 文件生成 Go 结构体代码,但默认生成的字段名、JSON tag 命名风格往往不能满足所有团队或项目的代…

LabVIEW的MathScript Node 绘图功能

该VI 借助 LabVIEW 的 MathScript Node,结合事件监听机制,实现基于 MathScript 的绘图功能,并支持通过交互控件自定义绘图属性。利用 MathScript 编写脚本完成图形初始化,再通过LabVIEW 事件结构响应用户操作,动态修改…

GD图像处理与SESSiON

SESSION: 原理: session与浏览器无关,但是与cookie有关 1.PHP碰到session_start()时开启session会话,会自动检测sessionID a. 如果cookie中存在,使用现成的 b. 如果cookie中不存在,创建一个sessionID,并通过响应头以cookie形式保存到浏览…

【Web应用】若依框架:基础篇14 源码阅读-后端代码分析-课程管理模块前后端代码分析

文章目录 一、课程管理模块前端代码截图二、前端代码及分析index.vuecourse.js 三、前端执行流程1. 组件初始化2. 查询操作3. 列表操作4. 对话框操作5. API 请求6. 执行流程总结关键点 四、课程管理模块后端代码截图五、后端代码块CourseControllerICourseServiceCourseMapperC…

深入理解系统:UML类图

UML类图 类图(class diagram) 描述系统中的对象类型,以及存在于它们之间的各种静态关系。 正向工程(forward engineering)在编写代码之前画UML图。 逆向工程(reverse engineering)从已有代码建…

DeepSeek12-Open WebUI 知识库配置详细步骤

📚 Open WebUI 知识库配置详细步骤(中英文对照) 🌐 界面语言切换 # 首次登录后切换语言: 1. 点击左下角用户头像 → Settings 2. 在 "General" 选项卡找到 "Language" 3. 选择 中文(简体)/Engli…

Python网络设备批量配置脚本解析

目录 脚本概述 代码解析 导入模块 日志配置 核心函数config_device 主程序逻辑 使用说明 脚本优化建议 完整代码 脚本概述 这是一个使用Python编写的网络设备批量配置脚本,主要功能是通过SSH协议批量登录多台网络设备(如路由器、交换机等&…

Z-FOLD: A Frustratingly Easy Post-Training Quantization Scheme for LLMs

文章目录 摘要1 引言2 相关工作2.1 量化2.2 大型语言模型的量化 3 Z-FOLD3.1 新引入的参数 ζ3.2 参数整合(ζ 折叠)3.3 使用校准集的微调 4 实验4.1 实验设置4.2 与其他方法的比较4.3 Z-FOLD 的泛化能力4.4 Z-FOLD 的可移植性4.5 消融研究 5 结论6 限制…

交流电机深度解析:从基础到实战的全面指南

简介 交流电机作为现代工业中不可或缺的动力设备,广泛应用于各个领域。本文将带你深入了解交流电机,从最基础的概念和工作原理开始,逐步介绍其类型、结构、关键参数等基础知识。同时,我们会探讨交流电机在企业级开发研发中的技术实战,包括控制技术、调速方法、建模与仿真…

【靶场】XXE-Lab xxe漏洞

前言 学习xxe漏洞,搭了个XXE-Lab的靶场 一、搭建靶场 现在需要登录,不知道用户名密码,先随便试试抓包 二、判断是否存在xxe漏洞 1.首先登录抓包 看到xml数据解析,由此判断和xxe漏洞有关,但还不确定xxe漏洞是否存在。 2.尝试xxe 漏洞 判断是否存在xxe漏洞 A.send to …

【C++特殊工具与技术】优化内存分配(三):operator new函数和opertor delete函数

目录 一、基础概念:operator new与operator delete的本质 1.1 标准库提供的operator new接口 1.2 标准库operator delete的接口 1.3 关键特性总结 二、new表达式与operator new的调用链解析 2.1 new表达式的底层步骤 2.2 示例:观察new表达式的调用…

[c#]判定当前软件是否用管理员权限打开

有时一些软件的逻辑中需要使用管理员权限对某些文件进行修改时,那么该软件在执行或者打开的场合,就需要用使用管理员身份运行才能达到效果。那么在c#里,如何判定该软件是否是对管理员身份运的呢? 1.取得当前的windows用户。 2.取得…

如果在main中抛出异常,该如何处理

#采用 setDefaultUncaughtExceptionHandler 进行全局兜底 public static void main(String[] args) { Thread.setDefaultUncaughtExceptionHandler((thread, ex) -> { System.err.println("全局捕获异常: " ex.getMessage()); ex.printStackTrace(); System.exi…

HBM 读的那些事

如下所示,为HBM读的时序。注意这里说的HBM是和HBM3是有区别的. RL 的配置,是通过MR2来实现的 WDQS貌似和CK同频。这幅图告诉你,WDQS和CK的源头是一样的,都来自PLL,而且中间没有经过倍频操作。所以两者频率基本是一致的。这是HBM的…