成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

爬蟲養(yǎng)成記 - urllib2的HTTPCookieProcessor

gnehc / 2953人閱讀

摘要:相當(dāng)于該用戶的檔案。上述的文字對(duì)機(jī)制描述的比較簡(jiǎn)單也并不一定完全正確。但是默認(rèn)的并不支持。中供我們使用的是。創(chuàng)建需要闖入一個(gè)存放的容器。即過(guò)期的也保存。目前博主只知道鏈接后帶的參數(shù)需要與相匹配。但是并不知道兩者具體的關(guān)系。

很多網(wǎng)站的資源需要用戶登錄之后才能獲取。
我們一旦登錄后再訪問(wèn)其他被保護(hù)的資源的時(shí)候,就不再需要再次輸入賬號(hào)、密碼。那么網(wǎng)站是怎么辦到的呢?
一般來(lái)說(shuō),用戶在登錄之后,服務(wù)器端會(huì)為該用戶創(chuàng)建一個(gè)Session。Session相當(dāng)于該用戶的檔案。該檔案就代表著該用戶。
那么某一次訪問(wèn)請(qǐng)求是屬于該用戶呢?登錄的時(shí)候服務(wù)器要求瀏覽器儲(chǔ)存了一個(gè)Session ID的Cookie值。每一個(gè)訪問(wèn)都帶上了該Cookie。服務(wù)器將Cookie中的Session ID與服務(wù)器中的Session ID比對(duì)就知道該請(qǐng)求來(lái)自哪個(gè)用戶了。

上述的文字對(duì)Session機(jī)制描述的比較簡(jiǎn)單也并不一定完全正確。更加詳細(xì)的資料可以閱讀:http://blog.csdn.net/fangaoxi...

opener

