┱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/')