python知識撿拾---URL及urllib篇

python中用urlparse來對URL字符進行解析

urlparse方法由兩個可選的參數:default_scheme和allow_fragments

default_scheme主要用來爲不包含協議部分的URL指定默認協議,此參數默認值爲空字符串
allow_fragments則用來指示是否可以對地址進行分片,此參數默認值爲"True"
實例:

import urlparse
r=urlparse.urlparse('http://alice:[email protected]:80/% 7Ealice/python.cgi?query=text#sample')
print r
print r.scheme
print r.netloc
print r.path
print r.params
print r.query
print r.fragment
print r.username
print r.password
print r.hostname
print r.port
print r.geturl()
r2=urlparse.urlparse("www.python.org/about","http")
print r2
URL的拼合:

當提供了URL中的絕對地址和相對地址的時候,可以使用urlparse模塊中的urljoin方法將其拼合起來

import urlparse
r=urlparse.urljoin("http://www.zeroc.com","ice.html")
print r
結果:
http://www.zeroc.com/ice.html

該方法使用時如果相對URL中有協議字段,則優先使用相對URL中的協議,否則使用絕對URL中的協議字段

import urlparse
r=urlparse.urljoin("http://www.python.org","www.python.org/faq")
print r

http://www.python.org/www.python.org/faq
URL的分解:
import urlparse
r=urlparse.urlsplit("http://www.python.org:80/faq.cgi?src=fie")
print r

SplitResult(scheme='http', netloc='www.python.org:80', path='/faq.cgi', query='src=fie', fragment='')
注意:
a={'keyword1':'value1','keyword2':'value2'}
b={'keyword2':'value2','keyword1':'value1'}
print a is b    #False
print a==b		#True
雖然a,b輸出的字符串是一樣的,但兩者所接受的字典結構數據輸入的時候並不一樣,這是由
字典內部的無序性造成的
urlencode方法可以接受一個可選的參數,默認爲False,即當查詢數據列表中的value也爲列表的時候,將其整個使用quote_plus方法進行編碼,並作爲查詢參數的值。而當其值爲True的時候,對於上述的這種情況會將value列表中的每個值都和keyword組成一個查詢參數值對

實例:

u2=urllib.urlencode([('keyword',('value1','value2','value3'))])
print u2  #keyword=%28%27value1%27%2C+%27value2%27%2C+%27value3%27%29

u3 = urllib.urlencode([('keyword',('value1','value2','value3'))],True)
print u3  #keyword=value1&keyword=value2&keyword=value3
爬網站初試:爬取知乎首頁
# -*- coding:utf-8 -*-
import urllib
fp = urllib.urlopen("https://www.zhihu.com/")
op = open("index.html","wb")
n = 0
while True:
    s = fp.read(1024)
    if not s:
        break
    op.write(s)
    n=n+len(s)
fp.close()
op.close()
print "receive",n,"bytes from ",fp.url

一般情況下,urlopen的可選參數data爲空的時候,支持多種協議,包括本地文件、HTTP協議等,當爲http數據的時候,urlopen將使用get方法來獲取相關的資源,但是當可選參數爲非空的時候,則前面的協議字段必須爲http,此時URLopen將使用post方法來獲取URL資源,同時,data參數將作爲post方法的數據一併傳遞給遠端服務器,注意,這裏的data需要使用urlencode編碼過後的查詢數據

使用代理:

設置代理:這裏的代理設置指明瞭在使用http協議的時候將使用http://www.proxy.com:3128代理服務器

proxies = {'http':'http://www.proxy.com:3128'}
urllib.urlopen(url,proxies=proxies)

urllib模塊中的urlretrieve方法,此方法和urlopen類似,最大的不同是此方法將獲取的資源直接保存在文件中,而不是返回一個文件對象
urlretrieve方法中還有一個reporthook參數,此參數可以用來將urlretrieve方法執行的過程通過圖形化的方法顯示給用戶。其值是一個函數,會在每次獲取資源塊的時候被調用,此函數有3個參數,分貝爲文件塊的個數,文件塊的大小和文件的大小,當文件大小的值爲-1的時候,表示此時無法獲得整個文件的大小,特別是對於ftp流數據協議而言

使用reporthook參數得到獲取資源時候的實時信息
import urllib
def reporthook(block_count,block_size,file_size):
    if file_size==-1:
        print "received data",block_count*block_size
    else:
        print "received data",block_count*block_size,"/",file_size

urllib.urlretrieve("http://www.baidu.com",filename="",reporthook=reporthook)
實例:結合urlretrieve方法和reporthook參數可以構成一個簡單的下載器,並顯示資源獲取的具體進度
import urllib
def download(url,filename=""):
    def reporthook(block_count,block_size,file_size):
        if file_size==-1:
            print "Can't determine the file size,now retrieved",block_count*block_size
        else:
            percentage = int(block_count*block_size*100.0/file_size)
            if percentage>100:
                print "100%"
            else:
                print "% d% % " %(percentage)
    filehandler,m = urllib.urlretrieve(url,filename,reporthook=reporthook)
    print "Done"
    return filehandler

download("http://www.baidu.com",filename="")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章