Python 爬蟲如何偽裝 Referer?從隨機生成到動態匹配

一、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 requestsdef 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):# 選擇一個與目標頁面相關的鏈接作為 Refererreferer = random.choice(links)if not referer.startswith("http"):referer = url + refererreturn 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 linksdef dynamic_referer(url, links):referer = random.choice(links)if not referer.startswith("http"):referer = url + refererreturn 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.pswp.cn/bicheng/78370.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78370.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78370.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Post-Processing PropertySource instance詳解 和 BeanFactoryPostProcessor詳解

PropertySourcesBeanFactoryPostProcessor詳解 1. 核心概念 BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化階段 對 Environment 中的 PropertySource 進行后處理的接口。它允許開發者在 Bean 創建之前 對屬性源進行動態修改&#xff0c;例如添加、刪除…

[C]基礎13.深入理解指針(5)

博客主頁&#xff1a;向不悔本篇專欄&#xff1a;[C]您的支持&#xff0c;是我的創作動力。 文章目錄 0、總結1、sizeof和strlen的對比1.1 sizeof1.2 strlen1.3 sizeof和strlen的對比 2、數組和指針筆試題解析2.1 一維數組2.2 字符數組2.2.1 代碼12.2.2 代碼22.2.3 代碼32.2.4 …

賽靈思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA

XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA&#xff0c;基于 20 nm 先進工藝&#xff0c;提供高達 1 451 100 個邏輯單元&#xff08;Logic Cells&#xff09;&#xff0c;77 721 600 bit 的片上 RAM 資源&#xff0c;以及 5 520 個 DSP 切片&#xff08;DSP48E…

CAPL編程_03

1_文件操作的相關函數&#xff1a; 讀文本文件內容 讀取文本文件操作的三部曲 1&#xff09;打開文件 —— openFileRead ( ) 2&#xff09;逐行讀取 —— fileGetString ( ) 、fileGetStringSZ ( ) 3&#xff09;關閉文件 —— fileClose ( ) char content[100];…

2025年江西建筑安全員A證適合報考人群

江西建筑安全員A證適合報考人群 江西省建筑安全員A證&#xff08;建筑施工企業主要負責人安全生產考核合格證書&#xff09;主要面向建筑行業管理人員&#xff0c;適合以下人員報考&#xff1a; 1. 企業主要負責人 法人代表、總經理、分管安全副總&#xff1a;依法需持A證&a…

Docker安裝(Ubuntu22版)

前言 你是否還在為Linux上配置Docker而感到煩惱&#xff1f; 你是否還在為docker search&#xff0c;docker pull連接不上&#xff0c;而感到沮喪&#xff1f; 本文將解決以上你的所有煩惱&#xff01;快速安裝好docker&#xff01; Docker安裝 首先&#xff0c;我們得先卸載…

Ubuntu18.04配置C++環境和Qt環境

Ubuntu18.04配置C環境和Qt環境 1、前言3.2 安裝其他庫3.3 查看有沒有安裝成功3.4測試C環境 4、配置Qt環境4.1 安裝相關的庫4.2 測試 5、總結 1、前言 記錄一下Ubuntu18.04配置C環境和Qt環境的過程&#xff0c;方便自己日后回顧&#xff0c;也可以給有需要的人提供幫助。 # 2…

ACWing——算法基礎課

置頂思考&#xff1a; 算法的本質是什么樣的思想&#xff1f; 這種思想可以解決哪類問題&#xff1f; 有沒有其他的解決思路&#xff1f; 關注數值范圍&#xff0c;思考可不可以針對性解決問題&#xff1f; 目錄 https://leetcode.cn/circle/discuss/RvFUtj/ 滑動窗口與雙指針…

