解決requests庫進行爬蟲ip請求時遇到的錯誤的方法

目錄

一、超時錯誤

二、連接錯誤

三、拒絕服務錯誤

四、內容編碼錯誤

五、HTTP錯誤


在利用requests庫進行網絡爬蟲的IP請求時,我們可能會遇到各種錯誤,如超時、連接錯誤、拒絕服務等等。這些錯誤通常是由目標網站的限制、網絡問題或我們的爬蟲代碼中的問題引起的。下面是一些常見的錯誤及其解決方法。

一、超時錯誤

超時錯誤通常是因為網絡延遲或服務器響應時間過長導致的。要解決這個問題,我們可以嘗試增加請求的超時時間。在requests庫中,可以通過在請求中設置timeout參數來實現。例如:

import requests ?try: ?response = requests.get('http://example.com', timeout=3.0) ?
except requests.exceptions.RequestException as e: ?print(e)

在這個例子中,我們設置了timeout參數為3.0秒,如果服務器在3秒內沒有響應,就會引發RequestException異常。

二、連接錯誤

連接錯誤通常是因為網絡連接問題或目標服務器不可達導致的。要解決這個問題,我們可以嘗試更換請求的代理、重試請求或檢查網絡連接。例如:

import requests ?
import random ?proxies = { ?'http': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)), ?'https': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)) ?
} ?def get_content(url): ?for i in range(3): ?# 重試3次 ?try: ?response = requests.get(url, proxies=proxies) ?if response.status_code == 200: ?# 請求成功,返回結果 ?return response.text ?except requests.exceptions.RequestException as e: ?# 若請求失敗,拋出異常并繼續嘗試 ?print(e) ?return None ?# 若所有嘗試都失敗,返回None

在這個例子中,我們使用了代理并設置了最大重試次數為3次。每次請求失敗都會拋出異常并打印錯誤信息,然后繼續嘗試直到成功或所有嘗試都失敗。如果所有嘗試都失敗,函數將返回None。

三、拒絕服務錯誤

拒絕服務錯誤通常是因為目標網站識別出我們的爬蟲行為并限制了我們的訪問。要解決這個問題,我們可以嘗試更換User-Agent、使用代理或限制請求的頻率。例如:

import requests ?
import random ?
import time ?proxies = { ?'http': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)), ?'https': 'http://%s:%s@%s:%d/' % (random.choice('abcdefghijklmnopqrstuvwxyz'), random.randint(1000, 9999), 'localhost', random.randint(8000, 9999)) ?
} ?
user_agents = [ ?# 更換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', ?'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3', ?# 其他User-Agent... ?
] ?
delay = 2 ?# 設置請求間隔為2秒 ?def get_content(url): ?for i in range(3): ?# 重試3次 ?try: ?user_agent = random.choice(user_agents) ?# 隨機選擇一個User-Agent ?headers = {'User-Agent': user_agent} ?# 設置請求頭,添加User-Agent參數 ?response = requests.get(url, proxies=proxies, headers=headers) ?# 在請求中添加headers參數 ?if response.status_code == 200: ?# 請求成功,返回結果 ?return response.text ?except requests.exceptions.RequestException as e: ?# 若請求失敗,拋出異常并繼續嘗試 ?print(e) ?return None ?# 若所有嘗試都失敗,返回None

在這個例子中,我們增加了headers參數到請求中,并設置了User-Agent參數。每次請求都會隨機選擇一個User-Agent,以避免目標網站通過User-Agent識別出我們的爬蟲行為并進行限制。同時,我們設置了請求間隔為2秒,以避免過快的請求頻率導致目標網站拒絕服務。

四、內容編碼錯誤

內容編碼錯誤通常是因為網頁內容的編碼方式與requests庫默認的編碼方式不匹配。要解決這個問題,我們可以嘗試設置請求的編碼方式。例如:

import requests ?url = 'http://example.com' ?
encoding = 'utf-8' ?# 設置編碼方式為utf-8 ?
try: ?response = requests.get(url, encoding=encoding) ?if response.status_code == 200: ?# 請求成功,返回結果 ?content = response.text

在這個例子中,我們設置了請求的編碼方式為utf-8。如果網頁內容的編碼方式與utf-8不匹配,仍然可能會出現編碼錯誤。這時,我們可以嘗試使用chardet庫來猜測網頁內容的編碼方式,并使用猜測的編碼方式解碼響應內容。例如:

