第七課:Python反爬攻防戰:Headers/IP代理與驗證碼

在爬蟲開發過程中,反爬蟲機制成為了我們必須面對的挑戰。本文將深入探討Python爬蟲中常見的反爬機制,并詳細解析如何通過隨機User-Agent生成、代理IP池搭建以及驗證碼識別來應對這些反爬策略。文章將包含完整的示例代碼,幫助讀者更好地理解和應用這些技術。

一、常見反爬機制解析

1.1 基于Headers的反爬

許多網站通過檢查請求頭(Headers)中的User-Agent字段來判斷請求是否來自爬蟲。如果User-Agent字段不符合預期,網站可能會拒絕服務或返回錯誤頁面。

1.2 基于IP的反爬

為了限制爬蟲對網站的訪問頻率,網站通常會記錄訪問者的IP地址。當某個IP地址在短時間內發送大量請求時,網站可能會暫時或永久封禁該IP地址。

1.3 基于驗證碼的反爬

驗證碼是網站用來區分人類用戶和自動化腳本的一種有效手段。當檢測到異常訪問模式時,網站可能會要求訪問者輸入驗證碼以驗證其身份。

二、隨機User-Agent生成

為了繞過基于Headers的反爬機制,我們可以使用隨機User-Agent來模擬不同瀏覽器的訪問請求。Python中的fake_useragent庫可以幫助我們輕松實現這一點。

安裝命令

pip install fake-useragent

示例代碼

import requests
from fake_useragent import UserAgent# 生成一個隨機的User-Agent
ua = UserAgent()
random_user_agent = ua.random# 設置請求頭
headers = {'User-Agent': random_user_agent
}# 發送請求
response = requests.get('https://www.example.com', headers=headers)
print(response.text)

三、代理IP池搭建實戰

為了繞過基于IP的反爬機制,我們可以使用代理IP來隱藏真實的IP地址。搭建一個代理IP池,并隨機選擇代理IP進行請求,可以大大降低被封禁的風險。

示例代碼

3.1 爬取代理IP

首先,我們需要從一些提供免費代理IP的網站爬取代理IP信息。

import requests
from bs4 import BeautifulSoupdef get_proxy_ips():# 替換為實際代理IP網站url = "https://www.example-proxy-website.com"headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}proxy_ips = []try:response = requests.get(url, headers=headers)if response.status_code == 200:soup = BeautifulSoup(response.text, 'html.parser')# 假設代理IP信息在一個表格中,通過查找表格行(tr)來獲取數據rows = soup.find_all('tr')# 跳過表頭行for row in rows[1:]:cols = row.find_all('td')ip = cols[0].textport = cols[1].textproxy = f"{ip}:{port}"proxy_ips.append(proxy)return proxy_ipsexcept requests.RequestException as e:print(f"請求錯誤: {e}")return []proxy_ips = get_proxy_ips()
print(proxy_ips)
3.2 驗證代理IP

爬取到的代理IP不一定都能正常使用,因此我們需要進行可用性驗證。

def check_proxy(proxy):test_url = "https://www.baidu.com"# 可以代理的字典數據proxies = {"http": f"http://{proxy}","https": f"https://{proxy}"}try:# 測試代理地址response = requests.get(test_url, proxies=proxies, timeout=5)if response.status_code == 200:return Truereturn Falseexcept requests.RequestException:return Falsevalid_proxy_ips = []
for proxy in proxy_ips:if check_proxy(proxy):valid_proxy_ips.append(proxy)# 輸出可以進行代理的正確地址
print(valid_proxy_ips)
3.3 使用代理IP進行請求

最后,我們可以使用驗證通過的代理IP來發送請求。

import random# 隨機選擇一個可用的代理IP
proxy = random.choice(valid_proxy_ips)
proxies = {"http": f"http://{proxy}","https": f"https://{proxy}"
}# 設置請求頭
headers = {'User-Agent': random_user_agent
}# 發送請求
response = requests.get('https://www.example.com', headers=headers, proxies=proxies)
print(response.text)

四、驗證碼識別基礎方案

驗證碼識別是繞過基于驗證碼反爬機制的關鍵。雖然驗證碼識別技術相對復雜,但我們可以使用一些開源的OCR(文字識別)庫來實現基本的驗證碼識別。

