模块 | 描述 |
---|---|
urllib.request |
打开一个url(模拟浏览器的请求发起),并读取它的内容 |
urllib.parse |
解析一个url |
urllib.robotparser |
解析robots.txt |
urllib.error |
包含了urllib.request 的错误 |
urllib.request
——构造URL请求并捕获内容# urllib.request来构造http请求,并获取http相应的内容
import urllib.request
利用方法urlopen()
:用于打开一个url
from urllib.request import urlopen
my_url = urlopen("https://www.baidu.com")
利用方法read()
、readline()/readlines()
来读取文件内容
import urllib.request
my_url = urllib.request.urlopen("https://www.baidu.com")
# 向read()传入参数则表示要读取内容的长度
print(my_url.read())
# 用readlin()来读取一行内容
print(my_url.readline())
# 用readlines()来读取所有行的内容,并返回一个列表
ret_li = my_url.readlines()
for line in ret_li:
print(line)
利用方法getcode()
来获取HTTP请求的状态码
# http状态码
# 1xx - 请求发送成功,还需发送方继续操作
# 2xx - 请求成功
# 3xx - 重定向
# 4xx - 客户端的错误
# 5xx - 服务端的错误
print(my_url.getcode())
利用类Request
来构造自定义http请求
Request类有几个重要的属性
如,可以构造一个这样的http请求:
import urllib.request
my_url = "https://www.baidu.com"
# 将'User-Agent'伪造得与浏览器相似
my_header = {'User-Agent':'Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11'}
# 未填入的参数会以默认值填写
my_request = urllib.request.Request(my_url, headers=my_header)
print(urllib.request.urlopen(my_request).read())
# 成功返回结果
urllib.parse
——解析URL序列化与反序列化:
序列化是将对象转为字节序列的过程;
反序列化是将字节序列转为对象的过程。
序列化的好处是可以将对象持久化地存储,便于其在网络中的传输并降低程序的维护成本。
# urllib.parse用来解析url
import urllib.parse
使用urllib.parse
中的urlencode()
等来实现序列化
import urllib.parse
# 一个字典对象,不方便我们在网络中对其进行传输
get_para = {"a":97, "b":"B"}
# 将上述字典对象序列化,转为字符串
url_get=urllib.parse.urlencode(get_para)
print(url_get)
# a=97&b=B
使用urllib.parse
中的urlparse()
、parse_qs()
、parse_qsl()
,urlsplit()
等来实现反序列化
import urllib.parse
my_url = "https://www.abc.com/def.php?id=2"
print(urllib.parse.urlparse(my_url))
# urlparse()返回一个具名元组ParseResult
# ParseResult(scheme='https', netloc='www.xxx.com', path='/abc.php', params='', query='id=2', fragment='')
print(urllib.parse.parse_qs(my_url))
# parse_qs()返回一个字典
# {'https://www.abc.com/def.php?id': ['2']}
print(urllib.parse.parse_qsl(my_url))
# parse_qsl()返回一个列表
# [('https://www.abc.com/def.php?id', '2')]
print(urllib.parse.urlsplit(my_url))
# urlsplit()和urlparse()类似,返回一个具名元组SplitResult,但没有params元素
# SplitResult(scheme='https', netloc='www.abc.com', path='/def.php', query='id=2', fragment='')
urllib.error
——展示请求异常的细节此模块为
urllib.request
所引发的异常定义了一个异常类URLError
:
URLError
是OSError
的一个子类,HTTPError
是URLError
的一个子类
# urllib.error来展示请求异常的细节
import urllib.error
URLError
适用于程序遇到问题时引发的异常,有一个特殊属性:
reason
:解释本次错误原因的字符串或异常实例HTTPError
适用于HTTP请求的异常,有三个特殊属性:
code
:HTTP状态码reason
:一个解释本次错误原因的字符串headers
:导致本次异常的HTTP请求对应的HTTP响应头import urllib.request
import urllib.error
my_url = "http://www.abc.com"
# 使用try...except...来捕获请求的异常
try:
# 一个请求
a_request = urllib.request.urlopen(my_url)
except urllib.error.HTTPError as err:
print("HTTP状态码:",err.code)
print("本次异常原因:",err.reason)
print("HTTP响应头:",err.headers)
urllib.robotsparser
robotparser
实现了一个用于分析robots.txt
文件格式的解析器, 它含有一个检查给定用户代理是否可以访问给定资源的函数。它的目的是给那些品行端正的爬虫用的,或用来指导需要节流,否则就会被限制访问的其他抓取器。更多内容请访问:https://learnku.com/docs/pymotw/urllibrobotparser-internet-spider-access-control/3434#ed7f1a
urllib
分别构造GET
和构造POST
请求GET
# 只需要在目标url之后添加数据即可
# (将要传输的内容写在字典中,序列化后与原url和?进行拼接)
import urllib.request
import urllib.parse
my_url = "http://www.abc.com"
# get的内容用urllib.parse.urlencode()来将字典序列化能够嵌在url中的合法内容
url_get = urllib.parse.urlencode({'id':username})
full_url = my_url + "?" + url_get
# 此时相当于发送了一个"http://www.abc.com?id=username"
my_request = urllib.request.Request(full_url)
print(urllib.request.urlopen(my_request).read())
POST
# 通过Request类的data属性实现
# (将要传输的内容写入字典并序列化,最后将其编码为二进制后赋给Request类)
import urllib.request
import urllib.parse
my_url = "http://www.abc.com"
# 将含参数的字典序列化
my_data = urllib.parse.urlencode({"username":admin, "password":123465})
# 将序列化后的数据转为二进制格式
my_data_bin = bytes(my_data, encoding = "utf-8")
# 将二进制数据赋给Request.data
my_request = urllib.request.Request(my_url, data=my_data_bin)
print(urllib.request.urlopen(my_request).read())
总结:利用urllib模块(request、parse比较重要),可以很容易地利用Python来构造自定义请求或爬取简单的网页内容。