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

news2025/7/19 17:27:53

文章目录

    • 写在前面
    • 爬虫习惯
      • 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 requests

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

注意:使用 fake_useragent 库生成随机浏览器头,可能会生成移动端,windows端,linux端等不同的浏览器头,有些网站会根据不同的浏览器头返回不同的页面,这个时候,爬虫可能会失效(因为同一个url返回了不同页面,导致爬取失败)

使用代理和随机延迟

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

import requests
import time
import random

proxies = {
    "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.coloradmin.cn/o/2343589.html

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

相关文章

高级电影感户外街拍人像摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 高级电影感户外街拍人像摄影后期 Lr 调色&#xff0c;是运用 Adobe Lightroom 软件&#xff0c;对户外街拍的人像照片进行后期处理&#xff0c;以塑造出具有电影质感的独特视觉效果。此调色过程借助 Lr 丰富的工具与功能&#xff0c;从色彩、光影、对比度等多维度着手…

【硬核干货】JetBrains AI Assistant 干货笔记

快进来抄作业&#xff0c;小编呕心沥血整理的 JetBrains AI Assistant 超干货笔记&#xff01; 原文链接&#xff1a;【硬核干货】JetBrains AI Assistant 干货笔记 关于晓数神州 晓数神州坚持以“客户为中心”的宗旨&#xff0c;为客户提供专业的解决方案和技术服务&#xff…

Linux部署ragflow,从安装docker开始~

安装docker https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz #首先创建一个文件夹&#xff0c;存放我们需要的各类文件,并切换到该目录 mkdir /project && cd /project #此时我们的工作目录已经切换到刚刚创建的文件夹下了&#xff0c;接…

多态以及多态底层的实现原理

本章目标 1.多态的概念 2.多态的定义实现 3.虚函数 4.多态的原理 1.多态的概念 多态作为面对三大特性之一,它所指代的和它的名字一样,多种形态.但是这个多种形态更多的指代是函数的多种形态. 多态分为静态多态和动态多态. 静态多态在前面已经学习过了,就是函数重载以及模板,…

使用Go语言实现轻量级消息队列

文章目录 一、引言1.1 消息队列的重要性1.2 为什么选择Go语言1.3 本文实现的轻量级消息队列特点 二、核心设计2.1 消息队列的基本概念2.1.1 消息类型定义2.1.2 消息结构设计 2.2 架构设计2.2.1 基于Go channel的实现方案2.2.2 单例模式的应用2.2.3 并发安全设计 2.3 消息发布与…

路由与OSPF学习

【路由是跨网段通讯的必要条件】 路由指的是在网络中&#xff0c;数据包从源主机传输到目的主机的路径选择过程。 路由通常涉及以下几个关键元素&#xff1a; 1.路由器&#xff1a;是一种网络设备&#xff0c;负责将数据包从一个网络传输到另一个网络。路由器根据路由表来决定…

CUDA编程之Grid、Block、Thread线程模型

一、线程模型:Grid、Block、Thread概念 ‌1. 层级定义‌ ‌Thread(线程)‌ CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间‌。 ‌Block(线程块)‌ 由多个线程组成(通常为32的倍数),是逻辑上的并…

小学数学出题器:自动化作业生成

小学数学出题器是专为教师、家长设计的自动化作业生成工具&#xff0c;通过预设参数快速生成符合教学要求的练习题&#xff0c;大幅降低备课与辅导压力。‌跨平台兼容‌&#xff1a;支持 Windows 系统免安装运行&#xff08;解压即用&#xff09;。‌免费无广告‌&#xff1a;永…

卷积神经网络迁移学习:原理与实践指南

引言 在深度学习领域&#xff0c;卷积神经网络(CNN)已经在计算机视觉任务中取得了巨大成功。然而&#xff0c;从头开始训练一个高性能的CNN模型需要大量标注数据和计算资源。迁移学习(Transfer Learning)技术为我们提供了一种高效解决方案&#xff0c;它能够将预训练模型的知识…

Spark与Hadoop之间的联系和对比

&#xff08;一&#xff09;Spark概述 Apache Spark 是一个快速、通用、可扩展的大数据处理分析引擎。它最初由加州大学伯克利分校 AMPLab 开发&#xff0c;后成为 Apache 软件基金会的顶级项目。Spark 以其内存计算的特性而闻名&#xff0c;能够在内存中对数据进行快速处理&am…

基于线性LDA算法对鸢尾花数据集进行分类

基于线性LDA算法对鸢尾花数据集进行分类 1、效果 2、流程 1、加载数据集 2、划分训练集、测试集 3、创建模型 4、训练模型 5、使用LDA算法 6、画图3、示例代码 # 基于线性LDA算法对鸢尾花数据集进行分类# 基于线性LDA算法对鸢尾花数据集进行分类 import numpy as np import …

【Deepseek基础篇】--v3基本架构

目录 MOE参数 1.基本架构 1.1. Multi-Head Latent Attention多头潜在注意力 1.2.无辅助损失负载均衡的 DeepSeekMoE 2.多标记预测 2.1. MTP 模块 论文地址&#xff1a;https://arxiv.org/pdf/2412.19437 DeepSeek-V3 是一款采用 Mixture-of-Experts&#xff08;MoE&…

centos7使用yum快速安装最新版本Jenkins-2.462.3

Jenkins支持多种安装方式&#xff1a;yum安装、war包安装、Docker安装等。 官方下载地址&#xff1a;https://www.jenkins.io/zh/download 本次实验使用yum方式安装Jenkins LTS长期支持版&#xff0c;版本为 2.462.3。 一、Jenkins基础环境的安装与配置 1.1&#xff1a;基本…

【vue】【element-plus】 el-date-picker使用cell-class-name进行标记,type=year不生效解决方法

typedete&#xff0c;自定义cell-class-name打标记效果如下&#xff1a; 相关代码&#xff1a; <el-date-pickerv-model"date":clearable"false":editable"false":cell-class-name"cellClassName"type"date"format&quo…

c++11新特性随笔

1.统一初始化特性 c98中不支持花括号进行初始化&#xff0c;编译时会报错&#xff0c;在11当中初始化可以通过{}括号进行统一初始化。 c98编译报错 c11: #include <iostream> #include <set> #include <string> #include <vector>int main() {std:…

C++23 中 constexpr 的重要改动

文章目录 1. constexpr 函数中使用非字面量变量、标号和 goto (P2242R3)示例代码 2. 允许 constexpr 函数中的常量表达式中使用 static 和 thread_local 变量 (P2647R1)示例代码 3. constexpr 函数的返回类型和形参类型不必为字面类型 (P2448R2)示例代码 4. 不存在满足核心常量…

全面解析React内存泄漏:原因、解决方案与最佳实践

在开发React应用时&#xff0c;内存泄漏是一个常见但容易被忽视的问题。如果处理不当&#xff0c;它会导致应用性能下降、卡顿甚至崩溃。由于React的组件化特性&#xff0c;许多开发者可能没有意识到某些操作&#xff08;如事件监听、异步请求、定时器等&#xff09;在组件卸载…

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…

超级扩音器手机版:随时随地,大声说话

在日常生活中&#xff0c;我们常常会遇到手机音量太小的问题&#xff0c;尤其是在嘈杂的环境中&#xff0c;如KTV、派对或户外活动时&#xff0c;手机自带的音量往往难以满足需求。今天&#xff0c;我们要介绍的 超级扩音器手机版&#xff0c;就是这样一款由上海聚告德业文化发…

【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…