import requests ?
import chardet ?# 導入chardet庫用于猜測編碼方式 ?url = 'http://example.com' ?
try: ?response = requests.get(url) ?if response.status_code == 200: ?# 請求成功,進行編碼猜測并進行解碼 ?rawdata = response.content ?result = chardet.detect(rawdata) ?encoding = result['encoding'] ?content = response.content.decode(encoding)

在這個例子中,我們使用chardet庫來猜測響應內容的編碼方式,并使用猜測的編碼方式解碼響應內容。如果猜測的編碼方式不準確,可能會導致解碼后的內容出現亂碼或其他錯誤。因此,在實際使用中,最好結合其他方法和工具來進行更全面和準確的判斷和處理。

五、HTTP錯誤

除了上述常見的錯誤外,requests庫在進行爬蟲IP請求時還可能遇到其他HTTP錯誤,如HTTP狀態碼錯誤、HTTP重定向錯誤等。這些錯誤通常是由目標網站的特定行為或請求參數錯誤引起的。要解決這些問題,我們需要根據具體的錯誤類型和錯誤信息進行分析和處理。

對于HTTP狀態碼錯誤,我們可以根據狀態碼的不同進行不同的處理。常見的狀態碼包括:

404:請求的資源不存在,可以嘗試更換請求的URL或進行錯誤處理。
500:服務器內部錯誤,可以嘗試更換代理或進行錯誤處理。
301/302:永久/暫時重定向,可以嘗試更換請求的URL或跟隨重定向。
對于HTTP重定向錯誤,requests庫默認會跟隨重定向。如果需要禁止跟隨重定向,可以在請求中設置allow_redirects=False參數。如果需要自定義重定向行為,可以使用Session對象和重定向相關的屬性和方法。例如:

import requests ?s = requests.Session() ?# 創建Session對象 ?
url = 'http://example.com' ?
headers = {'Referer': 'http://www.example.com'} ?# 設置請求頭中的Referer參數 ?
s.headers.update(headers) ?# 將請求頭更新到Session對象中 ?
r = s.get(url, allow_redirects=False) ?# 進行請求,禁止跟隨重定向 ?
if r.status_code == 302: ?# 如果狀態碼為302,進行自定義重定向處理 ?location = r.headers['Location'] ?# 獲取重定向的URL ?r = s.get(location) ?# 進行重定向請求

在這個例子中,我們使用Session對象來存儲請求頭中的Referer參數,并在進行請求時禁止跟隨重定向。如果狀態碼為302,我們獲取重定向的URL并進行自定義的重定向請求。

除了以上常見的錯誤和HTTP錯誤外,requests庫在進行爬蟲IP請求時還可能遇到其他類型的錯誤,如網絡連接問題、代理問題等。在實際使用中,我們需要根據具體的錯誤類型和錯誤信息進行分析和處理,并采取相應的措施進行優化和改進。

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

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

相關文章

前端性能優化總結

這里寫目錄標題 頁面性能測試工具測試指標 前端頁面性能常見的問題前端頁面性能優化常見策略及方案dns優化------預解析域名(異步進行)http請求優化減少請求次數同時多開持久連接 前面面試url從輸入到確認搜索發生了什么js介紹new一個對象的過程&#xf…

Linux 進程等待

在2號手冊里查wait()。wait()等待任意一個子進程的狀態。 wait()等待成功會返回該子進程的id,返回失敗會返回-1: 小實驗 子進程的退出碼 子進程執行work(),父進程wait子進程。 子進程跑完5秒之后就e…

GCANet_Gated context aggregation network for image dehazing and deraining

2019、中科大港科、有代碼 Chen D, He M, Fan Q, et al. Gated context aggregation network for image dehazing and deraining[C]//2019 IEEE winter conference on applications of computer vision (WACV). IEEE, 2019: 1375-1383. GitHub - cddlyf/GCANet: Implementation…

丟掉破解版,官方免費了!!!

哈嘍!大家好。 幾天不見,今天給大家帶來一款海外的神器,官方宣布完全免費,但僅限于個人與教育用途,切勿商用噢! 不要看這個軟件名字普普通通,實際上內蘊乾坤! 接下來看我給大家炫一…

隊列的實現和OJ練習(c語言)

目錄 概念 隊列的實現 利用結構體存放隊列結構 為什么單鏈表不使用這種方法? 初始化隊列 小提示: 隊尾入隊列 隊頭出隊列 獲取隊頭元素 獲取隊尾元素 獲取隊列中有效元素個數 檢測隊列是否為空 銷毀隊列 最終代碼 循環隊列 隊列的OJ題 …

