48、Python网络编程实用模块与方法详解

Python网络编程实用模块与方法详解

1. smtplib模块

1.1 概述

smtplib模块提供了一个低级的SMTP客户端接口,可使用RFC 821和RFC 1869中描述的SMTP协议发送邮件。该模块包含许多低级函数和方法,下面介绍其最有用的部分。

1.2 关键类和方法

1.2.1 SMTP类
  • SMTP([host [, port]]) :创建一个表示与SMTP服务器连接的对象。若提供 host ,则指定SMTP服务器的名称; port 是可选的端口号,默认端口为25。若提供了 host ,会自动调用 connect() 方法,否则需手动调用。
1.2.2 SMTP实例方法
方法 描述
s.connect([host [, port]]) 连接到指定主机的SMTP服务器。若省略 host ,则连接到本地主机(‘127.0.0.1’); port 默认值为25。若在创建 SMTP 对象时提供了主机名,则无需调用此方法。
s.login(user, password) 若服务器需要身份验证,则使用此方法登录。 user 是用户名, password 是密码。
s.quit() 向服务器发送’QUIT’命令,终止会话。
s.sendmail(fromaddr, toaddrs, message) 向服务器发送邮件消息。 fromaddr 是包含发件人电子邮件地址的字符串; toaddrs 是包含收件人电子邮件地址的字符串列表; message 是包含完全格式化的RFC - 822兼容消息的字符串。需注意, message 应仅包含值在0到127范围内的有效ASCII字符,否则会出现编码错误。若需发送不同编码(如UTF - 8)的消息,应先将其编码为字节字符串。

1.3 示例代码

import smtplib

fromaddr = "someone@some.com"
toaddrs = ["recipient@other.com"]
msg = "From: %s\r\nTo: %s\r\n\r\n" % (fromaddr, ",".join(toaddrs))
msg += """
Refinance your mortgage to buy stocks and Viagra!
"""
server = smtplib.SMTP('localhost')
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

2. http.cookiejar模块

2.1 概述

http.cookiejar模块为存储和管理HTTP cookie提供客户端支持。在Python 2中,该模块名为cookielib。其主要作用是提供可存储HTTP cookie的对象,以便与用于访问互联网文档的urllib包结合使用。

2.2 关键类

描述
CookieJar() 管理HTTP cookie值的对象,存储HTTP请求收到的cookie,并将cookie添加到传出的HTTP请求中。cookie完全存储在内存中,当 CookieJar 实例被垃圾回收时,cookie将丢失。
FileCookieJar(filename [, delayload ]) 创建一个 FileCookieJar 实例,用于从文件中检索和存储cookie信息。 filename 是文件名;若 delayload True ,则启用对文件的惰性访问,即除非有需求,否则不会读取或存储文件。
MozillaCookieJar(filename [, delayload ]) 创建一个与Mozilla cookies.txt文件兼容的 FileCookieJar 实例。
LWPCookieJar(filename [, delayload ]) 创建一个与libwww - perl Set - Cookie3文件格式兼容的 FileCookieJar 实例。

3. urllib包

3.1 概述

urllib包为编写需要与HTTP服务器、FTP服务器和本地文件进行交互的客户端提供了高级接口。典型应用包括从网页抓取数据、自动化、代理、网络爬虫等。在Python 2中,urllib功能分布在多个不同的库模块中,包括urllib、urllib2、urlparse和robotparser;在Python 3中,所有这些功能都被整合并重新组织在urllib包下。

3.2 urllib.request模块

3.2.1 概述

urllib.request模块提供了打开和从URL获取数据的函数和类。在Python 2中,此功能位于urllib2模块中。该模块最常见的用途是使用HTTP从Web服务器获取数据。

3.2.2 urlopen()函数
  • urlopen(url [, data [, timeout]]) :打开指定的URL并返回一个类似文件的对象,可用于读取返回的数据。 url 可以是包含URL的字符串或 Request 类的实例; data 是包含要上传到服务器的表单数据的URL编码字符串,提供时将使用HTTP ‘POST’方法而非默认的’GET’方法; timeout 是内部使用的所有阻塞操作的可选超时时间(以秒为单位)。
