┱Python中关于urllib和urllib2的问题
python3对urllib和urllib2进行了重构
主要拆分成了:
1、urllib.request
1、urllib.request.Request(url, data=None, headers={}, method=None)
url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label' 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' } req = request.Request(url, headers=headers) page = request.urlopen(req).read() page = page.decode('utf-8')
用来包装头部的数据:
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
Connection:表示连接状态,记录Session的状态。
2、urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url:需要打开的网址urllib.request.urlopen('https://www.baidu.com/')
from urllib import request response = request.urlopen(r'http://python.org/') # <http.client.HTTPResponse object at 0x00000000048BC908> HTTPResponse类型 page = response.read() page = page.decode('utf-8')
#此处为何不用page.encode('utf-8')
#decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
#encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
urlopen返回对象提供方法:
read()#读取整个文件 ,
readline()#每次读取一行内容 ,
readlines()#读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存。
fileno()#方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作。
close() :关闭文件
info():返回HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
geturl():返回请求的url
data:post提交的数据
timeout:设置网站的访问超时时间
3、urllib.request.ProxyHandler()
data = { 'first': 'true', 'pn': 1, 'kd': 'Python' } 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') age = opener.open(url, data).read() page = page.decode('utf-8') return page
2、urllib.urlretrieve(url[, filename[, reporthook[, data]]]):
urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度。
def cbk(a, b, c): '''回调函数 @a: 已经下载的数据块 @b: 数据块的大小 @c: 远程文件的大小 ''' per = 100.0 * a * b / c if per > 100: per = 100 print ('%.2f%%' % per) url = 'http://www.sina.com.cn' local = 'd://sina.html' urllib.urlretrieve(url, local, cbk)
3、urllib.parse
1、urllib.parse.urlencode()#将提交的数据encode为byte编码
4、urllib.error等几个子模块。#抛出请求错误
import urllib from urllib import parse from urllib import request def get_page(url): 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' } data = { 'first': 'true', 'pn': 1, 'kd': 'Python' } data = parse.urlencode(data).encode('utf-8') req = request.Request(url, headers=headers) try: page = request.urlopen(req, data=data).read() page = page.decode('utf-8') print(page) except error.HTTPError as e: print(e.code()) print(e.read().decode('utf-8')) return page get_page('https://www.baidu.com/')