网页不同渲染方式的应对与反爬机制的处理——python爬虫

文章目录

    • 写在前面
    • 爬虫习惯
      • web 网页渲染方式
        • 服务器渲染
        • 客户端渲染
    • 反爬机制
      • 使用session对象
      • 使用cookie
      • 让请求头信息更丰富
      • 使用代理和随机延迟

写在前面

本文是对前两篇文章所介绍的内容的补充,在了解前两篇文章——《爬虫入门与requests库的使用》和《BeautifulSoup 库的使用》,对python 爬虫理论上的介绍后,再看本文,你将会有更加深刻的理解(大佬随意🎉)。

爬虫习惯

在了解requests库BeautifulSoup 库后,我们需要知道一些关于爬虫开发习惯和原则,以此来应对网页不同的渲染方式

web 网页渲染方式

首先,要知道一般情况,web网页会有两种渲染方法:

  • 服务器渲染:在服务器那边,直接将数据html页面代码整合在一起,返回给浏览器-----在浏览器上的页面源代码中能够找到对应的数据
  • 客户端渲染: 第一次请求服务器,只要一个html的骨架,第二次请求才会拿到对应的数据,然后由客户端(浏览器)将html数据整合在一起,展示出来-----在浏览器上的页面源代码中找不到对应的数据
服务器渲染

其次,BeautifulSoup 库是用来处理爬取到的页面源代码(html)的,若要爬取到网页源代码,就要知道其对应url:

在这里插入图片描述

如上图所示,红框处不仅有url还有对应的参数信息,以上方式适用于服务器渲染,即在页面源代码中找得到数据

客户端渲染

另外一种情况就是客户端渲染,其依靠于浏览器抓包工具,如下图:

在这里插入图片描述

若想要爬取到上述红框的数据,需要知道其对应的url,如下:

在这里插入图片描述

上图中的url后面也携带了参数,但是我们一般不看,因为不方便,我们一般采用如下方式查看参数:

在这里插入图片描述

最重要的原则是:以上两个方式,能直接爬取到数据,绝不爬取html页面!!!

反爬机制

一般的网站都会有反爬机制,当我们通过爬虫进行爬取网站数据时,可能会触发该网站的反爬机制,通常情况下,返回状态码<403>,就表明触发了反爬机制,在反爬机制下,爬虫是无法再继续获取数据的,必须要用户亲自登录该网站才行,为此,我们必须尽可能地避免触发网站的反爬机制,而避免的方法有以下几种。

使用session对象

尽可能地使用Session(会话)对象来封装爬虫,而不是直接使用requests库来封装爬虫。

Session(会话) 的主要作用:

  1. 自动管理Cookie

当我们访问需要登录的网站时,首次登录后服务器会返回 Cookies,后续请求需携带这些 Cookies 以维持登录状态。
而有了Session后,Session就可以自动保存和发送 Cookies,无需手动处理。


session = requests.Session()
#创建一个持久化的会话对象# 向指定网址发送登录请求(自动保存 Cookies)
session.post("https://example.com/login", data={"user": "admin", "pass": "123"})
# post——提交用户名(user)和密码(pass)等参数
# 用Session对象发送post登录请求,Session对象可以自动接收并存储服务器返回的Cookies# 后续请求通过Session对象发出,请求将自动携带 Cookies
response = session.get("https://example.com/dashboard")
  1. 持久化公共参数

当我们有多个请求都需要相同的 Headers(请求头)、超时时间认证信息代理时,可以使用Session对象,一次性设置参数,所有通过 该Session对象发起的请求自动继承这些参数。

session = requests.Session()   #创建一个session对象session.headers.update({"User-Agent": "My Crawler/1.0"})
# 向session对象中添加一个请求头session.proxies = {"http": "http://10.10.1.10:3128"}
# 向session对象中添加一个代理# 所有请求自动携带 请求头 和代理
session.get("https://example.com/page1")
session.get("https://example.com/page2")
  1. 复用 TCP 连接(性能优化)

当我们高频次请求同一服务器时,重复建立和断开 TCP 连接会浪费资源,这个时候,我们可以通过Session对象来对TCP连接进行复用,通过复用连接,可以减少延迟并提升效率。

# 未使用 Session:每次请求新建连接
for _ in range(10):requests.get("https://example.com")  # 10 次独立连接# 使用 Session:复用同一连接(推荐使用)
with requests.Session() as session:for _ in range(10):session.get("https://example.com")  # 更高效

4.保持请求上下文

某些网站会检查请求的连贯性(如反爬机制),我们可以通过session对象来模拟浏览器行为,保持一致的上下文(如Referer、Cookies)。

注意事项:

  • 会话对象需合理关闭(推荐用 with 语句管理资源)。
  • 如果请求不同网站且无需共享参数,直接使用 requests.get() 更轻量

使用cookie