示例代碼

4.1 安裝必要的庫

從Tesseract-OCR官網下載并安裝Tesseract-OCR

首先,我們需要安裝Pillow和pytesseract庫。Pillow用于圖像處理,pytesseract是Tesseract-OCR的Python接口。

pip install pillow pytesseract

注意:你還需要從Tesseract-OCR官網下載并安裝Tesseract-OCR,并設置環境變量TESSDATA_PREFIX指向包含tessdata的目錄。

4.2 驗證碼識別

假設我們已經下載了一張驗證碼圖片captcha.jpg,我們可以使用以下代碼進行識別。

from PIL import Image
import pytesseract# 打開驗證碼圖片
image = Image.open('captcha.jpg')# 進行OCR識別
text = pytesseract.image_to_string(image, lang='eng')print('識別結果:', text)

識別完成以后,根據前邊學習的內容,把圖片中的內容填寫到輸入框即可

總結

本文通過詳細解析常見的反爬機制,并提供了隨機User-Agent生成、代理IP池搭建以及驗證碼識別的基礎方案,幫助讀者更好地理解和應對Python爬蟲中的反爬挑戰。希望這些技術和示例代碼能對大家的爬蟲開發有所幫助。

關注我!!🫵 持續為你帶來Python相關內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71790.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71790.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71790.shtml

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

相關文章

Vue3——Fragment

文章目錄 一、Fragment的核心意義1. 解決Vue2的單根限制問題2. 減少不必要的 DOM 嵌套3. 語義化和結構化 二、Fragment 的實現原理三、Fragment 使用方式1. 基本用法2. 結合條件渲染3. 動態組件 四、實際應用場景1. 列表/表格組件2. 布局組件3. 語義化標簽 五、注意事項1. 屬性…

字節跳動C++客戶端開發實習生內推-抖音基礎技術

智能手機愛好者和使用者,追求良好的用戶體驗; 具有良好的編程習慣,代碼結構清晰,命名規范; 熟練掌握數據結構與算法、計算機網絡、操作系統、編譯原理等課程; 熟練掌握C/C/OC/Swift一種或多種語言&#xff…

【Linux學習筆記】Linux基本指令分析和權限的概念

【Linux學習筆記】Linux基本指令分析和權限的概念 🔥個人主頁:大白的編程日記 🔥專欄:Linux學習筆記 文章目錄 【Linux學習筆記】Linux基本指令分析和權限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…

數據庫索引的作用:提升數據檢索效率的關鍵

在數據庫管理系統中,數據如同浩瀚海洋中的寶藏,如何快速準確地找到所需信息,成為了一個關鍵問題。這時候,數據庫索引就如同一張精確的航海圖,指引著我們高效地定位數據。那么,數據庫索引究竟是什么&#xf…

Lab18_ SQL injection with filter bypass via XML encoding

文章目錄 前言:進入實驗室構造 payload 前言: 實驗室標題為: 通關 XML 編碼繞過過濾器的 SQL 注入 簡介: 此實驗室的庫存檢查功能中存在 SQL 注入漏洞。查詢結果在應用程序的響應中返回,因此您可以使用 UNION 攻擊…

計算機性能指標(計網筆記)

計算機性能指標:速率、帶寬、吞吐率、時延、時延帶寬積、往返時間RTT、利用率 速率 數據的傳輸速率,單位bit/s,或kbit/s,Mbit/s,Gbit/s 4*10**10bit/s40Gbit/s 常用帶寬單位: 千比每秒kb/s 兆比每秒Mb/s…

同為科技智能PDU在數據中心場景的應用與解決方案

數據中心當前處于一個快速發展和技術變革的特殊時期,全新的人工智能應用正在重塑整個世界,為社會帶來便捷的同時,也為數據中心的發展帶來了新的機遇和挑戰。智能算例的爆發式增長,對數據中心提出了大算力、高性能的新需求&#xf…

藍橋杯 C++ b組 積木畫深度解析

題目大意:有兩種積木塊,I型和L型,給定一段2*N的畫布,問擺滿總共有多少種方式? 解法:狀態壓縮dp(強烈建議拿個筆跟著畫一下狀態,慢慢就懂了) 首先我們規定一下此題解中提…

