【Python爬蟲】requests知識點講解

目錄

  • 前言
  • 1. requests庫基礎
    • 1.1 安裝requests
    • 1.2 基本導入
  • 2. HTTP請求方法
    • 2.1 GET請求
    • 2.2 POST請求
    • 2.3 其他HTTP方法
  • 3. 請求頭設置
    • 3.1 User-Agent設置
    • 3.2 常用請求頭
  • 4. 響應處理
    • 4.1 響應內容獲取
    • 4.2 響應狀態碼
    • 4.3 響應頭信息
  • 5. 會話管理
    • 5.1 Session對象
    • 5.2 Cookie處理
  • 6. 代理設置
    • 6.1 HTTP代理
    • 6.2 SOCKS代理
  • 7. 超時設置
  • 8. SSL證書驗證
  • 9. 文件上傳和下載
  • 9.1 文件上傳
    • 9.2 文件下載
  • 10. 異常處理
  • 11. 重試機制
  • 12. 實際爬蟲案例
    • 12.1 爬取網頁內容
    • 12.2 處理表單登錄
  • 13. 性能優化技巧
    • 13.1 連接池
    • 13.2 并發請求
  • 14. 反爬蟲對策
    • 14.1 隨機User-Agent
    • 14.2 IP代理池
  • 15. 最佳實踐
    • 15.1 完整的爬蟲框架
  • 總結

前言

requests是Python中最受歡迎的HTTP庫之一,它簡化了HTTP請求的發送過程,是網絡爬蟲開發的首選工具。本文將詳細介紹requests庫在爬蟲開發中的各種知識點和實用技巧。

1. requests庫基礎

1.1 安裝requests

pip install requests

1.2 基本導入

import requests

2. HTTP請求方法

2.1 GET請求

import requests# 基本GET請求
response = requests.get('https://httpbin.org/get')
print(response.text)# 帶參數的GET請求
params = {'key1': 'value1', 'key2': 'value2'}
response = requests.get('https://httpbin.org/get', params=params)
print(response.url)  # 查看完整URL

2.2 POST請求

# 發送表單數據
data = {'username': 'admin', 'password': '123456'}
response = requests.post('https://httpbin.org/post', data=data)# 發送JSON數據
import json
json_data = {'name': '張三', 'age': 25}
response = requests.post('https://httpbin.org/post', json=json_data)
# 或者
response = requests.post('https://httpbin.org/post', data=json.dumps(json_data),headers={'Content-Type': 'application/json'})

2.3 其他HTTP方法

# PUT請求
response = requests.put('https://httpbin.org/put', data={'key': 'value'})# DELETE請求
response = requests.delete('https://httpbin.org/delete')# HEAD請求
response = requests.head('https://httpbin.org/get')# OPTIONS請求
response = requests.options('https://httpbin.org/get')

3. 請求頭設置

3.1 User-Agent設置

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'
}
response = requests.get('https://httpbin.org/headers', headers=headers)

3.2 常用請求頭

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate','Connection': 'keep-alive','Referer': 'https://www.google.com/'
}

4. 響應處理

4.1 響應內容獲取

response = requests.get('https://httpbin.org/get')# 獲取文本內容
print(response.text)# 獲取二進制內容
print(response.content)# 獲取JSON數據
if response.headers.get('content-type') == 'application/json':json_data = response.json()print(json_data)# 獲取響應編碼
print(response.encoding)# 手動設置編碼
response.encoding = 'utf-8'

4.2 響應狀態碼

response = requests.get('https://httpbin.org/get')# 狀態碼
print(response.status_code)# 判斷請求是否成功
if response.status_code == 200:print('請求成功')
else:print(f'請求失敗,狀態碼:{response.status_code}')# 使用raise_for_status()檢查狀態
try:response.raise_for_status()
except requests.exceptions.HTTPError as e:print(f'HTTP錯誤:{e}')

4.3 響應頭信息

response = requests.get('https://httpbin.org/get')# 獲取所有響應頭
print(response.headers)# 獲取特定響應頭
print(response.headers['Content-Type'])
print(response.headers.get('Server', '未知'))

5. 會話管理

5.1 Session對象

