Urllib简介
Urllib是Python自带的标准库,无须安装,直接引用即可。Url通常用于爬虫开发、API数据获取和测试。
在Python3中,Urllib模块是一堆可以处理URL的组件集合,就是将Urllib和Urllib2合并在一起使用,并且命名为Urllib.
- urllib.request: 用于打开和读取URL
- urlib.error: 包含提出的例外urllib.request
- urlib.parse: 用于解析URL
- urllib.robotparse: 用于解析robots.txt文件
发送请求
urllib.request.urlopen常用的参数有url、data、和timeout
urllib.request.Request(url, data=None, header={}, method=None)
- url:完整的url格式
- data: 请求参数
- headers: 设置request请求头信息
- method: 设定请求方式,主要是POST和GET方式
import urllib.request
#url, data: 默认值为None,代表请求方式为GET,timeout: 超时设置
# response = urllib.request.urlopen('https://movie.douban.com/'', None, 2)
#若这样,不设置请求头,将出现反爬虫,出错:HTTP Error 418
#设置请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Referer': 'https://movie.douban.com/',
'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode('utf8')
f = open('html.txt', 'w', encoding='utf8')
f.write(html)
f.close()
代理IP
以本机先访问代理IP,再通过代理IP地址访问互联网,这样网站(服务器)接收到的访问IP就是代理IP地址。
import urllib.request
url = 'http://movie.douban.com/'
#设置代理IP
proxy_handler = urllib.request.ProxyHandler({'http': 'http://114.99.7.122:8752', 'https': 'http://114.99.7.122:8752'})
# 必须使用build_opener()函数来创建带有代理IP功能的opener对象
opener = urllib.request.build_opener(proxy_handler)
response = opener.open(url)
html = response.read().decode('utf-8')
f = open('htmlip.txt', 'w', encoding='utf8')
f.write(html)
f.close()
使用Cookies
Cookies主要用于获取用户登录信息,比如,通过提交数据实现用户登录之后,会生成带有登录状态的Cookies,这时可以将Cookies保存在本地文件中,下次程序运行的时候,可以直接读取Cookies文件来实现用户登录。特别对于一些复杂的登录,如验证码、手机短信验证登录这类网站,使用Cookies能简单解决重复登录的问题。
Urllib提供HTTPCookieProcessor()对Cookies操作。但Cookies的读写是由MozillaCookieJar()完成的。
#方法一
import urllib.request
from http import cookiejar
filename = 'cookie2.txt'
#MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar(filename)
#HTTPCoolieProcessor创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#创建请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Referer': 'https://movie.douban.com/',
'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)
#创建自定义opener
opener = urllib.request.build_opener(handler)
#open方法打开网页
response = opener.open(req)
#保存cookie文件
cookie.save(ignore_discard=True, ignore_expires=True)
#方法二
import urllib.request
from http import cookiejar
filename = 'cookie2.txt'
#MozillaCookieJar保存cookie
cookie = cookiejar.MozillaCookieJar()
#读取cookie内容到变量
cookie.load(filename, ignore_discard=True, ignore_expires=True)
#HTTPCoolieProcessor创建cookie处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#创建请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Referer': 'https://movie.douban.com/',
'Connection': 'keep-alive'}
req = urllib.request.Request('https://movie.douban.com/', headers=headers)
#创建自定义opener
opener = urllib.request.build_opener(handler)
#open方法打开网页
response = opener.open(req)
#输出结果
# print(cookie.extract_cookies)
# dir(cookie)
print(cookie)
<MozillaCookieJar[<Cookie bid=iBQYHURt1FY for .douban.com/>, <Cookie ll="118220" for .douban.com/>]>
证书验证
当遇到一些特殊的网站时,在浏览器上会显示连接不是私密连接而导致无法浏览该网页。
这里补充一个知识点,CA证书也叫SSL证书,是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。
SSL证书就是遵守SSL协议,由受信任的数字证书机构颁发CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
SSL证书在客户端浏览器和Web服务器之间建立一条SSL安全通道(Secure Socket Layer, SSL),安全协议是由Netscape Communicaton公司设计开发的。该安全协议主要用来提供对用户和服务器的认证,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
一些特殊的网站会使用自己的证书,如12306首页提示下载安装根证书,这是为了确保网站的数据在传输过程中的安全性。在讲述urllib.request.urlopen的时候,urlopen带有cafile、capath和cadefault参数,可以用于设置用户的CA证书。
遇到这类验证证书的网站,最简单而暴力的方法是直接关闭证书验证,可以在代码中引入SSL模块,设置关闭证书验证即可。
import urllib.request
import ssl
#关闭证书验证
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://kyfw.12306.cn/otn/leftTicket/init'
respose = urllib.request.urlopen(url)
#输出状态码
print(response.getcode())
#200 成功处理了请求,一般情况下都是返回此状态码;
200
数据处理
urllib.request.urlopen()方法是不区分请求方式的,识别请求方式主要通过参数data是否为None。如果向服务器发送POST请求,那么参数data需要使用urllib.parse对参数内容进行处理。
Urllib在请求访问服务器的时候,如果发生数据传递,就需要对内容进行编码处理,将包含str或bytes对象的两个元素元祖序列转换为百分比编码的ASCII文本字符串。如果字符串要用作POST,那么它应该被编码为字节,否则会导致TypeError错误。
urllib发送POST请求的方法如下:
import urllib.request
import urllib.parse
url = 'https://movie.douban.com'
data = {'value': 'true',}
#数据处理
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
'Referer': 'https://movie.douban.com',
'connection': 'keep-alive'}
req = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(req, data=data)
#urlencode()的作用只是对请求参数做数据格式转换处理。
#Urllib还提供quote()和unquote()对URL编码处理。
import urllib.parse
url = '%2523%25E7%25BC%2596%25E7%25A8%258B%2523'
#第一次解码
first = urllib.parse.unquote(url)
print(first)
#第二次解码
second = urllib.parse.unquote(first)
print(second)
#可使用quote()对数据进行编码处理。quote()和unquote()的作用是解决参数中含有中文内容的问题
%23%E7%BC%96%E7%A8%8B%23
#编程#
总结
Urllib通常用于爬虫开发和API(应用程序编程接口)数据获取和测试
- urllib.request.urlopen: urllib最基本的使用功能,用于访问URL(请求链接)的唯一方法。
- urllib.request.Request: 声明request对象,该对象可自定义请求头(header)、请求方式等信息。
- urllib.request.ProxyHandler: 动态设置代理IP池,可加载请求对象。
- urllib.request.HTTPCookieProcessor: 设置Cookies对象,可加载请求对象。
- urllib.request.build_opener(): 创建请求对象,用于代理IP和Cookies对象加载。
- urllib.parse.urlencode(data).encode(‘utf-8’): 请求数据格式转换。
- urllib.parse.quote(url): URL编码处理,主要对URL上的中文等特殊符号编码处理。
- urllib.parse.unquote(url): URL解码处理,将URL上的特殊符号还原。
除了Urllib之外,一些特殊请求需要结合其他模块配合使用,如Cookies读写由HTTP模块完成,关闭证书验证需要SSL模块设置,等等。