參考了一些文章,簡單寫一下urllib庫的基本使用:
1.簡單的拔取一個百度網(wǎng)頁
import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()
把這幾行代碼保存成 demo.py,進入該文件的目錄,執(zhí)行如下命令查看運行結果凳干,感受一下衰琐。
cmd下執(zhí)行 python demo.py
你將會在命令窗口看到HTML代碼被你完全扒了下來
2.我們來進行分析扒網(wǎng)頁
來看這兩行代碼,第一行
response = urllib2.urlopen("http://www.baidu.com")
首先我們調用的是urllib2庫里面的urlopen方法垛吗,傳入一個URL织堂,這個網(wǎng)址是百度首頁叠艳,協(xié)議是HTTP協(xié)議,當然你也可以把HTTP換做FTP,FILE,HTTPS 等等易阳,只是代表了一種訪問控制協(xié)議附较,urlopen一般接受三個參數(shù),它的參數(shù)如下:
urlopen(url, data, timeout)
第一個參數(shù)url即為URL潦俺,第二個參數(shù)data是訪問URL時要傳送的數(shù)據(jù)拒课,第三個timeout是設置超時時間。
第二三個參數(shù)是可以不傳送的事示,data默認為空None早像,timeout默認為 socket._GLOBAL_DEFAULT_TIMEOUT
第一個參數(shù)URL是必須要傳送的,在這個例子里面我們傳送了百度的URL肖爵,執(zhí)行urlopen方法之后卢鹦,返回一個response對象,返回信息便保存在這里面劝堪。
print response.read()
response對象有一個read方法冀自,可以返回獲取到的網(wǎng)頁內容。
3.構造Requset
上面的urlopen參數(shù)可以傳入一個request請求,它是一個Request類的實例秒啦,構造時需要傳入Url,Data等等的內容熬粗。比如上面的兩行代碼,我們可以這么改寫
import urllib2
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
運行結果是完全一樣的帝蒿,只不過中間多了一個request對象,推薦大家這么寫巷怜,因為在構建請求時還需要加入好多內容葛超,通過構建一個request,服務器響應請求得到應答延塑,這樣顯得邏輯上清晰明確绣张。
4.POST和GET數(shù)據(jù)傳送
上面的程序演示了最基本的網(wǎng)頁抓取,不過关带,現(xiàn)在大多數(shù)網(wǎng)站都是動態(tài)網(wǎng)頁侥涵,需要你動態(tài)地傳遞參數(shù)給它沼撕,它做出對應的響應。所以芜飘,在訪問時务豺,我們需要傳遞數(shù)據(jù)給它。最常見的情況是什么嗦明?對了笼沥,就是登錄注冊的時候呀。
把數(shù)據(jù)用戶名和密碼傳送到一個URL娶牌,然后你得到服務器處理之后的響應奔浅,這個該怎么辦?下面讓我來為小伙伴們揭曉吧诗良!
數(shù)據(jù)傳送分為POST和GET兩種方式汹桦,兩種方式有什么區(qū)別呢?
最重要的區(qū)別是GET方式是直接以鏈接形式訪問鉴裹,鏈接中包含了所有的參數(shù)舞骆,當然如果包含了密碼的話是一種不安全的選擇,不過你可以直觀地看到自己提交了什么內容壹罚。POST則不會在網(wǎng)址上顯示所有的參數(shù)葛作,不過如果你想直接查看提交了什么就不太方便了,大家可以酌情選擇猖凛。
POST方式:
the code:
import urllib
import urllib2
values = {"username":"1554896963@qq.com","password":"XXXX"}
data = urllib.urlencode(values)
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()
我們引入了urllib庫赂蠢,現(xiàn)在我們模擬登陸CSDN,當然上述代碼可能登陸不進去辨泳,因為還要做一些設置頭部header的工作虱岂,或者還有一些參數(shù)沒有設置全,還沒有提及到在此就不寫上去了菠红,在此只是說明登錄的原理第岖。我們需要定義一個字典,名字為values试溯,參數(shù)我設置了username和password蔑滓,下面利用urllib的urlencode方法將字典編碼,命名為data遇绞,構建request時傳入兩個參數(shù)键袱,url和data,運行程序摹闽,即可實現(xiàn)登陸蹄咖,返回的便是登陸后呈現(xiàn)的頁面內容。當然你可以自己搭建一個服務器來測試一下付鹿。
注意上面字典的定義方式還有一種澜汤,下面的寫法是等價的
the code:
import urllib
import urllib2
values = {}
values['username'] = "1554896963@qq.com"
values['password'] = "XXXX"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()
以上方法便實現(xiàn)了POST方式的傳送
GET方式:
至于GET方式我們可以直接把參數(shù)寫到網(wǎng)址上面蚜迅,直接構建一個帶參數(shù)的URL出來即可。
the code:
import urllib
import urllib2
values={}
values['username'] = "1554896963@qq.com"
values['password']="XXXX"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login"
geturl = url + "?"+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
本文參考該文章俊抵,大部分轉自此文內容 http://cuiqingcai.com/947.html