網頁不同渲染方式的應對與反爬機制的處理——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.pswp.cn/web/76985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76985.shtml
英文地址,請注明出處:http://en.pswp.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…