3.2.3 urlopen()返回对象的方法
方法 描述
u.read([nbytes]) 以字节字符串形式读取 nbytes 的数据。
u.readline() 以字节字符串形式读取单行文本。
u.readlines() 读取所有输入行并返回一个列表。
u.fileno() 返回整数文件描述符。
u.close() 关闭连接。
u.info() 返回一个包含与URL关联的元信息的映射对象。对于HTTP,返回服务器响应中包含的HTTP头;对于FTP,包含’content - length’;对于本地文件,包含日期、’content - length’和’content - type’字段。
u.getcode() 返回HTTP响应代码(整数),如200表示成功,404表示文件未找到。
u.geturl() 返回考虑了可能发生的任何重定向后的实际URL。
3.2.4 示例代码
try:
    from urllib.request import urlopen    # Python 3
except ImportError:
    from urllib2 import urlopen           # Python 2

u = urlopen("http://docs.python.org/3.0/library/urllib.request.html")
data = u.read()
3.2.5 Request类
  • Request(url [, data [, headers [, origin_req_host [, unverifiable]]]]) :创建一个新的 Request 实例。 url 指定URL; data 是要在HTTP请求中上传到服务器的URL编码数据,提供时会将HTTP请求类型从’GET’更改为’POST’; headers 是包含HTTP头内容的键值映射的字典; origin_req_host 设置为事务的请求主机; unverifiable 若为 True ,表示请求的是不可验证的URL,默认值为 False
3.2.6 Request实例方法
方法 描述
r.add_data(data) 向请求中添加数据。若请求是HTTP请求,方法将更改为’POST’。此方法不会将数据追加到先前设置的数据中,而是直接替换旧数据。
r.add_header(key, val) 向请求中添加头信息。 key 是头名称, val 是头值,两者均为字符串。
r.add_unredirected_header(key, val) 向请求中添加不会添加到重定向请求中的头信息。
r.get_data() 返回请求数据(若有)。
r.get_full_url() 返回请求的完整URL。
r.get_host() 返回请求将发送到的主机。
r.get_method() 返回HTTP方法,即’GET’或’POST’。
r.get_origin_req_host() 返回发起事务的请求主机。
r.get_selector() 返回URL的选择器部分(如’/index.html’)。
r.get_type() 返回URL类型(如’http’)。
r.has_data() 若数据是请求的一部分,则返回 True
r.is_unverifiable() 若请求是不可验证的,则返回 True
r.has_header(header) 若请求包含指定的头,则返回 True
r.set_proxy(host, type) 准备请求以连接到代理服务器,将原始主机替换为 host ,将请求的原始类型替换为 type ,URL的选择器部分设置为原始URL。
3.2.7 示例代码
headers = {
    'User-Agent':
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)'
}
r = Request("http://somedomain.com/", headers=headers)
u = urlopen(r)

3.3 自定义打开器

3.3.1 build_opener()函数
  • build_opener([handler1 [, handler2, ... ]]) :构建一个用于打开URL的自定义打开器对象。参数 handler1 handler2 等都是特殊处理程序对象的实例,这些处理程序的目的是为生成的打开器对象添加各种功能。
3.3.2 可用的处理程序对象
处理程序 描述
CacheFTPHandler 具有持久FTP连接的FTP处理程序
FileHandler 打开本地文件
FTPHandler 通过FTP打开URL
HTTPBasicAuthHandler 基本HTTP身份验证处理
HTTPCookieProcessor 处理HTTP cookie
HTTPDefaultErrorHandler 通过引发 HTTPError 异常处理HTTP错误
HTTPDigestAuthHandler HTTP摘要身份验证处理
HTTPHandler 通过HTTP打开URL
HTTPRedirectHandler 处理HTTP重定向
HTTPSHandler 通过安全HTTP打开URL
ProxyHandler 通过代理重定向请求
ProxyBasicAuthHandler 基本代理身份验证
ProxyDigestAuthHandler 摘要代理身份验证
UnknownHandler 处理所有未知URL的处理程序
3.3.3 示例代码
# 创建一个带有基本身份验证的打开器
auth = HTTPBasicAuthHandler()
auth.add_password("Administrator", "http://www.secretlair.com", "drevil", "12345")
opener = build_opener(auth)
u = opener.open("http://www.secretlair.com/evilplan.html")