通過(guò)閱讀源碼我們可以知道,我們?cè)谡{(diào)用urllib2.urlopen(url)的時(shí)候,其實(shí)urllib2open函數(shù)內(nèi)部創(chuàng)建了一個(gè)默認(rèn)的opener對(duì)象。然后調(diào)用opener.open()函數(shù)。
但是默認(rèn)的opener并不支持cookie。
那么我們先新建一個(gè)支持cookie的opener。urllib2中供我們使用的是HTTPCookieProcessor

創(chuàng)建HTTPCookieProcessor需要闖入一個(gè)存放cookie的容器。
Python提供的存放cookie的容器位于cookielib,有以下幾個(gè)。
CookieJar -> FileCookieJar -> MozillaCookieJar / LWPCookieJar

示例代碼:

import cookielib
import urllib2

cookies = cookielib.CookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

request = urllib2.Request("http://www.baidu.com")
urllib2.urlopen(request)
for cookie in cookies:
    print cookie.name, cookie.value

上面的代碼顯示,urllib2的確幫我們把cookie從response中提取出來(lái)。但是如何保存在一個(gè)文件中呢?

FileCookieJar

FileCookieJar 實(shí)現(xiàn)了save()、load()、revert()三個(gè)函數(shù)。
但是通過(guò)查看FileCookieJar的源碼我們可以發(fā)現(xiàn),F(xiàn)ileCookeJar并沒(méi)有實(shí)現(xiàn)save()的具體功能,而是直接拋出了NotImplementedError

    def save(self, filename=None, ignore_discard=False, ignore_expires=False):
        """Save cookies to a file."""
        raise NotImplementedError()

FileCookieJar的子類MozillaCookieJarLWPCookieJar實(shí)現(xiàn)了save()方法。

示例代碼:

# coding=utf-8
import cookielib
import urllib2

cookies = cookielib.MozillaCookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

request = urllib2.Request("http://www.baidu.com")
urllib2.urlopen(request)

# 將cookie存為一個(gè)文件
cookies.save(filename="cookie.txt")

# 新建一個(gè)cookie對(duì)象
cookies2 = cookielib.MozillaCookieJar()

# 從文件中讀取cookie
cookies2.load("cookie.txt")
for cookie in cookies2:
    print cookie.name, cookie.value

save()函數(shù)帶有兩個(gè)參數(shù),ignore_discard和ignore_expires。

ignore_discard: save even cookies set to be discarded. 即也保存需要被丟棄的cookie。
ignore_expires: save even cookies that have expired. 即過(guò)期的cookie也保存。

上面提到了save()、load(),還有一個(gè)函數(shù)未提到即revert()。revert()函數(shù)的作用是Clear all cookies and reload cookies from a saved file.

模擬登錄實(shí)際操作

我們來(lái)試一下模擬登錄SegmentFault。
示例代碼如下:

import urllib
import urllib2
import cookielib

cookies = cookielib.MozillaCookieJar()
cookieHandler = urllib2.HTTPCookieProcessor(cookiejar=cookies)
opener = urllib2.build_opener(cookieHandler)
urllib2.install_opener(opener)

postData = {
    "remember": 1,
    "username": "YOUREMAIL",
    "password": "YOURPASSWORD"
}
headers = {
    "Accept": "*/*",

    "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4",
    "Connection": "keep-alive",
    "Content-Length": "54",
    "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    "Cookie": "_gat=1; PHPSESSID=YOUR_PHPSESSID; _ga=GA1.2.741059584.1485746441; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1485746441; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1485746618",
    "DNT": "1",
    "Host": "segmentfault.com",
    "Origin": "https://segmentfault.com",
    "Referer": "https://segmentfault.com/",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest"
}
request = urllib2.Request("https://segmentfault.com/api/user/login?_=57f36e7f98914cc9a7971aebc264e113", headers=headers)
request.add_data(urllib.urlencode(postData))

response = urllib2.urlopen(request)
print response.getcode()
for cookie in cookies:
    print cookie.name, cookie.value

response = urllib2.urlopen("https://segmentfault.com/u/charliecharlie")
print response.read()

但是目前這個(gè)模擬登錄并不完美。
實(shí)際上瀏覽器在訪問(wèn)第一個(gè)頁(yè)面的時(shí)候,服務(wù)器就在Response中返回了一個(gè)cookie,設(shè)置了一個(gè)PHPSESSID的Cookie。
目前博主只知道login鏈接后帶的_參數(shù)需要與PHPSESSID相匹配。但是并不知道兩者具體的關(guān)系。
且上述代碼中其實(shí)并不需要HTTPCookieProcessor而是直接寫在headers里即可。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/38407.html

相關(guān)文章

  • 爬蟲養(yǎng)成 - 網(wǎng)絡(luò)下載器urllib2初認(rèn)識(shí)

    摘要:申明本系列文章借鑒了慕課網(wǎng)的課程,。慕課網(wǎng)是一個(gè)非常贊的學(xué)習(xí)網(wǎng)站。是下的一個(gè)模塊,在中,被拆分成和實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的下載器使用函數(shù)可以給服務(wù)器發(fā)送一個(gè)請(qǐng)求。該函數(shù)返回一個(gè)該返回的對(duì)象有三個(gè)額外的函數(shù)取得服務(wù)器返回的。默認(rèn)沒(méi)有的,請(qǐng)求方式為。 申明:本系列文章借鑒了慕課網(wǎng)的課程,http://www.imooc.com/learn/563。慕課網(wǎng)是一個(gè)非常贊的學(xué)習(xí)網(wǎng)站。 urllib2是p...

    AlphaWallet 評(píng)論0 收藏0
  • 爬蟲養(yǎng)成 - urllib2調(diào)試和錯(cuò)誤處理

    摘要:設(shè)置和處理事實(shí)上,并不是所有發(fā)起的請(qǐng)求都能得到服務(wù)器的回應(yīng)。例如網(wǎng)絡(luò)無(wú)鏈接連接不到服務(wù)器鏈接不存在請(qǐng)求的方法不對(duì)等情況都會(huì)造成拋出錯(cuò)誤。上面說(shuō)到的出錯(cuò)就會(huì)拋出。用于處理相關(guān)的錯(cuò)誤。 urllib2的timeout timeout參數(shù)用于設(shè)置超時(shí)。我們?cè)谂廊∫恍╉憫?yīng)較慢的網(wǎng)站的時(shí)候,需要設(shè)置一個(gè)比較長(zhǎng)的超時(shí)時(shí)間。 response = urllib2.urlopen(request, t...

    CoffeX 評(píng)論0 收藏0
  • 爬蟲養(yǎng)成 - 網(wǎng)絡(luò)下載器urllib2偽裝術(shù)

    摘要:發(fā)送請(qǐng)求方不希望被跟蹤。主要用來(lái)將偽裝成一個(gè)正常的瀏覽器。該字典就是說(shuō)是網(wǎng)絡(luò)協(xié)議名稱,是代理的。另外一般會(huì)明確指定資源存放的位置。意思是將現(xiàn)在提交的數(shù)據(jù)存放于下第篇。請(qǐng)求刪除某一個(gè)資源。向服務(wù)器提交數(shù)據(jù)。 前一個(gè)教程我們涉及到了urllib2的一些高級(jí)應(yīng)用。這一片文章我們來(lái)比較系統(tǒng)的介紹一下。 該篇教程參考了靜覓的博文:http://cuiqingcai.com/954.html。寫這...

    Darkgel 評(píng)論0 收藏0
  • 爬蟲系列之三】URLError異常處理以及Cookie使用

    摘要:一的處理出現(xiàn)產(chǎn)生的原因很多,比如網(wǎng)絡(luò)沒(méi)法連接,連接不到服務(wù)器,或者服務(wù)器不存在。二的使用,一般是某些網(wǎng)站為了辨別用戶身份,進(jìn)行跟蹤,從而存儲(chǔ)在客戶端的數(shù)據(jù)。模塊的主要作用是提供可存儲(chǔ)的對(duì)象,以便于與模塊配合使用來(lái)訪問(wèn)資源。 一、urlError的處理 出現(xiàn)urlError產(chǎn)生的原因很多,比如:網(wǎng)絡(luò)沒(méi)法連接,連接不到服務(wù)器,或者服務(wù)器不存在。在代碼中,我們需要用try-except的語(yǔ)句...

    xiaochao 評(píng)論0 收藏0
  • 爬蟲養(yǎng)成 - 什么是網(wǎng)絡(luò)爬蟲

    摘要:趁著春節(jié),希望能寫一個(gè)小小的網(wǎng)絡(luò)爬蟲框架。網(wǎng)頁(yè)下載器接收,將頁(yè)面內(nèi)容下來(lái)??梢远x一個(gè)表,定義兩個(gè)字段和緩存數(shù)據(jù)庫(kù)網(wǎng)頁(yè)下載器網(wǎng)頁(yè)下載器就是更具下載網(wǎng)頁(yè)內(nèi)容等。常見(jiàn)的網(wǎng)頁(yè)下載器有是官方的基礎(chǔ)模塊。 趁著春節(jié),希望能寫一個(gè)小小的網(wǎng)絡(luò)爬蟲框架。先定一個(gè)小目標(biāo),希望能比較優(yōu)雅地將某個(gè)網(wǎng)站上的所有圖片爬下來(lái)。暫時(shí)先將這個(gè)爬蟲的名字叫做Squirrel,小松鼠吧。 什么是爬蟲 爬蟲其實(shí)是一種從互聯(lián)...

    lucas 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<