【python学习】爬虫中常使用的urllib和requests库的的背景、定义、特点、功能、代码示例以及两者的区别

news2024/9/21 16:33:51

引言

urllib是Python标准库中的一个模块,它提供了一系列用于操作URL的功能
requests是一个Python第三方库,由Kenneth Reitz创建,用于简化HTTP客户端的编程

一、urllib的定义

urllib可以操作url,主要分为以下几个子模块:

1.1 urllib.request

用于打开和读取URLs

1.2 urllib.error

包含urllib.request引发的异常

1.3 urllib.parse

用于解析URLs

1.4 urllib.robotparser

用于解析robots.txt文件

二、urllib的特点

2.1 内置

urllib是Python标准库的一部分,因此不需要额外安装

2.2 功能全面

支持多种网络协议,包括HTTP、HTTPS、FTP等

2.3 易于使用

提供了简单易用的API,适合进行简单的网络请求操作

三、urllib的功能

3.1 打开URLs

使用urllib.request.urlopen()函数可以轻松打开一个URL

3.2 发送请求

支持发送GET、POST等HTTP请求

3.3 处理异常

urllib.error模块可以捕获和处理网络请求过程中出现的异常

3.4 解析URLs

urllib.parse模块可以解析和构造URLs

3.5 遵守robots.txt

urllib.robotparser模块可以帮助遵守网站的爬虫访问规则

四、urllib的代码示例

以下是使用urllib模块进行网络请求的几个示例:

4.1 发送GET请求

import urllib.request
# 发送GET请求
with urllib.request.urlopen('http://www.example.com') as response:
    html = response.read()
    print(html.decode('utf-8'))

4.2 发送POST请求

import urllib.request
import urllib.parse
url = 'http://httpbin.org/post'
values = {'key': 'value'}
data = urllib.parse.urlencode(values)
data = data.encode('utf-8')  # data should be bytes
req = urllib.request.Request(url, data=data, method='POST')
with urllib.request.urlopen(req) as response:
    print(response.read().decode('utf-8'))

4.3 处理异常

import urllib.request
import urllib.error
try:
    response = urllib.request.urlopen('http://www.example.com/404')
except urllib.error.HTTPError as e:
    print(f'HTTPError: {e.code} {e.reason}')
except urllib.error.URLError as e:
    print(f'URLError: {e.reason}')

4.4 解析URLs

from urllib.parse import urlparse
result = urlparse('http://www.example.com/index.html;user?id=5#comment')
print(result)
# 输出:ParseResult(scheme='http', netloc='www.example.com', path='/index.html', params='user', query='id=5', fragment='comment')

以上示例展示了urllib库的一些基本用法,包括如何发送HTTP请求、如何处理请求异常以及如何解析URLs。由于urllib库功能丰富,这些示例只是冰山一角。

五、requests的定义

requests是基于urllib3,提供了一个更加用户友好的API来发送HTTP/1.1请求

六、requests的特点

6.1 简洁易用

requests的API设计简洁直观,易于上手和使用

6.2 功能丰富

支持HTTP连接保持和连接池,支持SSL/TLS验证,支持国际化和本地化等

6.3 无需手动处理编码

自动处理HTTP响应内容的编码问题

6.4 支持会话与 cookies

能够使用会话对象来跨请求保持某些参数,如cookies

6.5 支持插件

requests支持插件,可以轻松扩展其功能

七、requests的功能

7.1 发送各种HTTP请求(GET, POST, PUT, DELETE, HEAD, OPTIONS等)

7.2 处理请求参数、URL、头信息和内容数据

7.3 处理HTTP响应内容,包括JSON、XML、HTML等

7.4 使用会话对象来跨请求保持某些参数

7.5 上传文件

7.6 处理SSL证书验证

7.7 设置代理

7.8 异常处理

八、requests的安装

8.1 requests不是Python标准库的一部分,需要通过以下命令安装:

pip install requests

8.2 若是在pycharm中则按下图所示操作:

在这里插入图片描述

九、requests的代码示例

以下是使用requests库进行网络请求的几个示例:

9.1 发送GET请求

import requests
response = requests.get('https://api.github.com/user', params={'username': 'example'})
print(response.json())

9.2 发送POST请求

import requests
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://httpbin.org/post', data=data)
print(response.text)

9.3 使用会话对象

import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
response = s.get("http://httpbin.org/cookies")
print(response.text)

9.4 异常处理

import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout, RequestException
try:
    response = requests.get('https://api.github.com', timeout=5)
    response.raise_for_status()
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')
except ConnectionError as conn_err:
    print(f'Connection error occurred: {conn_err}')
