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模块];