Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1955130
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: Python/Ruby

2013-09-20 18:08:15

urlparse 和 urllib是非常好用的解析URL,并且下载页面的Python模块。下面对他们进行简单介绍

1. URL解析模块 urlparse


通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件,之后,还能将这些元件重新组装成一个URL。当我们处理HTML 文档的时候,这项功能是非常方便的。

1.1 urlparse.urlparse 函数

此函数会将一个url字符串分解为6个元素,以元祖的形式返回。有的元素可能为空,例:
  1. >>> from urlparse import urlparse
  2. >>> o = urlparse('http://www.cwi.nl:80/%7Eguido/Python.html')
  3. >>> o
  4. ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
  5.             params='', query='', fragment='')
  6. >>> o.scheme
  7. 'http'
  8. >>> o.port
  9. 80
  10. >>> o.geturl()
  11. 'http://www.cwi.nl:80/%7Eguido/Python.html'
详细的返回值信息:
Attribute Index Value Value if not present
scheme 0 URL scheme specifier empty string
netloc 1 Network location part empty string
path 2 Hierarchical path empty string
params 3 Parameters for last path element empty string
query 4 Query component empty string
fragment 5 Fragment identifier empty string
username   User name None
password   Password None
hostname   Host name (lower case) None
port   Port number as integer, if present None
需要注意的是,传入的URL开头必须要有双斜杠//,否则会被认为是相对路径

1.2 urlparse.urlunparse 函数

此函数作用是把urlparse()分解的元素再拼合还原为一个url,它接收元组(scheme, netloc, path, parameters, query, fragment)后,会重新组成一个具有正确格式的URL,以便供Python的其他HTML解析模块使用。

1.3 urlparse.urlsplit 函数

类似urlparse 函数,不过它的返回列表里面不高括params

1.4 urlparse.urlunsplit 函数

urlparse.urlsplit 对应,合成URL

1.5 urlparse.urljoin 函数

作用是将一个url替换为另一个url,例:
  1. >>> from urlparse import urljoin
  2. >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
  3. 'http://www.cwi.nl/%7Eguido/FAQ.html'

2. 获取html页面模块urllib


Python所带的urllib和urllib2这两个模块为我们提供了从URL打开并获取数据的功能。

若要通过urllib模块中的urlopen(url [,data])函数打开一个HTML文档,必须提供该文档的URL地址,包括文件名。函数urlopen不仅可以打开位于远程web服务器上的文件,而 且可以打开一个本地文件,并返回一个类似文件的对象,我们可以通过该对象从HTML文档中读出数据。 
 
一旦打开了HTML文档,我们就可以像使用常规文件一样使用read([nbytes])、readline()和readlines()函数来对文件进行读操作。若要读取整个HTML文档的内容的话,您可以使用read()函数,该函数将文件内容作为字符串返回。

打开一个地址之后,您可以使用geturl()函数取得被获取网页的真正的URL。这是很有用的,因为urlopen(或使用的opener对象)也许会伴随一个重定向。获取的网页URL也许和要求的网页URL不一样。

另一个常用的函数是位于从urlopen返回的类文件对象中的info()函数,这个函数可以返回URL位置有关的元数据,比如内容长度、内容类型,等等。

  1. import urllib2

  2. def get_html(url):
  3.     html = urllib2.urlopen(url).read()
  4.     return html

2.1 POST方式请求页面

  1. import urllib2, urllib

  2. data = {'name' : 'www', 'password' : '123456'} # or [('name','www'),('password','123456'),('item',1),('item',2)] 重复字段
  3. f = urllib2.urlopen(
  4.         url = 'http://www.ideawu.net/',
  5.         data = urllib.urlencode(data)
  6.         )
  7. print f.read()

2.2 使用Cookie的情况

  1. import urllib2

  2. cookies = urllib2.HTTPCookieProcessor()
  3. opener = urllib2.build_opener(cookies)

  4. f = opener.open('http://www.ideawu.net/?act=login&name=user01')

  5. data = 'Hello'
  6. request = urllib2.Request(
  7.         url = 'http://www.ideawu.net/?act=send',
  8.         headers = {'Content-Type' : 'text/xml'},
  9.         data = data)

  10. opener.open(request)
第一次 open() 是进行登录. 服务器返回的 Cookie 被自动保存在 cookies 中, 被用在后来的请求.
第二次 open() 用 POST 方法向服务器发送了 Content-Type=text/xml 的数据. 如果你不创建一个 Request, 而是直接使用 urlopen() 方法, Python 强制把 Content-Type 改为 application/x-www-form-urlencoded.

另一个例子:
  1. #! /usr/bin/python
  2. import urllib,urllib2,httplib,cookielib
  3. def auto_login_hi(url,name,pwd):
  4.     url_hi="http://yoursite/login.php"
  5.     cookiejar=cookielib.CookieJar()
  6.     cj=urllib2.HTTPCookieProcessor(cookiejar)
  7.     opener=urllib2.build_opener(cj)

  8.     data = {
  9.         'username':name,
  10.         'password':pwd}

  11.     headers = {'Connection': 'keep-alive',
  12.         'Adf-Ads-Page-Id': '2',
  13.         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
  14.         'Adf-Rich-Message': 'true',
  15.         'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
  16.         'Accept-Encoding': 'gzip, deflate',
  17.         'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6'}


  18.     postdata=urllib.urlencode(data)
  19. # request=urllib2.Request(url_hi,postdata,headers=headers)
  20.     request=urllib2.Request(url_hi,postdata)

  21.     f=opener.open(request)

  22.     print f.read()
  23.     print "\n\n\n\n"

  24.     if not 'id' in [cookie.name for cookie in cookiejar]:
  25.         pass;
  26. # raise ValueError, "Login failed with login=%s, password=%s" % (name,pwd)

  27.     print cookiejar
  28.     for value in cookiejar:
  29.         print value ,"\n";

  30.     for value in [cookie.name for cookie in cookiejar]:
  31.         print value ,"\n";

  32.     f=opener.open(url)
  33.     print f.read()

  34. if __name__=='__main__':
  35.     name='yourname'
  36.     password='yourpassword'
  37.     url='http://yoursite/search.php'
  38.     auto_login_hi(url,name,password)

详细的介绍也可以参考这个网页http://zhuoqiang.me/python-urllib2-usage.html,里面包括超时时间的设置方法等。
阅读(8605) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~