提前登录你要爬取的网站,通过浏览器抓包,在你的登录后的任意请求的请求头中找到"cookie"的字段或者在响应头中找到"set-cookie"字段,将cookie复制到你的代码中,作为爬虫伪装的请求头的一部分。

在这里插入图片描述

  • 如上图,cookie的形式: cookie名 = cookie值,上图红框内有很多cookie,有些是目标网站的,有些是第三方平台的。这里面不是所有cookie都必须需要,其核心的cookiedbcl2 + ck登录相关)、bid反爬基础)。
  • 此外,cookie的获取,还可以通过代码来实现:response.cookies,该代码作用是返回要爬取的网页的所有的cookie

在这里插入图片描述

如上图所示,只有一个cookiecookie名为"bid",其tk6VyicFk4E

一般请求头中有了cookie,服务器就会默认此请求是一个用户发出的,而不是爬虫。

让请求头信息更丰富

对于爬虫伪装的请求头,信息要越丰富越好,一般必须有这两个字段"referer"
"User-Agent",其余字段视情况判断是否添加。

关于"User-Agent"字段,可以使用 fake_useragent 库生成随机浏览器"User-Agent",这样能够增大绕开机制的可能。

from fake_useragent import UserAgent
import requestsua = UserAgent()
headers = {'User-Agent': ua.random}  #随机生成的UA
response = requests.get(url, headers=headers)

使用代理和随机延迟

短时间高频请求触发会触发网站对该 IP地址的封禁,因此,我们要控制访问频率。

import requests
import time
import randomproxies = {"http": "http://10.10.1.10:3128",  # 假设此为有效代理"https": "http://10.10.1.10:1080",
}# 随机延迟(1~3秒)
time.sleep(random.uniform(1, 3))response = requests.get(url, headers=headers, proxies=proxies)

注意:

  • 以上,是一些常用的基本的绕开反爬机制的方法,但并不是全部,具体采用哪个方法,要根据你要爬取的网站的具体情况来判断。
  • 各个方法之间,也不是独立的,可以相互配合使用,提高绕开反爬机制的可能。

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

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

相关文章

RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)

目录 前言:v4l-utils简介 一&#xff1a;查找当前的摄像头设备 二&#xff1a;查看当前摄像头支持的v4l2-ctl调试参数 三根据提示设置对应参数&#xff0c;在提示范围内设置 四&#xff1a;常用调试命令 五:应用内执行命令方法 前言:v4l-utils简介 v4l-utils工具是由Linu…

Spring Security基础入门

本入门案例主要演示Spring Security在Spring Boot中的安全管理效果。为了更好地使用Spring Boot整合实现Spring Security安全管理功能&#xff0c;体现案例中Authentication&#xff08;认证&#xff09;和Authorization&#xff08;授权&#xff09;功能的实现&#xff0c;本案…

Trae+DeepSeek学习Python开发MVC框架程序笔记(二):使用4个文件实现MVC框架

修改上节文件&#xff0c;将test2.py拆分为4个文件&#xff0c;目录结构如下&#xff1a; mvctest/ │── model.py # 数据模型 │── view.py # 视图界面 │── controller.py # 控制器 │── main.py # 程序入口其中model.py代码如下&#xff…

从认证到透传:用 Nginx 为 EasySearch 构建一体化认证网关

在构建本地或云端搜索引擎系统时&#xff0c;EasySearch 凭借其轻量、高性能、易部署等优势&#xff0c;逐渐成为众多开发者和技术爱好者的首选。但在实际部署过程中&#xff0c;如何借助 Nginx 为 EasySearch 提供高效、稳定且安全的访问入口&#xff0c;尤其是在身份认证方面…

CPU 虚拟化机制——受限直接执行 (LDE)

1. 引言&#xff1a;CPU虚拟化的核心问题 让多个进程看似同时运行在一个物理CPU上。核心思想是时分共享 (time sharing) CPU。为了实现高效且可控的时分共享&#xff0c;本章介绍了一种关键机制&#xff0c;称为受限直接执行 (Limited Direct Execution, LDE)。 1.1 LDE的基本…

linux 中断子系统链式中断编程

直接贴代码了&#xff1a; 虚拟中断控制器代码&#xff0c;chained_virt.c #include<linux/kernel.h> #include<linux/module.h> #include<linux/clk.h> #include<linux/err.h> #include<linux/init.h> #include<linux/interrupt.h> #inc…

容器修仙传 我的灵根是Pod 第10章 心魔大劫(RBAC与SecurityContext)

第四卷&#xff1a;飞升之劫化神篇 第10章 心魔大劫&#xff08;RBAC与SecurityContext&#xff09; 血月当空&#xff0c;林衍的混沌灵根正在异变。 每道经脉都爬满黑色纹路&#xff0c;神识海中回荡着蛊惑之音&#xff1a;"破开藏经阁第九层禁制…夺取《太古弑仙诀》……

