天天看點

python urllib2子產品_Python urllib和urllib2子產品學習(一)

Python标準庫中有許多實用的工具類,但是在具體使用時,标準庫文檔上對使用細節描述的并不清楚,比如 urllib和urllib2 這個 HTTP 用戶端庫。這裡總結了一些 urllib和urlib2 庫的使用細節。

Python urllib 庫提供了一個從指定的 URL 位址擷取網頁資料,然後對其進行分析處理,擷取想要的資料。

一、urllib常用函數介紹:

1. urlopen()函數:即建立一個類檔案對象為指定的 url 來讀取。

可以使用help(urllib.urlopen)檢視函數說明。

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

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

urlopen傳回一個類檔案對象,它提供了如下方法:

read(),readline,readlines,fileno和close:  這些方法的使用和檔案對象一樣;

info(): 傳回一個httplib.HTTPMessage對象,表示遠端伺服器傳回的頭資訊。

getcode():傳回Http狀态碼,如果是http請求,200表示請求成功完成,404表示網址沒有找到。

getutl: 傳回請求的url位址。

示例:

>>>import urllib

>>>baidu = urllib.urlopen('http://www.baidu.com')

>>>baidu.read()

>>> print baidu.info()

輸出:

Date: Fri, 24 Apr 2015 05:41:40 GMT

Server: Apache

Cache-Control: max-age=86400

Expires: Sat, 25 Apr 2015 05:41:40 GMT

Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT

ETag: "51-4b4c7d90"

Accept-Ranges: bytes

Content-Length: 81

Connection: Close

Content-Type: text/html

>>>for line in baidu:            #等價于read(),就像在操作本地檔案,将網頁資料列印出來。

print line,

baidu.close()

補充:

urllib.open的參數有特别要示,要遵循一些網絡協定,比如http,ftp,也就是說在網址的開頭必須要有http://或ftp://如:

urllib.urlopen('http://www.baidu.com')

urllib.urlopen('ftp://192.168.1.200')

若要使用本地檔案,就需要在前面加filt關鍵字,如:

urllib.urlopen('file:nowangic.py')

urllib.urlopen('file:F:\test\helloworld.py')

2. urlretrieve()函數:直接将遠端資料下載下傳到本地。

可以使用help(urllib.urlretvieve)檢視函數說明

Help on function urlretrieve in module urllib:

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

參數 finename 指定了儲存本地路徑(如果參數未指定,urllib會生成一個臨時檔案儲存資料。)

參數 reporthook 是一個回調函數,當連接配接上伺服器、以及相應的資料塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示目前的下載下傳進度。

參數 data 指 post 到伺服器的資料,該方法傳回一個包含兩個元素的(filename, headers)元組,filename 表示儲存到本地的路徑,header 表示伺服器的響應頭。

示例1:

>>>urllib.urlretrieve('http://www.soso.com','c://soso.html')

('c://soso.html', )

示例2:下面是urlretrieve()下載下傳檔案執行個體,可以顯示下載下傳進度。

#coding:utf-8

import urllib

def cbk(a,b,c):

"""

@a: 已經下載下傳的資料塊

@b: 資料塊的大小

@c: 遠端檔案的大小

"""

per = 100.0 *a*b/c

if per >100:

per = 100

print '#%d%%'% per

url = 'http://www.soso.com'

local = 'c://test//soso.html'

urllib.urlretrieve(url,local,cbk)

示例3:爬蟲練習:

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

""" 爬蟲練習

Date:06-15-2015

"""

import urllib

import re

#擷取指定url網頁内容

def getHtml(url):

page = urllib.urlopen(url)

html = page.read()

return html

#利用正規表達式将指定的圖檔下載下傳

def getImg(html):

reg = 'src="(.*?\.jpg)" pic_ext'

regimg = re.compile(reg)

imglist = re.findall(regimg,html)

x = 0

for img in imglist:

urllib.urlretrieve(img,'%s.jpg' % x)

x+=1

Html = getHtml('http://tieba.baidu.com/p/3825178610')

Img = getImg(Html)