Python 爬虫如何伪装 Referer?从随机生成到动态匹配

news2025/4/24 6:38:51

一、Referer 的作用与重要性

Referer 是 HTTP 请求头中的一个字段,用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色,例如用于统计流量来源、防止恶意链接等。然而,对于爬虫来说,Referer 也可能成为被识别为爬虫的关键因素之一。许多网站会检查 Referer 字段,如果发现请求头中缺少 Referer 或者 Referer 的值不符合预期,网站可能会拒绝服务或者返回错误信息。

因此,伪装 Referer 成为了爬虫开发者的重要任务。通过合理地设置 Referer,可以降低爬虫被检测到的风险,提高数据采集的成功率。

二、随机生成 Referer

随机生成 Referer 是一种简单但有效的伪装方法。通过生成一些常见的、看似合法的 Referer 值,可以欺骗网站的反爬虫机制。以下是一个使用 Python 实现随机生成 Referer 的示例代码:

import random

# 定义一些常见的 Referer 值
referer_list = [
    "https://www.google.com",
    "https://www.bing.com",
    "https://www.baidu.com",
    "https://www.sogou.com",
    "https://www.yahoo.com",
    "https://www.duckduckgo.com",
    "https://www.yandex.com",
    "https://www.bing.com/search?q=python+爬虫",
    "https://www.google.com/search?q=python+爬虫",
    "https://www.sogou.com/web?query=python+爬虫",
    "https://www.baidu.com/s?wd=python+爬虫",
    "https://www.yandex.com/search/?text=python+爬虫",
    "https://www.duckduckgo.com/?q=python+爬虫"
]

# 随机选择一个 Referer
def random_referer():
    return random.choice(referer_list)

# 使用 requests 库发送请求
import requests

def fetch_with_random_referer(url):
    headers = {
        "Referer": random_referer(),
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers)
    return response

# 测试
url = "https://example.com"
response = fetch_with_random_referer(url)
print(response.status_code)
print(response.headers)

代码解析

  1. 定义 Referer 列表:我们定义了一个包含常见搜索引擎和搜索结果页面的 Referer 列表。这些 Referer 值看起来像是用户通过搜索引擎访问目标页面的来源。
  2. 随机选择 Referer:通过 <font style="color:rgba(0, 0, 0, 0.9);">random.choice()</font> 方法从列表中随机选择一个 Referer 值。
  3. 发送请求:使用 <font style="color:rgba(0, 0, 0, 0.9);">requests</font> 库发送 HTTP 请求时,将随机选择的 Referer 添加到请求头中。同时,我们还添加了一个常见的 <font style="color:rgba(0, 0, 0, 0.9);">User-Agent</font>,以进一步伪装请求。

优点

  • 简单易实现:随机生成 Referer 的方法非常简单,只需要定义一个 Referer 列表并随机选择即可。
  • 成本低:不需要复杂的逻辑和额外的资源,适合初学者快速上手。

缺点

  • 容易被识别:虽然随机生成的 Referer 可以欺骗一些简单的反爬虫机制,但对于复杂的网站,这种方法可能很容易被识别。因为随机生成的 Referer 可能与实际的用户行为模式不一致。

三、动态匹配 Referer

为了进一步提高伪装效果,我们可以采用动态匹配 Referer 的方法。动态匹配是指根据目标网站的页面结构和链接关系,动态生成合理的 Referer 值。这种方法需要对目标网站的结构进行分析,并根据实际的用户行为路径生成 Referer。

以下是一个动态匹配 Referer 的实现示例:

import requests
from bs4 import BeautifulSoup

