python3.4以后中,将urllib2、urlparse、robotparser并入了urllib模块,并且修改了urllib模块,其中包含了5个子模块:

urllib.parse、urllib.request、urllib.response、urllib.error、urllib.robotparser

本文主要为了区分python2中使用urllib2 + urllib 和 python3中使用urllib的一些差别

一、urlretrieve 方法可以直接将远程数据下载到本地

Python2:

urllib.urlretrieve(url[, filename[, reporthook[, data]]])

python3:

urllib.request.urlretrieve(url[, filename[, reporthook[, data]]])

参数说明:


    url:外部或者本地url



    filename:指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);



    reporthook:是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函数来显示    当前的下载进度。



    data:指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表    示服务器的响应头。

二、Request 请求(包含post表单,设置headers、proxy)

正常情况下,我们使用默认opener:urlopen,但是urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()(可以用于让python    程序模拟浏览器进行访问)函数创建自定义Opener对象。build_opener ()返回的对象具有open()方法,与urlopen()函数的功能相同

      handler用于处理URL,例如HTTP重定向、HTTP cookies等。如果你希望创建一个特定的openers,例如获取一个能处理cookie的opener,或者获取一个不重定向的opener,就需要用到自定义handler,常用的Handler实例有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。 

     使用install_opener方法之后,会将程序默认的urlopen方法替换掉。也就是说,如果使用install_opener之后,在该文件中,再次调用urlopen会使用自己创建好的opener。如果不想替换掉,只是想临时使用一下,可以使用opener.open(url),这样就不会对程序默认的urlopen有影响。

     python2:

import urllib2
import urllib

url = r'https://www.baidu.com/'
headers = {'User-Agent': 'Mozilla/4.0 (compatible;MSIE 5.5;Windows NT)'}
proxy = {"http":"http://some-proxy.com:8080"}
data = {'key1': 'value1'}
post_data = urllib.urlencode(post_data).encode('utf-8')      #urlencode 将字典转换为字符串

request = urllib2.Request(url, data=post_data, headers=headers)

proxy_handler = urllib2.ProxyHandler(proxy)
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
try:
    response = urllib2.urlopen(request)
    html = response.read()
except urllib2.HTTPError, e:
    print e
except urllib2.URLError, e:
    print e

    python3:

import urllib

url = r'https://www.baidu.com/'
headers = {'User-Agent': 'Mozilla/4.0 (compatible;MSIE 5.5;Windows NT)'}
proxy = {"http":"http://some-proxy.com:8080"}
data = {'key1': 'value1'}
post_data = urllib.parse.urlencode(data)

request = urllib.request.Request(url, data=post_data, headers=headers)

proxy_handler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
try:
    response = urllib.request.urlopen(request)
    html = response.read()
except urllib.error.HTTPError as e:
    print(e)
except urllib.error.URLError as e:
    print(e)

 三、cookie设置

python3

   将cookie写入文件:

import http.cookiejar as cookielib

cookie=cookielib.MozillaCookieJar('cookie.txt')  #声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
handler=urllib.request.HTTPCookieProcessor(cookie) #利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
opener = urllib.request.build_opener(handler)  #通过handler来构建opener
resphonse=opener.open('')  #创建一个请求,原理同urllib2的urlopen
cookie.save(ignore_discard=True, ignore_expires=True) #保存cookie文件

cookie.save的参数说明:

ignore_discard的意思是即使cookies将被丢弃也将它保存下来; 
           ignore_expires的意思是如果在该文件中cookies已经存在,则覆盖原文件写入。

读取cookie:

cookie=cookielib.MozillaCookieJar()  #声明一个MozillaCookieJar对象实例
cookie.load("cookie.txt",ignore_discard=True, ignore_expires=True) #从文件中读取cookie内容到变量
req=urllib.request.Request("") #创建请求的request
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))  #利用urllib2的build_opener方法创建一个opener
response=opener.open(req)  #使用包含了指定cookie的opener发起请求
print(resphonse.read())  #打印响应