python3将python2的urllib和urllib2库整合为一个urllib库,由于近期用到了这个库就参考官方文档和网上的资料总结了一下
导入
import urllib
urllib.request
urllib.request.urlopen()
发起一个请求
response = urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
# url 要打开的网址,可以是字符串或者是request对象
# data 要发送给服务器的数据(POST方法)
# timeout 网站的访问超时时间,单位为s
# cafile和capath 用于HTTPS请求中,设置CA证书及其路径
返回对象提供的方法
-
read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作
-
info():返回HTTPMessage对象,表示远程服务器返回的头信息
-
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
-
geturl():返回请求的url
返回对象的属性
对于HTTP 和 HTTPS请求
- status 返回状态码
- reason 返回状态的详细信息
urllib.request.Request()
使用该方法来返回一个request对象
request = urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
# url 包含网址的字符串
# data 要发送给服务器的数据对象,对于POST请求,要通过urllib.parse.urlencode() 方法进行编码
# header 头部信息,必须为字典类型
# method 请求方法,如果data为None则为GET,否则为POST
头部信息示例
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
-
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
-
Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
-
Connection:表示连接状态,记录Session的状态。
也可以通过返回的request对象的 add_header(key, val) 方法来添加header信息
request.add_header('Origin', 'https://passport.weibo.cn')
request.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
request.add_header('Referer', 'https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F')
urllib.request.ProxyHandler()
使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。使用代理服务器。 (使用代理服务器去爬取某个网站的内容的时候,在对方的网站上,显示的不是我们真实的IP地址,而是代理服务器的IP地址)
urllib.request.ProxyHandler(proxies=None)
data = {
'name': 'zjw',
'age': 23,
'gender': 'male'
}
proxy = request.ProxyHandler({'http': '5.22.195.215:80'}) # 设置proxy
opener = request.build_opener(proxy) # 挂载opener
request.install_opener(opener) # 安装opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
page = page.decode('utf-8')
return page
urllib.request.urlretrieve()
将远程数据下载到本地,例如下载图片
urllib.request.urlretrieve(url, filename=None, reporthook=None, data=None)
#返回由文件名及头部信息组成的元组(filename, headers)
#url 远程数据的地址
#filename 保存文件的路径,如果为空,则下载为临时文件
#reporthook 钩子函数 连接服务器成功以及每个数据块下载完成时各调用一次,包含3个参数,依次为已经下载的数据块,数据块的大小,总文件的大小,可用于显示下载进度
#data post到服务器的数据
urllib.parse
urllib.parse.urlencode()
将包含字符串或字节内容的映射对象或二维元组序列转换为ASCII文本字符
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)
其转换结果用于POST操作时,还需将其编码为字节
data = {
'name': 'zjw',
'age': 23,
'gender': 'male'
}
data = urllib.parse.urlencode(data).encode('utf-8')
#经编码后结果为 b'name=zjw&age=23&gender=male'
#返回结果需解码
response = request.urlopen(url, data=data).read().decode('utf-8')
urllib.parse.parse_qs()
将返回的query字符串转换为字典
urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
# 例如 {b'name':[b'zjw'],b'age':[b'23'],b'gender':[b'male']}
urllib.parse.parse_qsl()
将返回的query字符串转换为包含二维元组的列表
urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace')
# 例如 [(b'name',b'zjw'),(b'age',b'23'),(b'gender',b'male')]
urllib.error
错误:
-
urllib.error.URLError
-
urllib.error.HTTPError
-
urllib.error.ContentTooShortError
当urlretrieve()方法下载数据的大小小于实际期望值时触发该错误
处理:
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request('http://www.python.org/')
try:
response = urlopen(req)
except HTTPError as e:
print('The (www.python.org)server could not fulfill the request.')
print('Error code: ', e.code)
except URLError as e:
print('We failed to reach a server.')
print('Reason: ', e.reason)
else:
print("good!")
print(response.read().decode("utf8"))