前言
從二三月開(kāi)始自學(xué)Python開(kāi)始,到后來(lái)被傻叉項(xiàng)目折騰了半年多的時(shí)間,一直停滯了這么久,現(xiàn)在重新整理一些爬蟲(chóng)的資料,比較散碎,單純的是從開(kāi)發(fā)馬上上手的角度記錄的,這些基礎(chǔ)知識(shí)絕大多數(shù)是通過(guò)學(xué)習(xí)崔慶才老師的精品博客進(jìn)行的摘要,原版還是要看崔老師的博客,再次感謝崔老師無(wú)私奉獻(xiàn)的資料??????
urllib2【171107】
基本使用
- 導(dǎo)包
import urllib2 - openUrl 看下定義
- 唯一必填的是
url -
data用于傳參數(shù) -
timeout超時(shí)時(shí)間 - 返回值是 響應(yīng)實(shí)體 response
- 通過(guò) response.read 獲取響應(yīng)體信息
- 唯一必填的是
def urlopen(url,
data=None,
timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
cafile=None,
capath=None,
cadefault=False,
context=None):
- 代碼
def open_url():
url = ""file:///Users/user/Documents/myGit/react-demos/demo01/index.html""
response = urllib2.urlopen(url)
print response.read()
- 執(zhí)行結(jié)果
我的鏈接指向的是本地的一個(gè)HTML
執(zhí)行結(jié)果
帶參數(shù)訪問(wèn) GET & POST 訪問(wèn)
-
前文所敘,將參數(shù)直接或者間接放在data 中,data為字典類(lèi)型
-
GET 訪問(wèn)
- 參數(shù)需要格式化一下,需要庫(kù)`import urllib
- get 訪問(wèn)其實(shí)就是把處理后參數(shù)拼接成一個(gè)url字符串
- 例子
# GET 獲取
def open_with_get():
url0 = "http://client.hs.vread.com/operation/getQuestionList.json?"
# 參數(shù),字典類(lèi)型
params = {"page": 1, "page_size": 10}
# 參數(shù)格式化
data = urllib.urlencode(params)
url = url0 + data
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print response.read()
- POST 訪問(wèn)
- 和 get 不同的是,參數(shù)不能直接拼接在鏈接中,要寫(xiě)在字典中,
- 手頭沒(méi)有合適的post 例子,將上面get的例子改為post ,不能執(zhí)行,只是看一下格式
- 例子
# Post 獲取
def open_with_post():
url = "http://client.hs.vread.com/operation/getQuestionList.json"
# 參數(shù),字典類(lèi)型
params = {"page": 1, "page_size": 10}
# 參數(shù)格式化
data = urllib.urlencode(params)
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
print response.read()
urllib2 的高級(jí)用法
HTTP 請(qǐng)求頭參數(shù)
- User-Agent : 有些服務(wù)器或 Proxy 會(huì)通過(guò)該值來(lái)判斷是否是瀏覽器發(fā)出的請(qǐng)求
- Content-Type : 在使用 REST 接口時(shí),服務(wù)器會(huì)檢查該值,用來(lái)確定 HTTP Body 中的內(nèi)容該怎樣解析。
- application/xml : 在 XML RPC,如 RESTful/SOAP 調(diào)用時(shí)使用
- application/json : 在 JSON RPC 調(diào)用時(shí)使用
- application/x-www-form-urlencoded : 瀏覽器提交 Web 表單時(shí)使用
在使用服務(wù)器提供的 RESTful 或 SOAP 服務(wù)時(shí), Content-Type 設(shè)置錯(cuò)誤會(huì)導(dǎo)致服務(wù)器拒絕服務(wù)
在某些爬蟲(chóng)操作中,需要對(duì)請(qǐng)求頭中個(gè)別值進(jìn)行設(shè)定,具體的操作是
- header 用一個(gè)字典進(jìn)行接收,
- 需要進(jìn)行拼接的字段作為key,值用字符串
- 拼接好的header 作為參數(shù),再構(gòu)建Request的時(shí)候傳入
- 示例代碼
url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'username' : 'cqc', 'password' : 'XXXX' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
page = response.read()
獲取cookie
opener
- 定義: urllib2.OpenerDirector的實(shí)例
- 當(dāng)通過(guò)url訪問(wèn)資源的時(shí)候,就是通過(guò)opener
- 前面 urllib2.urlopen 就是使用默認(rèn)的opener
- 它是一個(gè)特殊的opener,
- 可以理解成opener的一個(gè)特殊實(shí)例,傳入的參數(shù)僅僅是url,data,timeout。
獲取cookie
- 導(dǎo)包
import cookielib - 通過(guò)
cookielib.CookieJar()創(chuàng)建cookie實(shí)例,用于存放cookie- 如果此cookie是可以由文件進(jìn)行讀取和存儲(chǔ)到文件的,則使用
cookielib.MozillaCookieJar(文件路徑) - 存儲(chǔ)的時(shí)候需要傳參,參數(shù)為路徑
- 如果此cookie是可以由文件進(jìn)行讀取和存儲(chǔ)到文件的,則使用
- 通過(guò)
urllib2.HTTPCookieProcessor(cookie實(shí)例)創(chuàng)建 cookie處理器,參數(shù)為cookie實(shí)例 - 通過(guò)
urllib2.build_opener(cookie處理器)創(chuàng)建opener,參數(shù)為cookie處理器 - 例子
# 獲取cookie
def get_cookie():
# 聲明一個(gè)cookieJar來(lái)存放cookie
cookie = cookielib.CookieJar()
# 創(chuàng)建一個(gè)cookie處理器
handler = urllib2.HTTPCookieProcessor(cookie)
# 通過(guò)處理器來(lái)創(chuàng)建opener
opener = urllib2.build_opener(handler)
response = opener.open("https://www.zhihu.com")
for item in cookie:
print 'Name = ' + item.name
print 'Value = ' + item.value
存儲(chǔ) 讀取cookie
- 調(diào)用cookie實(shí)例的save方法存儲(chǔ)
- 參數(shù)1:gnore_discard的意思是即使cookies將被丟棄也將它保存下來(lái)
- 參數(shù)2: ignore_expires的意思是如果在該文件中cookies已經(jīng)存在
- 調(diào)用cookie實(shí)例的load 方法讀取
- 參數(shù)0:cookie文件的全路徑
- 參數(shù)1:gnore_discard的意思是即使cookies將被丟棄也將它保存下來(lái)
- 參數(shù)2: ignore_expires的意思是如果在該文件中cookies

