urlparse 和 urllib是非常好用的解析URL,并且下载页面的Python模块。下面对他们进行简单介绍
1. URL解析模块 urlparse
通过Python所带的urlparse模块,我们能够轻松地把URL分解成元件,之后,还能将这些元件重新组装成一个URL。当我们处理HTML 文档的时候,这项功能是非常方便的。
1.1 urlparse.urlparse 函数
此函数会将一个url字符串分解为6个元素,以元祖的形式返回。有的元素可能为空,例:
-
>>> from urlparse import urlparse
-
>>> o = urlparse('%7Eguido/Python.html')
-
>>> o
-
ParseResult(scheme='http', netloc='', path='/%7Eguido/Python.html',
-
params='', query='', fragment='')
-
>>> o.scheme
-
'http'
-
>>> o.port
-
80
-
>>> o.geturl()
-
'%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,例:
-
>>> from urlparse import urljoin
-
>>> urljoin('%7Eguido/Python.html', 'FAQ.html')
-
'%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位置有关的元数据,比如内容长度、内容类型,等等。
-
import urllib2
-
-
def get_html(url):
-
html = urllib2.urlopen(url).read()
-
return html
2.1 POST方式请求页面
-
import urllib2, urllib
-
-
data = {'name' : 'www', 'password' : '123456'} # or [('name','www'),('password','123456'),('item',1),('item',2)] 重复字段
-
f = urllib2.urlopen(
-
url = '',
-
data = urllib.urlencode(data)
-
)
-
print f.read()
2.2 使用Cookie的情况
-
import urllib2
-
-
cookies = urllib2.HTTPCookieProcessor()
-
opener = urllib2.build_opener(cookies)
-
-
f = opener.open('?act=login&name=user01')
-
-
data = 'Hello'
-
request = urllib2.Request(
-
url = '?act=send',
-
headers = {'Content-Type' : 'text/xml'},
-
data = data)
-
-
opener.open(request)
第一次 open() 是进行登录. 服务器返回的 Cookie 被自动保存在 cookies 中, 被用在后来的请求.
第二次 open() 用 POST 方法向服务器发送了 Content-Type=text/xml 的数据. 如果你不创建一个 Request, 而是直接使用 urlopen() 方法, Python 强制把 Content-Type 改为 application/x-www-form-urlencoded.
另一个例子:
-
#! /usr/bin/python
-
import urllib,urllib2,httplib,cookielib
-
def auto_login_hi(url,name,pwd):
-
url_hi=""
-
cookiejar=cookielib.CookieJar()
-
cj=urllib2.HTTPCookieProcessor(cookiejar)
-
opener=urllib2.build_opener(cj)
-
-
data = {
-
'username':name,
-
'password':pwd}
-
-
headers = {'Connection': 'keep-alive',
-
'Adf-Ads-Page-Id': '2',
-
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36',
-
'Adf-Rich-Message': 'true',
-
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
-
'Accept-Encoding': 'gzip, deflate',
-
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6'}
-
-
-
postdata=urllib.urlencode(data)
-
# request=urllib2.Request(url_hi,postdata,headers=headers)
-
request=urllib2.Request(url_hi,postdata)
-
-
f=opener.open(request)
-
-
print f.read()
-
print "\n\n\n\n"
-
-
if not 'id' in [cookie.name for cookie in cookiejar]:
-
pass;
-
# raise ValueError, "Login failed with login=%s, password=%s" % (name,pwd)
-
-
print cookiejar
-
for value in cookiejar:
-
print value ,"\n";
-
-
for value in [cookie.name for cookie in cookiejar]:
-
print value ,"\n";
-
-
f=opener.open(url)
-
print f.read()
-
-
if __name__=='__main__':
-
name='yourname'
-
password='yourpassword'
-
url=''
-
auto_login_hi(url,name,password)
详细的介绍也可以参考这个网页,里面包括超时时间的设置方法等。
阅读(9259) | 评论(0) | 转发(0) |