urllib
1.简介:
urllib 模块是python的最基础的爬虫模块,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象。urllib 支持各种 web 协议,例如:HTTP、FTP、Gopher;同时也支持对本地文件进行访问。但一般而言多用来进行爬虫的编写。
2.方法/属性:
3.常用的方法/属性解析:
urllib.urlopen(url[, data[, proxies[, context]]]):打开网页
创建一个表示远程url的类文件对象,然后像本地文件一样操作这个类文件对象来获取远程数据。参数url表示远程数据的路径,一般是网址;参数data表示以post方式提交到url的数据(玩过web的人应该知道提交数据的两种方式:post与get。如果你不清楚,也不必太在意,一般情况下很少用到这个参数);参数proxies用于设置代理(这里不详细讲怎么使用代理,感兴趣的看客可以去翻阅Python手册urllib模块)。urlopen返回 一个类文件对象(前面说过的,不再赘述)
- url : 一个完整的远程资源路径,一般都是一个网站,比如前面用到的http://www.baidu.com。(注意,要包含协议头,例如:http://www.baidu.com/,此处的 http:// 不能省略), 如果该URL没有指明协议类型,或者其协议标识符,则该函数会打开本地文件。如果无法打开远程地址,则会触发IOError异常。
- data :是一个可选的参数,如果使用的是 http:// 协议,用于指定一个 POST 请求(默认使用的是 GET 方法)。这个参数必须使用标准的 application/x-www-form-urlencoded 格式。可以使用 urlencode() 方法来快速生成。
- proxies : 设置代理,详细的参照官方文档
最常用的方法已经说过,带data参数这里暂时不解析,见下一篇博文urllib2模块
urllib.urlretrieve(url[, filename[, reporthook[, data]]]):下载数据
urlretrieve方法直接将远程数据下载到本地。参数filename指定了保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据);参数reporthook是一个回调函数,当连接上服务器、以及相应的数据块传输完毕的时候会触发该回调。我们可以利用这个回调函 数来显示当前的下载进度,下面的例子会展示。参数data指post到服务器的数据。该方法返回一个包含两个元素的元组(filename, headers),filename表示保存到本地的路径,header表示服务器的响应头。下面通过例子来演示一下这个方法的使用,这个例子将新浪首页的html抓取到本地,保存在D:/sina.html文件中,同时显示下载的进度
- url : 目标 url 。
- filename : 下载到本地后保存的文件名, 可以是决对路径或相对路径形式。如果没有给,将缓存到一个临时文件夹中。
- reporthook:一个回调函数,方法会在连接建立时和下载完成时调用这个函数。同时会向函数传递三个参数:1.目前为止下载了多少数据块;2.数据块的大小(单位是字节);3.文件的总大小;
- data:一个可选的参数(同上面的data)
这个其实很少用,并且还要定义一个回调函数,用到的时候再做解析吧。
urllib.urlcleanup():清楚urllib.urlretrieve()的缓存
urllib.quote(string[, safe]):对字符串进行编码,参数safe指定了不需要编码的字符。
url中是不能出现一些特殊的符号的,有些符号有特殊的用途。我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有’=’,因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据
例:
urllib.quote_plus(string[, safe]):同urllib.quote(),唯一区别是会把空格转为【+】,而quote()用’%20’来代替空格
urllib.unquote(string):对字符串进行解码,urllib.quote()的逆操作
注意:这里要说一下,由于python2默认编码是ASCII,所以对中文解码就是这样的,这不是一个问题,姑且不管吧,后面写爬虫还会遇到很多
urllib.unquote_plus(string):对字符串进行解码,urllib.quote_plus()的逆操作,类似quote()
urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url请求参数
例:
注意:一旦urlopen设置的 data,就意味使用 POST 请求,如果要使用 GET 请求,请在 url 的后面加上?号才能把数据放进去
GET
import urllib dict1= urllib.urlencode({'x': 1, 'y': 2, 'z': 3}) html= urllib.urlopen("http://www.baidu.com?%s" %dict1) print html.read()
POST
import urllib dict1= urllib.urlencode({'x': 1, 'y': 2, 'z': 3}) html= urllib.urlopen("http://www.baidu.com", dict1) print html.read()
urllib.pathname2url(path):将本地路径转换成url路径
urllib.url2pathname(path):将url路径转换成本地路径