私鑰連接服務器(已經有服務器私鑰

前言&#xff1a;假設我們已經有了服務器的私鑰&#xff0c;我們怎么配置呢&#xff1f; 下面我會從vsc的配置角度來寫 ? 步驟一&#xff1a;準備工作 安裝 VS Code&#xff08;如果還沒裝&#xff09; &#x1f449; https://code.visualstudio.com/ 安裝插件&#xff1a;Re…

Redis LFU 策略參數配置指南

一、基礎配置步驟? 設置內存上限? 在 redis.conf 配置文件中添加以下指令&#xff0c;限制 Redis 最大內存使用量&#xff08;例如設置為 4GB&#xff09;&#xff1a; maxmemory 4gb選擇 LFU 淘汰策略? 根據鍵的作用域選擇策略&#xff1a; # 所有鍵參與淘汰 maxmemory-…

嵌入式 C 語言面試核心知識點全面解析:基礎語法、運算符與實戰技巧

在嵌入式面試中&#xff0c;C 語言基礎是重中之重。本文針對經典面試題進行詳細解析&#xff0c;幫助新手系統掌握知識點&#xff0c;提升面試應對能力。 一、數據結構邏輯分類 題目 在數據結構中&#xff0c;從邏輯上可以把數據結構分為&#xff08; &#xff09;。 A、動態…

11.AOP開發

十一、AOP開發 1、Spring Boot實現 AOP 11.1.1、SpringBootAop簡介 Spring Boot的AOP編程和Spring框架中AOP編程的唯一區別是&#xff1a;引入依賴的方式不同,其他內容完全一樣 Spring Boot中AOP編程需要引入aop啟動器&#xff1a; <!--aop啟動器--> <dependency…

【網絡入侵檢測】基于源碼分析Suricata的PCAP模式

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全,歡迎關注與評論。 1. 概要 ?? 本文聚焦于 Suricata 7.0.10 版本源碼,深入剖析其 PCAP 模式的實現原理。通過系統性拆解初始化階段的配置流程、PCAP 數據包接收線程的創建與運行機制,以及數據…

.NET 10 中的新增功能

.NET 運行時 .NET 10 運行時引入了新功能和性能改進。 關鍵更新包括&#xff1a; 數組接口方法反虛擬化&#xff1a;JIT 現在可以取消虛擬化和內聯數組接口方法&#xff0c;從而提高數組枚舉的性能。數組枚舉去抽象化&#xff1a;改進功能以通過枚舉器減少數組迭代的抽象開銷…

盲注命令執行(Blind Command Execution)

一、核心原理 1. 無回顯命令執行的本質 盲命令執行&#xff08;Blind Command Execution&#xff09;是一種攻擊形式&#xff0c;攻擊者通過注入系統命令到Web應用或后端系統中&#xff0c;但無法直接獲取命令執行結果。盲命令執行的本質在于攻擊者無法直接看到執行結果&#x…

Linux多線程技術

什么是線程 在一個程序里的多執行路線就是線程。線程是進程中的最小執行單元&#xff0c;可理解為 “進程內的一條執行流水線”。 進程和線程的區別 進程是資源分配的基本單位&#xff0c;線程是CPU調度的基本單位。 fork創建出一個新的進程&#xff0c;會創建出一個新的拷貝&…

計算機組成原理實驗(1) 算術邏輯運算單元實驗

實驗一 算術邏輯運算單元實驗 一、實驗目的 1、掌握簡單運算器的數據傳輸方式 2、掌握74LS181的功能和應用 二、實驗內容 1、不帶進位位邏輯或運算實驗 2、不帶進位位加法運算實驗 3、實驗指導書2.15實驗思考 三、實驗步驟和結果 實驗內容一&#xff1a;不帶進位…

Android將啟動畫面實現遷移到 Android 12 及更高版本

如果在 Android 11 或更低版本中實現自定義啟動畫面&#xff0c;請遷移應用遷移到 SplashScreen API 以獲取幫助 確保其在 Android 12 及更高版本中正確顯示。 從 Android 12 開始&#xff0c;在所有應用的冷啟動和溫啟動期間&#xff0c;系統都會應用 Android 系統的默認啟動…

692. 前K個高頻單詞(map的練習)

目錄 1、題目分析 2.解題思路 3.代碼實現 4.總結 1、題目分析 2.解題思路 首先它給出我們一個string&#xff0c;讓我們提取出它們中出現次數最多的。利用map將word一個一個存入其中&#xff0c;沒有就插入&#xff0c;有了就1&#xff0c;這樣我們就得到了key_value&#…

如何創建極狐GitLab 議題?

極狐GitLab 是 GitLab 在中國的發行版&#xff0c;關于中文參考文檔和資料有&#xff1a; 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 創建議題 (BASIC ALL) 創建議題時&#xff0c;系統會提示您輸入議題的字段。 如果您知道要分配給議題的值&#xff0c;則可…