【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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 实现结算功能…