# 创建一个处理HTTP cookie的打开器
cookiehand = HTTPCookieProcessor()
opener = build_opener(cookiehand)
u = opener.open("http://www.example.com/")

# 创建一个通过代理的打开器
proxy = ProxyHandler({'http': 'http://someproxy.com:8080/'})
auth = HTTPBasicAuthHandler()
auth.add_password("realm", "host", "username", "password")
opener = build_opener(proxy, auth)
u = opener.open("http://www.example.com/doc.html")

3.4 流程图

graph TD;
    A[开始] --> B[选择操作];
    B --> C{是否需要身份验证};
    C -- 是 --> D[创建带有身份验证处理程序的打开器];
    C -- 否 --> E{是否需要处理cookie};
    E -- 是 --> F[创建带有cookie处理程序的打开器];
    E -- 否 --> G{是否需要通过代理};
    G -- 是 --> H[创建带有代理处理程序的打开器];
    G -- 否 --> I[使用默认打开器];
    D --> J[打开URL];
    F --> J;
    H --> J;
    I --> J;
    J --> K[读取数据];
    K --> L[结束];

4. urllib.parse模块

4.1 URL解析

4.1.1 解析函数
  • urlparse(urlstring [, default_scheme [, allow_fragments]]) :解析URL字符串并返回一个 ParseResult 实例。 default_scheme 指定URL中没有提供方案时使用的方案; allow_fragments 为0时,不允许使用片段标识符。
  • urlsplit(url [, default_scheme [, allow_fragments]]) :与 urlparse() 类似,但URL的参数部分在路径中保持不变,适用于参数可能附加到各个路径组件的URL解析。返回一个 SplitResult 实例。
4.1.2 ParseResult和SplitResult实例属性
属性 描述
r.scheme URL方案说明符(如’http’)
r.netloc 网络位置说明符(如’www.python.org’)
r.path 分层路径(如’/index.html’)
r.params 最后一个路径元素的参数
r.query 查询字符串(如’name=Dave&id=42’)
r.fragment 不带前导’#’的片段标识符
r.username 若网络位置说明符为’username:password@hostname’形式,则为用户名组件
r.password 网络位置说明符中的密码组件
r.hostname 网络位置说明符中的主机名组件
r.port 若网络位置说明符为’hostname:port’形式,则为端口号
4.1.3 其他解析函数
  • urldefrag(url) :返回一个元组 (newurl, fragment) ,其中 newurl 是去除了片段的URL, fragment 是包含片段部分的字符串(若有)。
  • urljoin(base, url [, allow_fragments]) :通过将基本URL和相对URL组合构建绝对URL。
4.1.4 解析查询字符串
  • parse_qs(qs [, keep_blank_values [, strict_parsing]]) :解析URL编码的查询字符串 qs 并返回一个字典,键是查询变量名,值是为每个名称定义的值列表。
  • parse_qsl(qs [, keep_blank_values [, strict_parsing]]) :与 parse_qs() 类似,但结果是一个由 (name, value) 对组成的列表。
4.1.5 示例代码
try:
    from urllib.parse import urlparse, urlencode, parse_qsl   # Python 3
except ImportError:
    from urlparse import urlparse, parse_qsl                  # Python 2
    from urllib import urlencode

# 创建一个带有正确编码查询变量的URL
form_fields = {
    'name': 'Dave',
    'email': 'dave@dabeaz.com',
    'uid': '12345'
}
form_data = urlencode(form_fields)
url = "http://www.somehost.com/cgi-bin/view.py?" + form_data

