当前位置:首页 > 联系方式 >

python之web模块学习-- urllib

作者:永年县聚联紧固件制造有限公司    发布时间:2017-09-05 12:08:01

python之web模块学习-- urllib 准备写一些列的 python之web模块学习,基本上涉及常用的的web模块,包括 urllib、urllib2、httplib、urlparse、requests,现在,开始我们的第一个模块的学习吧。

1 urllib简介

python urllib 模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取我们想要的数据。

2 常用方法

2.1 urlopen -- 创建一个类文件对象 为读取指定的URL

help(urllib.urlopen)

urlopen(url, data=None, proxies=None)

Create a file-like object for the specified URL to read from.

参数:

url :表示远程数据的路径,一般是http或者ftp路径。

data :表示以get或者post方式提交到url的数据。

proxies :表示用于代理的设置。

Python 通过urlopen函数来获取html数据,urlopen返回一个类文件对象,它提供了如下常用方法:

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

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

3)getcode():返回Http状态码,如果是http请求,200表示请求成功完成;404表示网址未找到。

4)geturl():返回请求的url地址。

附代码:

>>> import urllib >>> response = urllib.urlopen('') >>>res.read() 。。。。。。(一堆网页代码) >>>res.readline() '<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN""">\r\n' 。。。。 >>>res.readlines() 。。。(list形式的一堆网页代码) >>>res.info() <httplib.HTTPMessage instance at0x1a02638> >>> response.getcode() # 返回Http状态码 200 >>> response.geturl() # 返回请求的url地址 '' >>> response.close() # 最后别忘了关闭连接

urllib中还提供了一些辅助方法,用于对url进行编码、解码。url中是不能出现一些特殊的符号的,有些符号有特殊的用途。我们知道以get方式提交数据的时候,会在url中添加key=value这样的字符串,所以在value中是不允许有'=',因此要对其进行编码;与此同时服务器接收到这些参数的时候,要进行解码,还原成原始的数据。这个时候,这些辅助方法会很有用:

附带的其他方法:(主要是url编码解码)

- urllib.quote(string[, safe]):对字符串进行编码。参数safe指定了不需要编码的字符

- urllib.unquote(string) :对字符串进行解码

- urllib.quote_plus(string [ , safe ] ) :与urllib.quote类似,但这个方法用'+'来替换' ',而quote用'%20'来代替' '

- urllib.unquote_plus(string ) :对字符串进行解码

- urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'wklken', 'pwd':'123'}将被转换为"name=wklken&pwd=123" (常用)

#这里可以与urlopen结合以实现post方法和get方法

- urllib.pathname2url(path):将本地路径转换成url路径

- urllib.url2pathname(path):将url路径转换成本地路径

附代码:

>>> import urllib >>>res = urllib.quote('I am 51cto') >>> res 'I%20am%2051cto' >>>urllib.unquote(res) 'I am 51cto' >>>res = urllib.quote_plus('I am 51cto') >>> res 'I+am+51cto' >>>urllib.unquote_plus(res) 'I am 51cto' >>> params = {'name':'51cto','pwd':'51cto'} >>>urllib.urlencode(params) 'pwd=51cto&name=51cto' >>>l2u=urllib.pathname2url('E:\51cto') 'E%3A%29cto' >>>urllib.url2pathname(l2u) 'E:)cto'

2.2 urlretrieve -- 直接将远程的数据下载到本地

help(urllib.urlretrieve)

urlretrieve(url, filename=None,reporthook=None, data=None)

参数:

url :指定下载的URL

finename :指定了保存本地路径(如果参数未指定,urllib会生成一个临时文件保存数据。

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

data: 表示post到服务器的数据,该方法返回一个包含两个元素的(filename,headers)元组,

下面是一个 urlretrieve方法下载文件的实例,可以显示下载进度:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import urllib

import os

def schedule(a,b,c):

''' 回调函数

@a:已经下载的数据

@b:数据块的大小

@c:远程文件的大小

'''

per = 100.0 * a * b / c if per > 100: per = 100 print "%.2f%%" % per url = '' local = os.path.join('c:','Python-2.7.5.tar.bz2') urllib.urlretrieve(url,local,schedule) 2.3 urlcleanup -- 清除由于urllib.urlretrieve()所产生的缓存

通过上面的练习可以知道,urlopen可以轻松获取远端html页面信息,然后通过python正则对所需要的数据进行分析,匹配出想要用的数据,然后利用urlretrieve将数据下载到本地。对于访问受限或者对连接数有限制的远程url地址可以采用proxies(代理的方式)连接,如果远程数据量过大,单线程下载太慢的话可以采用多线程下载,这个就是传说中的爬虫。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:黄冈网站建设 http://huanggang.45qun.com

  • 上一篇:(libgdx学习)Net的使用
  • 下一篇:最后一页
  •