except Timeout as timeout_err:
    print(f'Timeout error occurred: {timeout_err}')
except RequestException as req_err:
    print(f'Oh no, something bad happened: {req_err}')

9.5 上传文件

import requests
files = {'file': open('report.xls', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text)

这些示例展示了requests库的几个核心功能

  1. 发送请求
  2. 处理响应
  3. 使用会话
  4. 异常处理
  5. 上传文件

requests库因其简洁和强大而成为Python中处理HTTP请求的常用库

十、urllibrequests的区别

urllibrequests都是Python中用于发送HTTP请求的库,但它们在API设计、易用性、功能性和社区支持等方面存在一些显著的区别

10.1 API设计和易用性

  • urllib
    • 作为Python标准库的一部分,无需额外安装
    • 提供了较低级别的API,使用起来较为复杂,需要编写更多的代码来完成相同的任务
    • 异常处理较为分散,需要分别捕获不同类型的异常
  • requests
    • 需要单独安装,不是Python标准库的一部分
    • 提供了简洁、直观的API,使得发送请求和处理响应变得极其简单
    • 异常处理更加统一,通过requests.exceptions模块来捕获和处理各种异常

10.2 功能性

  • urllib
    • 功能相对基础,适合进行简单的请求
    • 对于复杂的任务,如会话保持、cookie处理、SSL验证等,需要更多的手动操作
  • requests
    • 功能更加全面,内置了会话对象、cookie持久化、SSL验证、连接池、JSON响应解析等高级功能
    • 支持插件,可以轻松扩展其功能

10.3 社区支持

  • urllib
    • 作为标准库的一部分,更新周期与Python相同,通常较为稳定
    • 社区支持主要通过Python官方渠道
  • requests
    • 社区驱动,更新频繁,社区支持广泛
    • 由于是第三方库,可能包含更多最新的特性和改进

10.4 性能

  • urllib
    • 对于简单的请求,性能通常足够
    • 对于复杂的请求或并发操作,可能需要额外的库(如http.client)来优化
  • requests
    • 内部使用了urllib3,因此在性能上有所优化,尤其是在并发请求时

示例对比

以下是使用urllibrequests发送GET请求的简单示例对比:
使用urllib发送GET请求:

import urllib.request
import urllib.error
try:
    with urllib.request.urlopen('http://example.com') as response:
        data = response.read()
        print(data.decode('utf-8'))
except urllib.error.HTTPError as e:
    print(f'HTTPError: {e.code} {e.reason}')
except urllib.error.URLError as e:
    print(f'URLError: {e.reason}')

使用requests发送GET请求:

import requests
response = requests.get('http://example.com')
print(response.text)

使用requests发送网络请求通常更加简洁明了
然而,由于urllib是Python标准库的一部分,因此在不允许安装第三方库的环境中,urllib可能是唯一的选择

十一、总结(思维导图)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx详解(超级详细)

目录 Nginx简介 1. 为什么使用Nginx 2. 安装Nginx Nginx的核心功能 1. Nginx反向代理功能 2. Nginx的负载均衡 3 Nginx动静分离 Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协…

深入Redis集群部署:从安装配置到测试验证的完整指南

🏡作者主页:点击! 🐧Linux基础知识(初学):点击! 🐧Linux高级管理防护和群集专栏:点击! 🔐Linux中firewalld防火墙:点击! ⏰️创作…

FastAPI 学习之路(六十)打造系统的日志输出

我们要搭建日志系统,可以使用loguru,很不错的一个开源日志系统 pip install loguru 我们在common创建log.py,使用方式也很简单 import os import timefrom loguru import logger# 日志的路径 log_path os.path.join(os.getcwd(), "log…

信息安全工程师题

物理隔离技术要求两台物理机物理上并不直连,只能进行间接的信息交换。所以防火墙不能实现网络的物理隔离Web应用防火墙可以防止SQL注入、xss攻击、恶意文件上传、远程命令执行、文件包含、恶意扫描拦截等;可以发现并拦截恶意的Web代码;可防止…

树形背包问题

一些题目给定了树形结构,在这个树形结构中选取一定数量的点或边(也可能是其他属性),使得某种与点权或者边权相关的花费最大或者最小。解决这类问题,一般要考虑使用树上背包。 树上背包,顾名思义&#xff0c…

JDK垃圾回收机制和垃圾回收算法

查看java相关信息 java -XX:PrintCommandLineFlags -version UseParallelGC 即 Parallel Scavenge Parallel Old,再查看详细信息 内存分配策略 1. 对象优先在 Eden 分配 大多数情况下,对象在新生代 Eden 区分配,当 Eden 区空间不够时,发…

STM32被拔网线 LWIP的TCP无法重连解决方案

目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码: 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题,就是我的stm32设备作为tcp客户端…

c# listview控件调整标题显示顺序

右键点击listview,选择编辑列 修改DisplayIndex listview在成员位置点击上下箭头移动后,实际显示不会改变,因为DisplayIndex没有改变

Python 工程师对 3D 高斯溅射的介绍(第 1 部分)

从 Python 工程师的角度理解和编写 Gaussian Splatting 欢迎来到雲闪世界。2023 年初,来自法国蔚蓝海岸大学和马克斯普朗克信息研究所的作者发表了一篇题为“用于实时场渲染的 3D 高斯溅射”的论文。 该论文展示了实时神经渲染的重大进步,超越了 NeRF 等…

一文吃透,低代码是什么?盘点国内十大低代码平台,你用过哪个?

什么是低代码(Low Code)?低代码是怎么火的?国内十大低代码平台分别是谁?低代码项目开发流程是怎样的?低代码和无代码区别是啥?以及低代码的核心价值是什么?可以使用低代码开发平台创建哪些应用?…

el-cascader数据回显失败

el-cascader选中数据第一次回显正常,当选中数据改变再次回显时失败,呈现的还是上次的选中数据 如图 常用的方法this. n e x t T i c k ( ( ) > ) 跟 t h i s . nextTick(() > {})跟this. nextTick(()>)跟this.forceUpdate();强制刷新数据都无…

leetcode hot100_part30_二分查找

上次写博客已经一个月了,这段时间在做外卖项目,真的啥也没有就是个小玩具。 上次接触是在最长递增子序列的一个题解里,复习一下已经忘完了。如果我们在一个有序数组中进行查找某个target,一般肯定就是从小到大or从大到小遍历查找&…

js reduce 的别样用法

let mergedItems list.reduce((accumulator, currentItem) > {let existingItem accumulator.find((item) > item.manObject_name currentItem.manObject_name);if (existingItem) {existingItem.laborCostHand currentItem.laborCostHand; //劳务费existingItem.wor…

【网络】Socket编程

文章目录 正确理解端口号理解源IP地址和目的IP地址认识端口号端口号和进程ID 理解Socket网络字节序socket编程接口创建socket套接字bind绑定套接字listen建立监听accept接受连接connect建立连接sendto发送数据接收数据close关闭套接字 sockaddr结构体 正确理解端口号 理解源IP…

Windows 电脑部署 ollama3 并安装模型

Windows 电脑部署 ollama3 并安装模型 部署中为了尽可能减少对本地环境的污染,使用 Docker 安装! github: https://github.com/ollama/ollama 准备部署文件 version: 3.8services:ollama:volumes:- ./models:/root/.ollama # 将本地文件夹挂载到容器中…

独立游戏《星尘异变》UE5 C++程序开发日志7——实现加载界面

目录 一、创建自定义AssetManager类 二、异步加载资产 三、加载界面UI的实现 1.UI布局 2.在打开关卡前和进入关卡后创建UI并统计进度 有时可能会遇到关卡已经进去但依然会卡顿一段时间的情况,所以我们需要在进入关卡后,玩家可以操作关卡之前&#x…

RAG技术进化史:从初级到高级,再到模块化RAG架构的创新发展

大型语言模型(LLMs)通过在自然语言任务及其它领域的成功应用,如 ChatGPT、Bard、Claude 等所示,已经彻底改变了 AI 领域。这些 LLMs 能够生成从创意写作到复杂代码的文本。然而,LLMs 面临着幻觉、过时知识和不透明、无…

Codeforces Round 672 (Div. 2) C1. Pokémon Army (easy version) (DP)

不知道能不能用贪心,反正我是没看出来,所以用DP求解。 首先分析一下题意,我们要在一段序列中取出一段子序列,然后让这段子序列按顺序逐个先加后减最终得到的结果最大。 如果要用DP,那么我们首先就要思考怎么表示状态…

心好累,早点睡!永远不要提前焦虑——早读(逆天打工人爬取热门微信文章解读)

你们遇到心烦的事,会怎么排解呢? 引言Python 代码第一篇 洞见 永远不要提前焦虑第二篇 故事来源于生活结尾 引言 这两天天气都是阴雨 雨时而大 时而小 就是下个不停 老天还算给面子 上班路上总是细雨或者无雨 昨天晚上回来 山地车的前轮有些送动 马上发…

C++从入门到起飞之——this指针 全方位剖析!

个人主页:秋风起,再归来~ C从入门到起飞 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 目录 1、this指针 2、C和C语⾔实现Stack对⽐ C实现Stack代码 C实现Stack代…