# 获取目标页面的链接
def get_links(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    links = []
    for link in soup.find_all("a", href=True):
        links.append(link["href"])
    return links

# 动态生成 Referer
def dynamic_referer(url, links):
    # 选择一个与目标页面相关的链接作为 Referer
    referer = random.choice(links)
    if not referer.startswith("http"):
        referer = url + referer
    return referer

# 使用动态 Referer 发送请求
def fetch_with_dynamic_referer(url):
    links = get_links(url)
    referer = dynamic_referer(url, links)
    headers = {
        "Referer": referer,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers)
    return response

# 测试
url = "https://example.com"
response = fetch_with_dynamic_referer(url)
print(response.status_code)
print(response.headers)

代码解析

  1. 获取目标页面的链接:使用 <font style="color:rgba(0, 0, 0, 0.9);">requests</font><font style="color:rgba(0, 0, 0, 0.9);">BeautifulSoup</font> 库获取目标页面的 HTML 内容,并解析出页面中的所有链接。
  2. 动态生成 Referer:从获取到的链接列表中随机选择一个链接作为 Referer 值。如果链接是相对路径,则将其转换为绝对路径。
  3. 发送请求:将动态生成的 Referer 添加到请求头中,并发送请求。

优点

  • 伪装效果更好:动态生成的 Referer 更符合实际的用户行为模式,因为它是根据目标页面的实际链接关系生成的。
  • 适应性强:这种方法可以根据不同的目标网站动态调整 Referer,具有较强的适应性。

缺点

  • 实现复杂:需要对目标网站的结构进行分析,并且需要解析 HTML 内容,实现成本较高。
  • 性能问题:动态生成 Referer 的过程需要额外的网络请求和解析操作,可能会对爬虫的性能产生一定影响。

四、结合代理和 IP 池

除了伪装 Referer,结合代理和 IP 池可以进一步提高爬虫的伪装效果和稳定性。代理服务器可以隐藏爬虫的真实 IP 地址,而 IP 池可以提供多个代理 IP,避免因频繁访问而被封禁。

以下是一个结合代理和 IP 池的实现示例:

import random
import requests
from requests.auth import HTTPProxyAuth

# 定义代理服务器信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"

# 构造代理地址
proxy_url = f"http://{proxyHost}:{proxyPort}"

# 定义代理认证信息
proxy_auth = HTTPProxyAuth(proxyUser, proxyPass)

# 动态生成 Referer(假设 get_links 和 dynamic_referer 函数已定义)
def get_links(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    response = requests.get(url, headers=headers, proxies={"http": proxy_url, "https": proxy_url}, auth=proxy_auth)
    soup = BeautifulSoup(response.text, "html.parser")
    links = []
    for link in soup.find_all("a", href=True):
        links.append(link["href"])
    return links

def dynamic_referer(url, links):
    referer = random.choice(links)
    if not referer.startswith("http"):
        referer = url + referer
    return referer

# 使用动态 Referer 和代理发送请求
def fetch_with_proxy_and_referer(url):
    links = get_links(url)
    referer = dynamic_referer(url, links)
    headers = {
        "Referer": referer,
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
    }
    proxies = {
        "http": proxy_url,
        "https": proxy_url
    }
    response = requests.get(url, headers=headers, proxies=proxies, auth=proxy_auth)
    return response

# 测试
url = "https://example.com"
response = fetch_with_proxy_and_referer(url)
print(response.status_code)
print(response.headers)

代码解析

  1. 定义代理 IP 池:定义一个包含多个代理 IP 的列表。
  2. 随机选择代理:通过 <font style="color:rgba(0, 0, 0, 0.9);">random.choice()</font> 方法从代理 IP 池中随机选择一个代理。
  3. 发送请求:将动态生成的 Referer 和随机选择的代理添加到请求中,并发送请求。

优点

  • 伪装效果更强:结合代理和 IP 池可以同时隐藏爬虫的真实 IP 地址和伪装 Referer,大大提高了伪装效果。
  • 稳定性更高:使用 IP 池可以避免因频繁访问而被封禁,提高了爬虫的稳定性。

总结

伪装 Referer 是 Python 爬虫中应对反爬虫机制的重要手段之一。通过随机生成 Referer 和动态匹配 Referer,可以有效降低爬虫被检测到的风险。结合代理和 IP 池,可以进一步提高爬虫的伪装效果和稳定性。在实际应用中,开发者需要根据目标网站的反爬虫机制和自身的需求,选择合适的伪装方法。

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

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

相关文章

【MySQL】表的约束(主键、唯一键、外键等约束类型详解)、表的设计

目录 1.数据库约束 1.1 约束类型 1.2 null约束 — not null 1.3 unique — 唯一约束 1.4 default — 设置默认值 1.5 primary key — 主键约束 自增主键 自增主键的局限性&#xff1a;经典面试问题&#xff08;进阶问题&#xff09; 1.6 foreign key — 外键约束 1.7…

基于STC89C52RC和8X8点阵屏、独立按键的小游戏《打砖块》

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板&#xff0c;外设有&#xff1a;8X8LED点阵屏、独立按键。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效…

数字电子技术基础(五十)——硬件描述语言简介

目录 1 硬件描述语言简介 1.1 硬件描述语言简介 1.2 硬件编程语言的发展历史 1.3 两种硬件描述的比较 1.4 硬件描述语言的应用场景 1.5 基本程序结构 1.5.1 基本程序结构 1.5.2 基本语句和描述方法 1.5.3 仿真 1 硬件描述语言简介 1.1 硬件描述语言简介 硬件描述语…

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读

【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读 文章目录 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3核心文件common.py解读前言autopad函数Conv类__init__成员函数forward成员函数forward_fuse成员函数 Bottleneck类__init__成员…

16.Chromium指纹浏览器开发教程之WebGPU指纹定制

WebGPU指纹概述 WebGPU是下一代的Web图形和计算API&#xff0c;旨在提供高性能的图形渲染和计算能力。它是WebGL的后继者&#xff0c;旨在利用现代GPU的强大功能&#xff0c;使得Web应用能够实现接近原生应用的图形和计算性能。而且它是一个低级别的API&#xff0c;可以直接与…

SQL预编译——预编译真的能完美防御SQL注入吗

SQL注入原理 sql注入是指攻击者拼接恶意SQL语句到接受外部参数的动态SQL查询中&#xff0c;程序本身 未对插入的SQL语句进行过滤&#xff0c;导致SQL语句直接被服务端执行。 拼接的SQL查询例如&#xff0c;通过在id变量后插入or 11这样的条件&#xff0c;来绕过身份验证&#…

运行neo4j.bat console 报错无法识别为脚本,PowerShell 教程:查看语言模式并通过注册表修改受限模式

无法将“D:\neo4j-community-4.4.38-windows\bin\Neo4j-Management\Get-Args.ps1”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 前提配置好环境变量之后依然报上面的错…

【EDA软件】【设计约束和分析操作方法】

1. 设计约束 设计约束主要分为物理约束和时序约束。 物理约束主要包括I/O接口约束&#xff08;如引脚分配、电平标准设定等物理属性的约束&#xff09;、布局约束、布线约束以及配置约束。 时序约束是FPGA内部的各种逻辑或走线的延时&#xff0c;反应系统的频率和速度的约束…

【Lua】Lua 入门知识点总结

Lua 入门学习笔记 本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用&#xff0c;包括全局变量和局部变量的区别&#xff0c;以及nil类型的概念、数值型、字符串和函数的基本操作&#xff0c;包括16进制表示、科学计数法、字符串连接、函数声明…

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势&#xff0c;能够通过多波段光谱分析皮肤深层成分及生理状态&#xff0c;实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节&#xff1a; ‌一、工作原理‌ ‌光谱反射与吸收特性‌&#xff1a; ‌血红蛋白‌&a…

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…

CS144 Lab1实战记录:实现TCP重组器

文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串&#xff08;直接写入&#xff09;3.2 乱序到达的子串&#xff08;需要存储&#xff09;3.3 与已处理区…

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标&#xff0c;相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…

BeautifulSoup 库的使用——python爬虫

文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…

HTTP的Header

一、HTTP Header 是什么&#xff1f; HTTP Header 是 HTTP 协议中的头部信息部分&#xff0c;位于请求或响应的起始行之后&#xff0c;用来在客户端&#xff08;浏览器等&#xff09;与服务器之间传递元信息&#xff08;meta-data&#xff09;&#xff08;简单理解为传递信息的…

linux虚拟机网络问题处理

yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&arch…

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述&#xff1a; AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案&#xff1a; 一、准备数据集我这…

协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]

&#x1f6cd;️ 智能商品推荐系统 - 基于springboot vue &#x1f680; 项目亮点 欢迎来到未来的购物体验&#xff01;我们的智能商品推荐系统就像您的私人购物顾问&#xff0c;它能读懂您的心思&#xff0c;了解您的喜好&#xff0c;为您精心挑选最适合的商品。想象一下&am…

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器&#xff0c;广泛应用于软件开发和测试流程中&#xff0c;主要用于实现持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。它在开发和测试中的位置和作用可以从以下几个方面来理解&#xff1a; 1. 在开发和测…

【集合】底层原理实现及各集合之间的区别

文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…