基于c#,wpf,ef框架,sql server数据库,音乐播放器

详细视频: 【基于c#,wpf,ef框架,sql server数据库&#xff0c;音乐播放器。-哔哩哔哩】 https://b23.tv/ZqmOKJ5

精益数据分析(21/126):剖析创业增长引擎与精益画布指标

精益数据分析&#xff08;21/126&#xff09;&#xff1a;剖析创业增长引擎与精益画布指标 大家好&#xff01;在创业和数据分析的探索道路上&#xff0c;我一直希望能和大家携手共进&#xff0c;共同学习。今天&#xff0c;我们继续深入研读《精益数据分析》&#xff0c;剖析…

Spark-streaming核心编程

1.导入依赖‌&#xff1a; <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.编写代码‌&#xff1a; 创建Sp…

Kafka的ISR机制是什么?如何保证数据一致性?

一、Kafka ISR机制深度解析 1. ISR机制定义 ISR&#xff08;In-Sync Replicas&#xff09;是Kafka保证数据一致性的核心机制&#xff0c;由Leader副本&#xff08;复杂读写&#xff09;和Follower副本(负责备份)组成。当Follower副本的延迟超过replica.lag.time.max.ms&#…

Docker 基本概念与安装指南

Docker 基本概念与安装指南 一、Docker 核心概念 1. 容器&#xff08;Container&#xff09; 容器是 Docker 的核心运行单元&#xff0c;本质是一个轻量级的沙盒环境。它基于镜像创建&#xff0c;包含应用程序及其运行所需的依赖&#xff08;如代码、库、环境变量等&#xf…

数据库监控 | MongoDB监控全解析

PART 01 MongoDB&#xff1a;灵活、可扩展的文档数据库 MongoDB作为一款开源的NoSQL数据库&#xff0c;凭借其灵活的数据模型&#xff08;基于BSON的文档存储&#xff09;、水平扩展能力&#xff08;分片集群&#xff09;和高可用性&#xff08;副本集架构&#xff09;&#x…

OpenFeign和Gateway

OpenFeign和Gateway 一.OpenFeign介绍二.快速上手1.引入依赖2.开启openfeign的功能3.编写客户端4.修改远程调用代码5.测试 三.OpenFeign参数传递1.传递单个参数2.多个参数、传递对象和传递JSON字符串3.最佳方式写代码继承的方式抽取的方式 四.部署OpenFeign五.统一服务入口-Gat…

spark-streaming(二)

DStream创建&#xff08;kafka数据源&#xff09; 1.在idea中的 pom.xml 中添加依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming-kafka-0-10_2.12</artifactId><version>3.0.0</version> </…

JAVA聚焦OutOfMemoryError 异常

个人主页 文章专栏 在正文开始前&#xff0c;我想多说几句&#xff0c;也就是吐苦水吧…最近这段时间一直想写点东西&#xff0c;停下来反思思考一下。 心中万言&#xff0c;真正执笔时又不知先写些什么。通常这个时候&#xff0c;我都会随便写写&#xff0c;文风极像散文&…

如何在Spring Boot中配置自定义端口运行应用程序

Spring Boot 应用程序默认在端口 8080 上运行嵌入式 Web 服务器&#xff08;如 Tomcat、Jetty 或 Undertow&#xff09;。然而&#xff0c;在开发、测试或生产环境中&#xff0c;开发者可能需要将应用程序配置为在自定义端口上运行&#xff0c;例如避免端口冲突、适配微服务架构…

linux嵌入式(进程与线程1)

Linux进程 进程介绍 1. 进程的基本概念 定义&#xff1a;进程是程序的一次执行过程&#xff0c;拥有独立的地址空间、资源&#xff08;如内存、文件描述符&#xff09;和唯一的进程 ID&#xff08;PID&#xff09;。 组成&#xff1a; 代码段&#xff1a;程序的指令。 数据…

智驭未来:NVIDIA自动驾驶安全白皮书与实验室创新实践深度解析

一、引言&#xff1a;自动驾驶安全的范式革新 在当今数字化浪潮的推动下&#xff0c;全球自动驾驶技术正大步迈入商业化的深水区。随着越来越多的自动驾驶车辆走上道路&#xff0c;其安全性已成为整个行业乃至社会关注的核心命题。在这个关键的转折点上&#xff0c;NVIDIA 凭借…

多模态大模型 Qwen2.5-VL 的学习之旅

Qwen-VL 是阿里云研发的大规模视觉语言模型&#xff08;Large Vision Language Model, LVLM&#xff09;。Qwen-VL 可以以图像、文本、检测框作为输入&#xff0c;并以文本和检测框作为输出。Qwen-VL 系列模型性能强大&#xff0c;具备多语言对话、多图交错对话等能力&#xff…