# 創建會話對象
session = requests.Session()# 設置會話級別的請求頭
session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})# 使用會話發送請求
response = session.get('https://httpbin.org/get')# 會話會自動處理Cookie
response = session.get('https://httpbin.org/cookies/set/sessioncookie/123456789')
response = session.get('https://httpbin.org/cookies')
print(response.json())

5.2 Cookie處理

# 手動設置Cookie
cookies = {'session_id': 'abc123', 'user_id': '456'}
response = requests.get('https://httpbin.org/cookies', cookies=cookies)# 從響應中獲取Cookie
response = requests.get('https://httpbin.org/cookies/set/test/value')
print(response.cookies)# 使用Session自動管理Cookie
session = requests.Session()
response = session.get('https://httpbin.org/cookies/set/auto/managed')
response = session.get('https://httpbin.org/cookies')
print(response.json())

6. 代理設置

6.1 HTTP代理

# 設置HTTP代理
proxies = {'http': 'http://proxy.example.com:8080','https': 'https://proxy.example.com:8080'
}response = requests.get('https://httpbin.org/ip', proxies=proxies)

6.2 SOCKS代理

# 需要安裝:pip install requests[socks]
proxies = {'http': 'socks5://127.0.0.1:1080','https': 'socks5://127.0.0.1:1080'
}response = requests.get('https://httpbin.org/ip', proxies=proxies)

7. 超時設置

# 設置連接超時和讀取超時
try:response = requests.get('https://httpbin.org/delay/5', timeout=(3, 10))
except requests.exceptions.Timeout:print('請求超時')# 只設置總超時時間
try:response = requests.get('https://httpbin.org/delay/5', timeout=5)
except requests.exceptions.Timeout:print('請求超時')

8. SSL證書驗證

# 禁用SSL證書驗證(不推薦在生產環境使用)
response = requests.get('https://httpbin.org/get', verify=False)# 指定CA證書文件
response = requests.get('https://httpbin.org/get', verify='/path/to/ca-bundle.crt')# 客戶端證書認證
response = requests.get('https://httpbin.org/get', cert=('/path/to/client.cert', '/path/to/client.key'))

9. 文件上傳和下載

9.1 文件上傳

# 上傳單個文件
with open('test.txt', 'rb') as f:files = {'file': f}response = requests.post('https://httpbin.org/post', files=files)# 上傳多個文件
files = {'file1': open('file1.txt', 'rb'),'file2': open('file2.txt', 'rb')
}
response = requests.post('https://httpbin.org/post', files=files)# 記得關閉文件
for file in files.values():file.close()

9.2 文件下載

# 小文件下載
response = requests.get('https://httpbin.org/image/png')
with open('image.png', 'wb') as f:f.write(response.content)# 大文件流式下載
url = 'https://httpbin.org/stream-bytes/1024'
response = requests.get(url, stream=True)
with open('large_file.bin', 'wb') as f:for chunk in response.iter_content(chunk_size=8192):if chunk:f.write(chunk)

10. 異常處理

import requests
from requests.exceptions import RequestException, ConnectionError, Timeout, HTTPErrordef safe_request(url, **kwargs):try:response = requests.get(url, **kwargs)response.raise_for_status()return responseexcept ConnectionError:print('連接錯誤')except Timeout:print('請求超時')except HTTPError as e:print(f'HTTP錯誤:{e}')except RequestException as e:print(f'請求異常:{e}')return None# 使用示例
response = safe_request('https://httpbin.org/get', timeout=5)
if response:print(response.text)

11. 重試機制

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retrydef create_session_with_retry():session = requests.Session()# 配置重試策略retry_strategy = Retry(total=3,  # 總重試次數backoff_factor=1,  # 重試間隔status_forcelist=[429, 500, 502, 503, 504],  # 需要重試的狀態碼)adapter = HTTPAdapter(max_retries=retry_strategy)session.mount('http://', adapter)session.mount('https://', adapter)return session# 使用示例
session = create_session_with_retry()
response = session.get('https://httpbin.org/status/500')

12. 實際爬蟲案例

12.1 爬取網頁內容

