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()) #打印响应