元素清空操作clear與選擇操作check

元素清空操作clear與選擇操作check clear() 作用 清空輸入框的所有內容.clear() 等價于 .type("{selectall}{backspace}") 語法 .clear() .clear(options)option選項 元素選中操作check與uncheck check 語法 // 所有匹配到的選擇框都會被選中一遍 .check()/…

CISP模擬考試(二)

免責聲明 文章僅做經驗分享用途,利用本文章所提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負責,作者不為此承擔任何責任,一旦造成后果請自行承擔!!! 1.DDoS攻擊主要目的是: A.破壞完整性 B.破壞機密性 C.破壞可用性 D.破壞不可抵賴性 答案:…

三、防火墻-源NAT

學習防火墻之前,對路由交換應要有一定的認識 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式(Easy IP)1.4.Smart NAT1.5.三元組 NAT1.6.多出口場景下的源NAT 總結延伸 ——————————————————————————————…

C語言prim算法求最小生成樹

Prim算法是一種用于尋找無向帶權圖的最小生成樹的算法。該算法的基本思想是從一個源點開始,逐步向外擴展生成樹,每次找到與當前生成樹最近的未被訪問的頂點,并將其加入到生成樹中,直到所有頂點都被加入到生成樹中為止。 具體來說…

部署你的第一個應用

🗓?實驗環境 OS名稱Microsoft Windows 11 家庭中文版系統類型x64-based PCDocker版本Docker version 24.0.6, build ed223bcminikube版本v1.32.0 🤓FastAPI 構建應用 #基于fastapi快速創建一個項目 rkun1LAPTOP-TUS5FU0D MINGW64 / $ mkdir k8s-appr…

1688 API接口測試指南

本文為您提供1688 API接口的測試指南。我們將介紹1688 API的基本概念,詳解測試步驟,并為您提供一系列的最佳實踐,以確保您在與1688平臺進行API交互時能夠獲得最佳的效果和穩定性。 一、了解1688 API 1688 API是1688平臺為開發者提供的一套用…

數學建模之擬合及其代碼

發現新天地,歡迎訪問Cr不是鉻的個人網站 引言 與插值問題不同,在擬合問題中不需要曲線一定經過給定的點。擬合問題的目標是尋求一個函數(曲線),使得該曲線在某種準則下與所有的數據點最為接近,即曲線擬合…

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼

基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于跳蛛算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于跳蛛優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要:針對PNN神經網絡的光滑…

7_畫圖常用代碼

plt.figure(dpi200) # 設置 dpi 為 200(可以根據需要調整這個值)

數據結構學習筆記——多維數組、矩陣與廣義表

目錄 一、多維數組(一)數組的定義(二)二維數組(三)多維數組的存儲(四)多維數組的下標的相關計算 二、矩陣(一)特殊矩陣和稀疏矩陣(二)…

從權限跳轉看Activity的data android:scheme

在應用申請懸浮窗權限的時候,可以跳轉到相應的設置界面,并且自動切換到應用的條目,高亮顯示一下, android懸浮窗權限怎么申請 在Android中,要申請懸浮窗權限,需要以下步驟: 在 AndroidManifes…

hp惠普Victus Gaming Laptop 15-fa1025TX/fa1005tx原裝出廠Win11系統ISO鏡像

光影精靈9筆記本電腦原廠W11系統22H2恢復出廠時開箱狀態一模一樣 適用型號:15-fa1003TX,15-fa1005TX,15-fa1007TX,15-fa1025TX 鏈接:https://pan.baidu.com/s/1fBPjed1bhOS_crGIo2tP1w?pwduzvz 提取碼&#xff1a…

每天一道算法題(十一)——滑動窗口最大值_困難(中等)

文章目錄 1、問題2、示例3、解決方法(1)方法1——雙指針 總結 1、問題 給你一個整數數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側。你只可以看到在滑動窗口內的 k 個數字。滑動窗口每次只向右移動一位。 返回 滑動窗…

c++ 函數的申明

1 一個cpp中 兩種情況 1.1 定義 使用 1.2 聲明 使用 定義 2 按 定義 后 直接使用的順序 不用 聲明 函數 #include <iostream> using namespace std;int max(int a, int b) {int max a>b?a:b;return max; }int main() {int a 1;int b 2;cout << max(a, b…

解決vue中引入天地圖顯示不全問題,設置setTimeout即可解決!

index.html中引入天地圖api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地圖 //初始化天地圖 initTMap() {const T window.T;// 3.初始化地圖對象this.tMap new…