import requests
from bs4 import BeautifulSoup
import time
import randomclass WebScraper:def __init__(self):self.session = requests.Session()self.session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'})def get_page(self, url, **kwargs):try:response = self.session.get(url, timeout=10, **kwargs)response.raise_for_status()return responseexcept Exception as e:print(f'獲取頁面失敗:{e}')return Nonedef parse_html(self, html_content):soup = BeautifulSoup(html_content, 'html.parser')# 解析邏輯return soupdef crawl_with_delay(self, urls):results = []for url in urls:response = self.get_page(url)if response:results.append(response.text)# 隨機延時,避免被反爬time.sleep(random.uniform(1, 3))return results# 使用示例
scraper = WebScraper()
urls = ['https://httpbin.org/get', 'https://httpbin.org/headers']
results = scraper.crawl_with_delay(urls)

12.2 處理表單登錄

def login_example():session = requests.Session()# 1. 獲取登錄頁面login_page = session.get('https://example.com/login')# 2. 解析頁面獲取CSRF token等soup = BeautifulSoup(login_page.text, 'html.parser')csrf_token = soup.find('input', {'name': 'csrf_token'})['value']# 3. 提交登錄表單login_data = {'username': 'your_username','password': 'your_password','csrf_token': csrf_token}response = session.post('https://example.com/login', data=login_data)# 4. 檢查登錄是否成功if '登錄成功' in response.text or response.url == 'https://example.com/dashboard':print('登錄成功')return sessionelse:print('登錄失敗')return None

13. 性能優化技巧

13.1 連接池

from requests.adapters import HTTPAdaptersession = requests.Session()# 設置連接池大小
adapter = HTTPAdapter(pool_connections=10,  # 連接池數量pool_maxsize=20,      # 連接池最大連接數max_retries=3         # 最大重試次數
)session.mount('http://', adapter)
session.mount('https://', adapter)

13.2 并發請求

import concurrent.futures
import requestsdef fetch_url(url):try:response = requests.get(url, timeout=5)return response.status_code, len(response.content)except Exception as e:return None, str(e)urls = ['https://httpbin.org/get'] * 10# 使用線程池并發請求
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:results = list(executor.map(fetch_url, urls))for i, (status, size) in enumerate(results):print(f'URL {i}: Status={status}, Size={size}')

14. 反爬蟲對策

14.1 隨機User-Agent

import randomuser_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]def get_random_headers():return {'User-Agent': random.choice(user_agents),'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3','Accept-Encoding': 'gzip, deflate','Connection': 'keep-alive',}# 使用隨機請求頭
response = requests.get('https://httpbin.org/headers', headers=get_random_headers())

14.2 IP代理池

