今天研究了下urllib2這個庫的使用,才發現之前有不少不明白的東西,如今寫下來也作個記錄html
1. 最基礎的應用python
import urllib2 url = r'http://www.baidu.com' html = urllib2.urlopen(url).read() print html
客戶端與服務器端經過request與response來溝通,客戶端先向服務端發送request,而後接收服務端返回的responseajax
urllib2提供了request的類,可讓用戶在發送請求前先構造一個request的對象,而後經過urllib2.urlopen方法來發送請求服務器
import urllib2 url = r'http://www.baidu.com' req = urllib2.Request(url) html = urllib2.urlopen(req).read() print html
上例中先使用req = urllib2.Request(url)實例化一個resquest對象,接下來使用urllib2.urlopen(req)來打開這個網頁cookie
咱們注意到在實例化Request對象的時候,隊了url是必須的,還有幾個默認的參數post
基中data與header也是使用的比較多的,一些須要登陸的才能瀏覽的網站常常須要這兩個參數網站
import urllib import urllib2 url = 'http://www.baidu.com/' values = {'name' : 'Michael Foord', 'location' : 'Northampton','language' : 'Python' } data = urllib.urlencode(values) req = urllib2.Request(url,data) response = urllib2.urlopen(req) the_page = response.read() print the_page
這個例子是向百度發送幾個數據,這個例子是會返回一個錯誤頁面,很正常,由於咱們在訪問百度的時候並不須要post什麼信息,post了卻是會出錯ui
百度是找不到相應的網頁就會報錯。編碼
固然這個是POST數據,也能夠用在GET方法,稍將上面的代碼進行改造url
百度是經過http://www.baidu.com/s?wd=XXX 來進行查詢的,這樣咱們須要將{‘wd’:’xxx’}這個字典進行urlencode
#coding:utf-8 import urllib import urllib2 url = 'http://www.baidu.com/s' values = {'wd':'楊彥星'} data = urllib.urlencode(values) print data url2 = url+'?'+data response = urllib2.urlopen(url2) the_page = response.read() print the_page
如下以模擬登陸人人網而後再顯示首頁內容爲例來詳細說明一下cookie的使用,如下是文檔中給的例子,咱們就經過改造這個例子來實現咱們想要的功能
import cookielib, urllib2 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) r = opener.open("http://example.com/")
#coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #建立一個cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #將要POST出去的數據進行編碼 data = urllib.urlencode({"email":email,"password":pass}) r = opener.open(url,data) print cj
當你看到有cj的時候,說明你已經訪問了登陸頁面,是否正常登陸你如今還看不出來,能夠經過訪問http://www.renren.com/home 來查看
上面的代碼有兩點要說明,我也是看了很長時間才明白
r = opener.open(url,data) 這句,爲何要使用opener這個對象來open,而不是用utllib2,urlopen?不光是例子裏這麼寫,咱們才這麼寫,經過改造咱們也可使用urllib2.urlopen,實際上是由於opener是urllib2.bulid_opener創造出來的, 可是你能夠這樣理解,他build出來後,自已卻並無安裝使用它,也沒有它的屬性與方法,若是想使urllib2也具備opener的屬性與方法,能夠先使用urllib2.install_opener(opener)來"安裝"這個opener,安裝完之後就可使用urllib2來操做了
#coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #建立一個cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) #將要POST出去的數據進行編碼 data = urllib.urlencode({"email":email,"password":pass}) #r = opener.open(url,data)若是沒有上面的urllib2.install_opener方法,就必須這樣寫了 r = urllib2.urlopen(url,data) html = urllib2.urlopen('http://www.renren.com/home').read() print html
一樣urllib2還有proxy相關的handle,基本的思路和這個差很少