小程序事件系統 —— 32 事件系統 - 事件分類以及阻止事件冒泡

在微信小程序中,事件分為 冒泡事件 和 非冒泡事件 : 冒泡事件:當一個組件的事件被觸發后,該事件會向父節點傳遞;(如果父節點中也綁定了一個事件,父節點事件也會被觸發,也就是說子組…

【從0到1搞懂大模型】神經網絡的實現:數據策略、模型調優與評估體系(3)

一、數據集的劃分 (1)按一定比例劃分為訓練集和測試集 我們通常取8-2、7-3、6-4、5-5比例切分,直接將數據隨機劃分為訓練集和測試集,然后使用訓練集來生成模型,再用測試集來測試模型的正確率和誤差,以驗證…

Django與數據庫

我叫補三補四,很高興見到大家,歡迎一起學習交流和進步 今天來講一講alpha策略制定后的測試問題 mysql配置 Django模型體現了面向對象的編程技術,是一種面向對象的編程語言和不兼容類型能相互轉化的編程技術,這種技術也叫ORM&#…

從 GitHub 批量下載項目各版本的方法

一、腳本功能概述 這個 Python 腳本的主要功能是從 GitHub 上下載指定項目的各個發布版本的壓縮包(.zip 和 .tar.gz 格式)。用戶需要提供兩個參數:一個是包含項目信息的 CSV 文件,另一個是用于保存下載版本信息的 CSV 文件。腳本…

ECC升級到S/4 HANA的功能差異 物料、采購、庫存管理對比指南

ECC升級到S/4 HANA后,S4 將數據庫更換為HANA后性能有一定提升,對于自開發程序,可以同時將計算和部分業務邏輯下推到HANA數據庫層,減少應用層和數據庫層的交互次數和數據傳輸,只返回需要的結果到應用層和顯示層。提升自…

表格columns拼接兩個后端返回的字段(以umi框架為例)

在用組件對前端項目進行開發時,我們會遇到以下情況:項目原型中有取值范圍這個表字段,需要存放最小取值到最大取值。 而后端返回給我們的數據是返回了一個最小值和一個最大值, 在columns中我們需要對這兩個字段進行拼接&#xff0…

使用Galaxy創建生物信息學工作流的步驟詳解

李升偉 整理 Galaxy 是一個基于 Web 的生物信息學平臺,提供了直觀的用戶界面和豐富的工具,幫助用戶創建和管理生物信息學工作流。以下是使用 Galaxy 創建生物信息學工作流的主要步驟: 1. 訪問 Galaxy 平臺 打開 Galaxy 的官方網站&#xff…

藍橋杯—走迷宮(BFS算法)

題目描述 給定一個NM 的網格迷宮 G。G 的每個格子要么是道路,要么是障礙物(道路用 11表示,障礙物用 0 表示)。 已知迷宮的入口位置為 (x1?,y1?),出口位置為 (x2?,y2?)。問從入口走到出口,最少要走多少…

【GPT入門】第12課 FunctionCall 生成數據庫sql代碼

【GPT入門】第12課 FunctionCall 生成數據庫sql代碼 1.概述2. 代碼3.執行結果 1.概述 如下代碼的任務:自然語言問ai,自動生成sql并回答用戶 實現思路: 步驟1. ai會把用戶的問題,轉為sql 步驟2. 程序執行sql 步驟3.把執行的sql結果&#xff…

《白帽子講 Web 安全》之身份認證

目錄 引言 一、概述 二、密碼安全性 三、認證方式 (一)HTTP 認證 (二)表單登錄 (三)客戶端證書 (四)一次性密碼(OTP) (五)多因…

服務器python項目部署

角色:root, 其他用戶應該也可以 1. 安裝python3環境 #如果是新機器,盡量執行,避免未知報錯 yum -y update python -v yum install python3 python3 -v2. 使用virtualenvwrapper 創建虛擬環境,并使用workon切換不同的虛擬環境 # 安裝virtua…

更新vscode ,將c++11更新到c++20

要在CentOS系統中安裝最新版本的GCC,你可以使用SCL(Software Collections)倉庫,它提供了開發工具的最新版本。以下是安裝步驟: 1、 添加SCL倉庫: 首先,添加CentOS的SCL倉庫,該倉庫…