尽管现在Requests库十分好用,但是我还是觉的urllib和urllib2两个库肯定有其可取之处,所以专门学习记录一下。

为了学习python的两个模块可以搭建本地环境。我构建的如下:

python_test.php
<?php
    echo "You have send a request! <br>"
    if(isset($_POST['aa']))
    {
        $name = $_POST['aa'];
        echo $name;
    }
    if(isset($_GET['cc']))
    {
        $name = $_GET['cc'];
        echo $name;
    }
?>

发送请求后可以直接response.read(),判断是否发送成功,很方便。

urllib中的方法

urlopen(url[,data[,proxies]])
打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作。

url为发送请求的url。

data为POST的数据。

proxies为代理。

import urllib

req = urllib.urlopen("http://localhost/python_test.php")
data = req.read()
print data

执行可以看到

dikis@dikis-boom ~/code> python url.py

You have send a request!</br>

其他功能:

import urllib

######发送get请求#####

pragma = {'bb':'just for test!'}
pragma = urllib.urlencode(pragma)
req = urllib.urlopen("http://localhost/python_test.php?%s") %pragma
data = req.read()
print data

######发送POST请求####

pragma = {'aa':'just for test!'}
pragma = urllib.urlencode(pragma)
req = urllib.urlopen("http://localhost/python_test.php",pragma)
data = req.read()
print data

urlopen返回对象提供方法:

1.read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完全一样.

2.info():返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息.

3.geturl():返回请求的url.

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

urlretrieve方法直接将远程数据下载到本地。

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

数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。

参数data指post到服务器的数据。

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

测试代码:

import urllib

def cbk(a, b, c):
‘’‘ 
回调函数
a: 已经下载的数据块
b: 数据块的大小
c: 远程文件的大小
'''
per = 100.0 * a * b / c
if per > 100:
    per = 100
print '%.2f %%' % per

url = 'http://localhost/python_test.php'
local = '/tmp/test.html'
testfile = urllib.urlretrieve(url, local, cbk)
print testfile[0]
print testfile[1]

执行结果:

dikis@dikis-boom ~/code> python url.py 
0.00 %
100.00 %
/tmp/test.html
Date: Wed, 18 Nov 2015 00:25:47 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Content-Length: 31
Connection: close
Content-Type: text/html

该功能在写爬虫爬取一些网页(如:乌云知识库)到本地的时候很有用。

urllib.urlcleanup()

清除由于urllib.urlretrieve()所产生的缓存。

urllib.quote(url)和urllib.quote_plus(url)

将url数据获取之后,并将其编码,从而适用与URL字符串中,使其能被打印和被web服务器接受。

>>> urllib.quote('http://www.baidu.com')
'http%3A//www.baidu.com'
>>> urllib.quote_plus('http://www.baidu.com')
'http%3A%2F%2Fwww.baidu.com'

urllib.urlencode(query[, doseq])

将dict或者包含两个元素的元组列表转换成url参数。例如 字典{‘name’: ‘dark-bull’, ‘age’: 200}将被转换为”name=dark-bull&age=200。

urllib2_mode

urllib2.request and urllib2.addheader

urllib2模块和urllib模块相比增加了在请求中增加请求头的功能,示例代码如下:

import urllib
import urllib2
url = "http://baidu.com"
headers ={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0"}
data = {"username":"aaa","password":"bbb"}
data = urllib.urlencode(data)
req = urllib2.Request(url,data,headers)
response = urllib2.urlopen(req)

不难看出其中调用urllib模块的目的是为了将传递的参数进行urlcode。urllib2也可以发送post包和get包,使用方式已经在上述示例中写出。

还有一些没有总结.... 剩下的等我期末考完放假在更新吧...