# 解析URL为组件
r = urlparse(url)
print(r.scheme)       # 'http'
print(r.netloc)       # 'www.somehost.com'
print(r.path)         # '/cgi-bin/view.py'
print(r.params)       # ''
print(r.query)        # 'uid=12345&name=Dave&email=dave%40dabeaz.com'
print(r.fragment)     # ''

# 提取查询数据
parsed_fields = dict(parse_qsl(r.query))
assert form_fields == parsed_fields

4.2 URL编码

4.2.1 编码函数
  • quote(string [, safe [, encoding [, errors]]]) :将字符串中的特殊字符替换为适合包含在URL中的转义序列。字母、数字、下划线、逗号、句点和连字符保持不变,其他字符转换为’%xx’形式的转义序列。
  • quote_plus(string [, safe [, encoding [, errors]]]) :调用 quote() 并额外将所有空格替换为加号。
  • quote_from_bytes(bytes [, safe]) :与 quote() 类似,但接受字节字符串且不进行编码,返回文本字符串(仅Python 3)。
4.2.2 解码函数
  • unquote(string [, encoding [, errors]]) :将’%xx’形式的转义序列替换为其单字符等效项。
  • unquote_plus(string [, encoding [, errors]]) :与 unquote() 类似,但还将加号替换为空格。
  • unquote_to_bytes(string) :与 unquote() 类似,但不进行解码并返回字节字符串。
4.2.3 编码查询数据
  • urlencode(query [, doseq]) :将查询值转换为适合作为URL查询参数或作为POST请求一部分上传的URL编码字符串。

5. urllib.error模块

5.1 异常定义

  • ContentTooShort :当下载的数据量小于预期量(由’Content - Length’头定义)时引发。
  • HTTPError :用于指示HTTP协议问题,可用于发出诸如需要身份验证等事件的信号。此异常也可作为文件对象读取与错误相关的服务器返回数据,是 URLError 的子类。
  • URLError :处理程序检测到问题时引发的错误,是 IOError 的子类,异常实例的 reason 属性包含有关问题的更多信息。

6. urllib.robotparser模块

该模块用于获取和解析用于指示网络爬虫的’robots.txt’文件内容,具体使用方法可参考在线文档。

7. 总结

本文详细介绍了Python中多个与网络编程相关的模块和方法,包括用于发送邮件的 smtplib 模块、管理HTTP cookie的 http.cookiejar 模块、处理URL请求的 urllib 包及其子模块。通过具体的代码示例和操作步骤,展示了如何使用这些模块进行网络编程,如发送邮件、获取网页数据、处理身份验证、管理cookie、解析和编码URL等。希望这些内容能帮助你更好地进行Python网络编程。

7.1 模块功能总结表

模块 主要功能
smtplib 提供低级SMTP客户端接口,用于发送邮件
http.cookiejar 存储和管理HTTP cookie
urllib.request 打开和从URL获取数据
urllib.parse 解析和编码URL
urllib.error 定义 urllib 包使用的异常
urllib.robotparser 获取和解析’robots.txt’文件

7.2 操作流程总结图

graph LR;
    A[网络编程需求] --> B{需求类型};
    B --> C{邮件发送};
    C -- 是 --> D[使用smtplib模块];
    B --> E{网页数据获取};
    E -- 是 --> F[使用urllib.request模块];
    F --> G{是否需要身份验证};
    G -- 是 --> H[添加身份验证处理程序];
    G -- 否 --> I{是否需要处理cookie};
    I -- 是 --> J[添加cookie处理程序];
    I -- 否 --> K{是否需要通过代理};
    K -- 是 --> L[添加代理处理程序];
    K -- 否 --> M[使用默认打开器];
    B --> N{URL解析和编码};
    N -- 是 --> O[使用urllib.parse模块];
    B --> P{处理robots.txt};
    P -- 是 --> Q[使用urllib.robotparser模块];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值