当前位置: 首页 > news >正文

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

引言

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可能是唯一的选择

十一、总结(思维导图)

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数据结构小测试:排序算法
  • OpenCv 如何在 Java 中使用
  • 数据结构课程设计:源代码(C)客房信息管理系统
  • 【Qt+opencv】基础的图像绘制
  • 【JAVA】深入理解Hutool中的Pair、Triple和Tuple:组合数据的新方式,方法返回多个值,嘎嘎香,谁用谁知道,比原生好用更强大
  • 关于Centos停更yum无法使用的解决方案
  • 可用内存为什么可以超过实际内存
  • C++写一个线程池
  • 阿里云CDN- https(设计支付宝春节开奖业务)
  • Linux——远程连接服务器
  • MySQL下载安装使用教程图文教程(超详细)
  • Gmsh教程
  • 关于dom4j主节点的xmlns无法写入的问题
  • 手机日历如何与Outlook同步
  • 基于PHP+MYSQL开发制作的趣味测试网站源码
  • JavaScript 如何正确处理 Unicode 编码问题!
  • [译]如何构建服务器端web组件,为何要构建?
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • AWS实战 - 利用IAM对S3做访问控制
  • CentOS6 编译安装 redis-3.2.3
  • es6--symbol
  • ESLint简单操作
  • JavaScript中的对象个人分享
  • JS题目及答案整理
  • python3 使用 asyncio 代替线程
  • React组件设计模式(一)
  • TypeScript实现数据结构(一)栈,队列,链表
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用权重正则化较少模型过拟合
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 责任链模式的两种实现
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (每日一问)计算机网络:浏览器输入一个地址到跳出网页这个过程中发生了哪些事情?(废话少说版)
  • (十五)使用Nexus创建Maven私服
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (循环依赖问题)学习spring的第九天
  • (一) springboot详细介绍
  • (转)nsfocus-绿盟科技笔试题目
  • (转)大型网站架构演变和知识体系
  • (转)原始图像数据和PDF中的图像数据
  • (转载)Linux网络编程入门