import randomclass ProxyPool:def __init__(self):self.proxies = [{'http': 'http://proxy1:8080', 'https': 'https://proxy1:8080'},{'http': 'http://proxy2:8080', 'https': 'https://proxy2:8080'},# 更多代理...]def get_random_proxy(self):return random.choice(self.proxies)def request_with_proxy(self, url, **kwargs):proxy = self.get_random_proxy()try:response = requests.get(url, proxies=proxy, timeout=10, **kwargs)return responseexcept Exception as e:print(f'代理請求失敗:{e}')return None# 使用代理池
proxy_pool = ProxyPool()
response = proxy_pool.request_with_proxy('https://httpbin.org/ip')

15. 最佳實踐

15.1 完整的爬蟲框架

import requests
import time
import random
import logging
from urllib.parse import urljoin, urlparseclass AdvancedScraper:def __init__(self, base_url=None, delay_range=(1, 3)):self.base_url = base_urlself.delay_range = delay_rangeself.session = self._create_session()self.logger = self._setup_logger()def _create_session(self):session = requests.Session()session.headers.update({'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'})return sessiondef _setup_logger(self):logger = logging.getLogger(__name__)logger.setLevel(logging.INFO)handler = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')handler.setFormatter(formatter)logger.addHandler(handler)return loggerdef get(self, url, **kwargs):if self.base_url and not url.startswith('http'):url = urljoin(self.base_url, url)try:self.logger.info(f'請求URL: {url}')response = self.session.get(url, timeout=10, **kwargs)response.raise_for_status()# 隨機延時delay = random.uniform(*self.delay_range)time.sleep(delay)return responseexcept Exception as e:self.logger.error(f'請求失敗: {url}, 錯誤: {e}')return Nonedef close(self):self.session.close()# 使用示例
scraper = AdvancedScraper(base_url='https://httpbin.org')
response = scraper.get('/get')
if response:print(response.json())
scraper.close()

總結

requests庫是Python爬蟲開發的強大工具,掌握以下要點:
  1. 基礎使用:熟練掌握GET、POST等HTTP方法
  2. 會話管理:使用Session對象管理Cookie和連接
  3. 異常處理:完善的錯誤處理機制
  4. 性能優化:連接池、并發請求等技術
  5. 反爬蟲對策:隨機請求頭、代理池、延時等
  6. 最佳實踐:結構化代碼、日志記錄、資源管理

通過合理使用這些技巧,可以構建穩定、高效的網絡爬蟲程序。記住要遵守網站的robots.txt協議和相關法律法規,進行負責任的數據采集。

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

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

相關文章

服務器上安裝配置vsftpd

目錄 1. 安裝vsftpd服務 2、修改配置文件 3. 修改用戶白名單 4. 通過ftp客戶端命令登錄ftp服務器 5. 參考資料 1. 安裝vsftpd服務 執行命令安裝vsftp服務、和ftp客戶端 yum install vsftpd yum install ftp 2、修改配置文件 在服務器上先創建一個系統用戶,待…

C#實現圖片文字識別

這幾年的AI的發展,使得文字識別難度大大降低、精度大大的提高。百度飛漿就是一個非常好的AI框架,而且是開源的。 我們利用百度飛漿就能快速簡單的實現文字識別功能,幾行代碼就可以集成。 其中百度飛漿的PaddleOCR,就是專門針對文…

Android Framework 調用棧

在Android Framework開發中,添加調用棧(Call Stack)是調試復雜問題(如崩潰、死鎖或流程追蹤)的核心手段。 一、Java層調用棧添加 適用于Activity、Service等組件或Framework中的Java代碼。 基礎方法: 使用…

Ollama安裝非系統盤操作方法(2025年6月測試通過)

Ollama是當前部署大模型比較便利的工具,但是默認會將軟件和模型都安裝到C盤下,導致系統盤爆表,建議將軟件和模型都放置在非系統盤。 1. 軟件安裝在非系統盤 (1)在D盤下手動創建ollama目錄 (2&#xff09…

《HTTP權威指南》 第1-2章 HTTP和URL基礎

HTTP請求基礎 格式化數據塊稱為HTTP報文 請求報文:從客戶端發往服務器的HTTP報文,只有請求起始行請求首部,沒有請求主體 響應報文:從服務器發往客戶端的報文,包含響應起始行響應首部響應主體 HTTP報文通過傳輸控制…

9. TypeScript 泛型

TypeScript 中的泛型使開發者能夠編寫靈活、可重用的代碼,同時保持類型安全。它們允許動態定義類型,確保函數、類和接口可以適用于任何數據類型。這有助于避免重復,提高代碼的模塊化,使其既類型安全又具備適應性。 一、認識泛型 …

Apache Iceberg與Hive集成:分區表篇

一、Iceberg分區表核心概念與Hive集成原理 1.1 分區表在大數據場景的價值 在大規模數據分析中,分區表通過將數據按特定維度(如時間、地域、業務類型)劃分存儲,可顯著提升查詢效率。Apache Iceberg的分區表設計融合了Hive的分區理…

SAST + IAST + DAST 全鏈路防護體系構建方案

🔥「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 1. 生命周期分層嵌入(防御縱深) 階段工具防護重點集成觸發點編碼階段SAST源碼漏洞(硬編碼密鑰、SQL注入模式&#x…

pnpm link如何不踩坑

前提一:我有一個source-project源碼庫,有一個develop-project項目庫。想使用pnpm link對source-project進行本地調試。 前提二:source-project源碼庫已打包 本地調試詳細步驟如下: 1、檢查是否配置了系統環境變量,P…

vue3 javascript 多字段求和技巧

在 Vue 3 中,如果你需要在一個組件中處理多個字段的求和,你可以通過計算屬性(computed properties)或者方法(methods)來實現。這里我將展示兩種主要的方法: 方法 1:使用計算屬性&am…

【LeetCode】每日一題 —— No.3405

LeetCode 3405 統計恰好有 K 個相等相鄰元素的數組數目&#xff08;DP 構造型&#xff09; 題目概述 我們需要統計長度為 n 的數組 arr 滿足如下條件的方案數&#xff1a; 每個元素在區間 [1, m] 之間恰好存在 k 個位置 i (1 ≤ i < n) 滿足 arr[i] arr[i - 1] 也就是說…

Elsa Workflows: .NET 的開源工作流引擎簡介

文章目錄 Elsa Workflows&#xff1a; .NET 的開源工作流引擎核心定位與理念關鍵特性與優勢當前 (Elsa 3) 的已知限制/待完善項總結 Elsa Workflows&#xff1a; .NET 的開源工作流引擎 Elsa Workflows 是一個開源的、模塊化的 .NET 庫集合&#xff0c;旨在為 .NET 應用程序提…

linux虛擬機yum命令報錯解決方案

問題 假如出現了這樣的問題&#xff0c;可能是虛擬機yum庫存在問題 解決方法 1、打開cmd&#xff0c;輸入ssh root地址&#xff0c;比如ssh root192.168.222..111&#xff0c;選yes&#xff0c;輸入虛擬機密碼 2、使用yum repolist,查看倉庫狀態&#xff0c;status下面如果是…

C++ 第一階段 基本語法 - 第一節:變量與數據類型詳解

目錄 一、變量與數據類型概述 1.1 什么是變量&#xff1f; 1.2 數據類型分類 二、基本數據類型詳解 2.1 整型&#xff08;int, short, long&#xff09; 2.1.1 常見整型類型 2.1.2 代碼示例 2.1.3 注意事項 2.2 浮點型&#xff08;float, double&#xff09; 2.2.1 浮…

CppCon 2017 學習:CNL: A Compositional Numeric Library

你說的這段關于浮點數的問題總結得很精準&#xff0c;我幫你整理一下&#xff0c;讓理解更清晰&#xff1a; The Problem with Floating-Point&#xff08;浮點數的問題&#xff09; 復雜的表示結構 浮點數由符號位 &#xff0c;有效數&#xff08;significand/mantissa&…

linux基礎重定向及組合重定向

一、基礎重定向操作符 ?類別? ?操作符? ?含義? ?示例? ?備注? ?標準輸出? > 覆蓋寫入 stdout 到文件 ls > file.txt 文件不存在則創建&#xff0c;存在則清空內容 >> 追加 stdout 到文件末尾 date >> log.txt 保留原有內容 ?標準…

佰力博科技與您探討鐵電分析儀適用場景

鐵電分析儀是一種用于測試和研究鐵電材料性能的精密儀器&#xff0c;其適用場景非常廣泛&#xff0c;涵蓋了材料科學、物理學、電子工程等多個領域。 1、材料科學與工程 鐵電分析儀廣泛應用于鐵電材料的研究&#xff0c;包括薄膜、厚膜、塊體材料以及電子陶瓷等。它能夠測試材料…

JVM 內存模型與垃圾回收機制全解析:架構、算法、調優實踐

Java 作為一門面向對象的編程語言&#xff0c;其核心優勢之一是 “一次編寫&#xff0c;到處運行” 的跨平臺特性。這一特性背后&#xff0c;Java 虛擬機&#xff08;JVM&#xff09;扮演著至關重要的角色。JVM 不僅負責解釋執行字節碼&#xff0c;還通過內存管理和垃圾回收機制…

自然語言處理相關基本概念

基本概念章節總結 一、語言學&#xff08;Linguistics&#xff09; 定義 研究語言的本質、結構和發展規律的科學&#xff0c;涵蓋語音、文字、語法等屬性。分支包括歷時語言學、共時語言學、描述語言學等。 核心內容 分析語言的形態、句法、語義等層面&#xff0c;如詞素&…

Vue購物車應用實現教程

文章目錄 1. 項目介紹2. 開發環境準備3. 設計購物車界面4. 創建Vue實例和數據模型5. 實現購物車功能5.1 從本地存儲加載數據5.2 監聽數據變化保存到本地存儲5.3 實現全選/反選功能5.4 計算選中商品的總價和總數量5.5 實現修改商品數量功能5.6 實現刪除商品功能5.7 實現結算功能…