码迷,mamicode.com
首页 > Web开发 > 详细

urllib模块

时间:2016-06-12 00:07:46      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:

  urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象。urllib 支持各种 web 协议,例如:HTTP、FTP、Gopher;同时也支持对本地文件进行访问。但一般而言多用来进行爬虫的编写,而下面的内容也是围绕着如何使用 urllib 库去编写简单的爬虫。另外,如果要爬取 js 动态生成的东西, 如 js 动态加载的图片,还需要一些高级的技巧,这里的例子都是针对于静态的 html 网页的。

  下面的说明都是针对于 python2.7 版本而言的,版本间存在差距,具体参考官方手册。

  首先,如果我需要写一个爬虫,去爬取一个网站的图片的话,可以分为以下几步:

技术分享

  当然,你也可以将爬到的数据进行各种处理分析,例如你可以写一个比价网站,去各种网站获取报价,然后整合到一起。所以,将上面的布置拓展到所有的爬虫后:

技术分享

  下面我们按照这个通用的布置,学习每一步都应该怎么做。

 


1.打开目标网站

 urllib.urlopen(url[, data[, proxies[, context]]]) 

  去远程请求响应的 url,并返回一个类文件对象。(注意,此处已经发起了远程请求,也就是进行了联网操作,有数量流量)

  url :  一个完整的远程资源路径,一般是一个网站。(注意,要包含协议头,例如:http://www.baidu.com/,此处的 http:// 不能省略)

      如果该URL没有指明协议类型,或者其协议标识符为file:,则该函数会打开本地文件。如果无法打开远程地址,将触发 IOError 异常。

  data : 如果使用的是 http:// 协议,这是一个可选的参数,用于指定一个 POST 请求(默认使用的是 GET 方法)。这个参数必须使用标准的 application/x-www-form-urlencoded 格式。我们可以使用  urlencode() 方法来快速生成。

  proxies : 设置代理,有需要的参照官方文档。下面给出官网的例子:

技术分享
# Use http://www.someproxy.com:3128 for HTTP proxying
proxies = {‘http‘: ‘http://www.someproxy.com:3128‘}
filehandle = urllib.urlopen(some_url, proxies=proxies)
# Don‘t use any proxies
filehandle = urllib.urlopen(some_url, proxies={})
# Use proxies from environment - both versions are equivalent
filehandle = urllib.urlopen(some_url, proxies=None)
filehandle = urllib.urlopen(some_url)
技术分享

 

  context :  在用 HTTPS 连接时,这个参数要设置为  ssl.SSLContext 的实例,用于配置 SSL 。

  一般而言,我们只需要设置 url 参数就可以了。

  例如:

f = urllib.urlopen(‘http://www.baidu.com/‘)

 

  这样我能就能够得到一个类文件对象了,然后就可以对这个类文件对象进行各种读取操作了。

 


2.操作类文件对象

  下面的方法和文件操作中的一致,下面列举出来,详情请参考我在python文件操作中的解释:

1. read([size]) -> read at most size bytes, returned as a string. 

  读取整个文件,将读取结果返回一个字符串对象

2. readline([size]) -> next line from the file, as a string. 

  读取一行,将读取结果返回一个字符串对象

3. readlines([size]) -> list of strings, each a line from the file. 

  读取整个文件,将每一行封装成列表中的元素,返回一个列表。

4. readinto() -> Undocumented. Don‘t use this; it may go away. 

  一个可以无视的将要废弃的方法

5. close() -> None or (perhaps) an integer. Close the file. 

  关闭文件,返回None或者一个表示关闭状态的整数。

 

另外:也可以和文件对象一样直接进行迭代操作。

 

除了以上和文件操作中用法一样的方法之外,还有以下特殊的方法:

1. info() 

  返回文件信息,对于 http 协议来说,返回的是响应报文中的报文头。

例子:

f = urllib.urlopen(‘http://www.so.com/‘)
print f.info()

 

技术分享

 

2. geturl() 

  返回当前页面的真正的 url ,针对于网站服务器在进行重定向以后,我们可以用它来获取重定向后的页面。

 

3. getcode() 

  返回当前请求的状态码,如成功请求的状态码就是 200 。如果不是使用 http 协议打开的,就返回 None。

 


 

3.操作读取后的网页源码

  这个部分就和文件操作一样了,但多数情况下会和 re 模块配合起来进行数据筛选,例如:

f = urllib.urlopen(‘http://www.baidu.com/‘)
b = f.read()
p = re.compile(r‘<img.*?src="//(.*?\.(?:jpg|gif|png))".*?>‘, re.I)
result = p.findall(b)
print result

 

 技术分享

  尝试在百度的首页爬取图片的地址,当然还有很多改进的地方,这里中做演示用。

  关于python中的正则 re 模块的使用这里就不再重复了。

 


 

4.下载相应资源

  在我们通过正则筛选出我们相要的图片的 url 之后,就可以开始下载了,在 urllib 中提供了相应的下载函数。

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

  将给定的 url 下载为本地文件,如果 url 指向的是本地的文件,或者是一个有效的缓存对象,那么将不会下载(注意,这里的存在是指下载的目录里有相同的文件了)。返回一个元祖(filename, headers),其中filename值的是本地保存的文件名,header指的是上面 info() 方法返回的对象。

  url : 目标 url 。

  filename : 下载到本地后保存的文件名, 可以是决对路径或相对路径形式。如果没有给,将缓存到一个临时文件夹中。

  reporthook:一个回调函数,方法会在连接建立时和下载完成时调用这个函数。同时会向函数传递三个参数:1.目前为止下载了多少数据块;2.数据块的大小(单位是字节);3.文件的总大小;

  data:如果使用的是 http:// 协议,这是一个可选的参数,用于指定一个 POST 请求(默认使用的是 GET 方法)。这个参数必须使用标准的 application/x-www-form-urlencoded 格式。我们可以使用 urlencode()来快速生成。

 

2. urllib.urlcleanup() 

  Clear the cache that may have been built up by previous calls to urlretrieve().

  清除先前由 urlretrieve() 建立的缓存

 

 


其他常用模块内置方法:

1. urllib.quote(string[, safe]) 

  将 string 编码成 url 格式,safe 指定不受影响的字符(默认 safe=‘/‘)。

  因为 url 的编码和我们常用的 ASCII 并不同,例如我们常用的空格在 ASCII 中: ‘scolia good‘ 直接现实一个空白字符,而在 url 中: ‘scolia%20good‘ ,原本的空白字符变成了 %20 。

  其转换规则为:

    逗号,下划线,句号,斜线和字母数字这类符号是不需要转化。其他的则均需要转换。另外, 那些不被允许的字符前边会被加上百分号(%)同时转换成 16 进制,例如:“%xx”,“xx”代表这个字母的 ASCII 码的十六进制值

例子:

f = urllib.quote(‘scolia good‘)
print f

 

技术分享

 

2. urllib.quote_plus(string[, safe]) 

  和上面的几乎一样,只是不转换空白字符,而将其用 + 号替换。

例子:

f = urllib.quote_plus(‘scolia good‘)
print f

 

技术分享

 

3. urllib.unquote(string) 

  将 url 重新转码回去,是上面操作的urllib.quote(string[, safe])逆运算。

4. unquote_plus(string) 

  同上,是urllib.quote_plus(string[, safe])的逆运算。

 

5. urllib.urlencode(query[, doseq]) 

   将一个python的字典快速转换为一个请求的格式,用于上面的 data 属性。

例子:

aDict = {‘name‘: ‘Georgina Garcia‘, ‘hmdir‘: ‘~ggarcia‘}
print urllib.urlencode(aDict)

 

技术分享

  这里注意:一旦设置的 data,就意味使用 POST 请求,如果要使用 GET 请求,请在 url 的后面加上 ? 号,再将转换好的数据放进去。

例如:

GET方法:

import urllib
params = urllib.urlencode({‘spam‘: 1, ‘eggs‘: 2, ‘bacon‘: 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
print f.read()

POST方法:

import urllib
params = urllib.urlencode({‘spam‘: 1, ‘eggs‘: 2, ‘bacon‘: 0})
f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
print f.read()

 

6. urllib.pathname2url(path) 

  将本地路径名转换成 url 风格的路径名,这不会产生一个完整的URL,而且得到的结果已经调用了 quote() 方法进行了处理。

例子:

a = r‘d:\abc\def\123.txt‘
print urllib.pathname2url(a)

 

技术分享

7. urllib.url2pathname(path) 

  将 url 风格的路径转换为本地路径风格,是上面方法的逆运算。

a = r‘www.xxx.com/12%203/321/‘
print urllib.url2pathname(a)

 

技术分享

  同样的调用了 quote() 方法进行了处理

 


 

 

其他的内容请参考官方文档:https://docs.python.org/2/library/urllib.html

 

 
分类: python模块

urllib模块

标签:

原文地址:http://www.cnblogs.com/Leo_wl/p/5576149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!