Python網(wǎng)絡爬蟲(三)- 爬蟲進階

目錄:

1.爬蟲進階cookielib

  • Python入門網(wǎng)絡爬蟲之精華版:詳細講解了Python學習網(wǎng)絡爬蟲。
  • 為了進行高效的抓取有用的數(shù)據(jù)金句,并且減少冗余數(shù)據(jù)的存儲肃拜,后續(xù)需要使用正則表達式來進行對爬取數(shù)據(jù)中特定內容的存儲地粪。
  • urllib2 默認會使用環(huán)境變量 http_proxy 來設置 HTTP Proxy。假如一個網(wǎng)站它會檢測某一段時間某個IP 的訪問次數(shù)币绩,如果訪問次數(shù)過多,它會禁止你的訪問】Ъ溃可以設置代理IP來進行爬蟲,具體見代碼操作(四)
  • 當你獲取一個URL你使用一個opener蔫骂。在
    Python網(wǎng)絡爬蟲(二)- urllib爬蟲案例中么翰,我們都是使用的默認的opener,也就是urlopen辽旋。它是一個特殊的opener浩嫌,可以理解成opener的一個特殊實例,傳入的參數(shù)僅僅是url补胚,data码耐,timeout
  • Cookie溶其,指某些網(wǎng)站為了辨別用戶身份骚腥、進行session跟蹤而儲存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過加密)
    • cookielib模塊的主要作用是提供可存儲cookie的對象,以便于與urllib2模塊配合使用來訪問Internet資源瓶逃。Cookielib模塊非常強大桦沉,我們可以利用本模塊的CookieJar類的對象來捕獲cookie并在后續(xù)連接請求時重新發(fā)送每瞒,比如可以實現(xiàn)模擬登錄功能。該模塊主要的對象有CookieJar纯露、FileCookieJar剿骨、MozillaCookieJarLWPCookieJar埠褪。

    • 如果我們需要用到Cookie浓利,只用這個opener是不能達到目的的,所以我們需要創(chuàng)建更一般的opener來實現(xiàn)對Cookie的設置钞速。

1)獲取Cookie贷掖,并保存到CookieJar()對象中

# urllib2_cookielibtest1.py

import urllib2
import cookielib

# 構建一個CookieJar對象實例來保存cookie
cookiejar = cookielib.CookieJar()

# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象,參數(shù)為CookieJar()對象
handler=urllib2.HTTPCookieProcessor(cookiejar)

# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)

# 4. 以get方法訪問頁面渴语,訪問之后會自動保存cookie到cookiejar中
opener.open("http://www.baidu.com")

## 可以按標準格式將保存的Cookie打印出來
cookieStr = ""
for item in cookiejar:
    cookieStr = cookieStr + item.name + "=" + item.value + ";"

## 舍去最后一位的分號
print cookieStr[:-1]

2) 訪問網(wǎng)站獲得cookie苹威,并把獲得的cookie保存在cookie文件中

# urllib2_cookielibtest2.py

import cookielib
import urllib2

# 保存cookie的本地磁盤文件名
filename = 'cookie.txt'

# 聲明一個MozillaCookieJar(有save實現(xiàn))對象實例來保存cookie,之后寫入文件
cookiejar = cookielib.MozillaCookieJar(filename)

# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象驾凶,參數(shù)為CookieJar()對象
handler = urllib2.HTTPCookieProcessor(cookiejar)

# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)

# 創(chuàng)建一個請求牙甫,原理同urllib2的urlopen
response = opener.open("http://www.baidu.com")

# 保存cookie到本地文件
cookiejar.save()

3)從文件中獲取cookies,做為請求的一部分去訪問

# urllib2_cookielibtest2.py

import cookielib
import urllib2

# 創(chuàng)建MozillaCookieJar(有l(wèi)oad實現(xiàn))實例對象
cookiejar = cookielib.MozillaCookieJar()

# 從文件中讀取cookie內容到變量
cookie.load('cookie.txt')

# 使用HTTPCookieProcessor()來創(chuàng)建cookie處理器對象调违,參數(shù)為CookieJar()對象
handler = urllib2.HTTPCookieProcessor(cookiejar)

# 通過 build_opener() 來構建opener
opener = urllib2.build_opener(handler)

response = opener.open("http://www.baidu.com")
  • urllib 模塊方法窟哺。

  • urllib2 的異常錯誤處理

    • URLError
import urllib2

requset = urllib2.Request('http://www.ajkfhafwjqh.com')

try:
    urllib2.urlopen(request, timeout=5)
except urllib2.URLError, err:
    print err
  • HTTPError

HTTPError是URLError的子類,我們發(fā)出一個請求時技肩,服務器上都會對應一個response應答對象且轨,其中它包含一個數(shù)字"響應狀態(tài)碼"。

如果urlopen或opener.open不能處理的虚婿,會產(chǎn)生一個HTTPError旋奢,對應相應的狀態(tài)碼,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應的狀態(tài)然痊。

注意黄绩,urllib2可以為我們處理重定向的頁面(也就是3開頭的響應碼),100-299范圍的號碼表示成功玷过,所以我們只能看到400-599的錯誤號碼。

import urllib2

requset = urllib2.Request('http://blog.baidu.com/itcast')

try:
    urllib2.urlopen(requset)
except urllib2.HTTPError, err:
    print err.code
    print err
  • 改進版
import urllib2

requset = urllib2.Request('http://blog.baidu.com/itcast')

try:
    urllib2.urlopen(requset)

except urllib2.HTTPError, err:
    print err.code

except urllib2.URLError, err:
    print err

else:
    print "Good Job"

這樣我們就可以做到筑煮,首先捕獲子類的異常辛蚊,如果子類捕獲不到,那么可以捕獲父類的異常真仲。

2.具體代碼操作

代碼操作(一) 自定義數(shù)據(jù)請求方式

# -*- coding:utf-8 -*-
import urllib2,urllib

#創(chuàng)建一個HTPP請求對象
http_handler = urllib2.HTTPHandler()

# 構建一個HTTPHandler 處理器對象袋马,支持處理HTTPS請求
http_handler = urllib2.HTTPSHandler()

#創(chuàng)建一個打開方式對象
opener = urllib2.build_opener(http_handler)
#通過自定義的打開方式,
response = opener.open('https://www.baidu.com')
#讀取響應對象中的數(shù)據(jù)
print response.read()

爬取結果

注解:這里使用urllib2.HTTPHandler()訪問https網(wǎng)頁得到的html代碼秸应。

這種方式發(fā)送請求得到的結果虑凛,和使用urllib2.urlopen()發(fā)送HTTP/HTTPS請求得到的結果是一樣的碑宴。

如果在 HTTPHandler()增加 debuglevel=1參數(shù),還會將 Debug Log 打開桑谍,這樣程序在執(zhí)行的時候延柠,會把收包和發(fā)包的報頭在屏幕上自動打印出來,方便調試锣披,有時可以省去抓包的工作贞间。

# 僅需要修改的代碼部分:

# 構建一個HTTPHandler 處理器對象,支持處理HTTP請求雹仿,同時開啟Debug Log增热,debuglevel 值默認 0
http_handler = urllib2.HTTPHandler(debuglevel=1)

# 構建一個HTTPHSandler 處理器對象,支持處理HTTPS請求胧辽,同時開啟Debug Log峻仇,debuglevel 值默認 0
https_handler = urllib2.HTTPSHandler(debuglevel=1)

代碼操作(二) 自定義數(shù)據(jù)請求方式

# -*- coding:utf-8 -*-
import urllib,urllib2

#準備數(shù)據(jù)
ftp_server = '192.168.1.100'
username = 'root'
password = '123'

#創(chuàng)建一個密碼管理器對象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

#增加一個管理服務器
pass_mgr.add_password(None,ftp_server,username,password)

#創(chuàng)建一個web驗證服務器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)

#構建一個請求對象
request = urllib2.Request('http://image.baidu.com')

#創(chuàng)建自定義打開方式對象【開鎖人】
opener = urllib2.build_opener(http_auth_handler)

#發(fā)送請求,獲取服務器的響應對象
response = opener.open(request)

# 獲取響應中的數(shù)據(jù)
content = response.read()

#處理相關數(shù)據(jù)

代碼操作(三)從ftp服務器爬取數(shù)據(jù)

# -*- coding:utf-8 -*-
import urllib,urllib2

#準備數(shù)據(jù)
ftp_server = '192.168.1.100'
username = 'root'
password = '123'

#創(chuàng)建一個密碼管理器對象
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

#增加一個管理服務器
pass_mgr.add_password(None,ftp_server,username,password)

#創(chuàng)建一個web驗證服務器
http_auth_handler = urllib2.HTTPBasicAuthHandler(pass_mgr)

#構建一個請求對象
request = urllib2.Request('http://image.baidu.com')

#創(chuàng)建自定義打開方式對象【開鎖人】
opener = urllib2.build_opener(http_auth_handler)

#發(fā)送請求邑商,獲取服務器的響應對象
response = opener.open(request)

# 獲取響應中的數(shù)據(jù)
content = response.read()

#處理相關數(shù)據(jù)
print content

代碼操作(四) 自定義數(shù)據(jù)請求方式——代理請求

# -*- coding:utf-8 -*-
import urllib
import urllib2

#創(chuàng)建一個HTTP處理器對象
#使用免費的代理進行處理器的創(chuàng)建
proxy_handler = urllib2.ProxyHandler({'http':'110.50.85.68:80'})

#如果是付費的代理摄咆,輸入自己的賬號密碼即可
# proxy_handler = urllib2.ProxyHandler({'http':'username:password@175.172.212.178:80'})

# 創(chuàng)建一個請求發(fā)送對象
opener = urllib2.build_opener(proxy_handler)

#創(chuàng)建請求對象
request = urllib2.Request(r'http://www.baidu.com')

#發(fā)送請求,獲取服務器返回的響應對象
response = opener.open(request)

#獲取數(shù)據(jù)
print response.read()

代碼操作(五) 爬取人人網(wǎng)個人中心數(shù)據(jù)奠骄,需要驗證登陸

# -*- coding:utf-8 -*-
import urllib
import urllib2
import cookielib


#聲明一個CookieJar對象實例來保存cookie
cookie = cookielib.CookieJar()

#利用urllib2庫的HTTPCookieProcessor對象來創(chuàng)建cookie處理器
cookielib_handler = urllib2.HTTPCookieProcessor(cookie)

#創(chuàng)建一個請求打開方式
opener = urllib2.build_opener(cookielib_handler)

#構建請求對象 'http://www.renren.com/PLogin.do' 這個接口沒有做反爬蟲處理
url = 'http://www.renren.com/PLogin.do' #http://www.renren.com/SysHome.do豆同,這個接口做了反爬蟲處理
data = urllib.urlencode({'email':'用戶名','password':'密碼'})
request = urllib2.Request(url,data)

#發(fā)送請求
response = opener.open(request)

#獲取數(shù)據(jù)
content = response.read()

print content
data數(shù)據(jù)從form表單name中獲取

代碼操作(六) 爬取指定網(wǎng)頁的圖片保存至本地,這里寫的函數(shù)是爬取游民星空每周壁紙精選

# -*- coding:utf-8 -*-
import urllib
import urllib2
import re

#定義函數(shù)含鳞,用于爬取對應的數(shù)據(jù)
def getHtml(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html

#定義函數(shù)影锈,進行爬蟲的核心處理功能
def getImg(html):
    #使用正則表達式匹配想要保存的數(shù)據(jù)———圖片
    reg = 'src="(.+?\.jpg)"'
    #將正則表達式編譯成Pattern對象,
    imgre = re.compile(reg)
    imglist = re.findall(imgre, html)
    x = 0
    for imgurl in imglist:
        urllib.urlretrieve(imgurl, '%s.jpg' % x)
        x+=1
    return imglist

#主程序運行入口
if __name__ == '__main__':
    Html = raw_input('請輸入想要爬取的網(wǎng)頁鏈接:')

    html = getHtml(Html)
    getImg(html)

注解: urllib 模塊提供的 urlretrieve() 函數(shù)

urlretrieve(url, filename=None, reporthook=None, data=None)
  • 參數(shù) finename 指定了保存本地路徑(如果參數(shù)未指定蝉绷,urllib會生成一個臨時文件保存數(shù)據(jù)鸭廷。)
  • 參數(shù) reporthook 是一個回調函數(shù),當連接上服務器熔吗、以及相應的數(shù)據(jù)塊傳輸完畢時會觸發(fā)該回調辆床,我們可以利用這個回調函數(shù)來顯示當前的下載進度。
  • 參數(shù) data 指 post 到服務器的數(shù)據(jù)桅狠,該方法返回一個包含兩個元素的(filename, headers)元組讼载,filename 表示保存到本地的路徑,header 表示服務器的響應頭中跌。
  • urllib2與urllib一些常用方法的比較
爬取的是游民星空壁紙精選
從本地文件可以看到爬取保存至本地20張圖片
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末咨堤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子漩符,更是在濱河造成了極大的恐慌一喘,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嗜暴,死亡現(xiàn)場離奇詭異凸克,居然都是意外死亡议蟆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門萎战,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咐容,“玉大人,你說我怎么就攤上這事撞鹉∨北” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵鸟雏,是天一觀的道長享郊。 經(jīng)常有香客問我,道長孝鹊,這世上最難降的妖魔是什么炊琉? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮又活,結果婚禮上苔咪,老公的妹妹穿的比我還像新娘。我一直安慰自己柳骄,他們只是感情好团赏,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耐薯,像睡著了一般舔清。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曲初,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天体谒,我揣著相機與錄音,去河邊找鬼臼婆。 笑死抒痒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的颁褂。 我是一名探鬼主播故响,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颁独!你這毒婦竟也來了彩届?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤奖唯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糜值,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰捷,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡坯墨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了病往。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捣染。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖停巷,靈堂內的尸體忽然破棺而出耍攘,到底是詐尸還是另有隱情,我是刑警寧澤畔勤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布蕾各,位于F島的核電站,受9級特大地震影響庆揪,放射性物質發(fā)生泄漏式曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一缸榛、第九天 我趴在偏房一處隱蔽的房頂上張望吝羞。 院中可真熱鬧,春花似錦内颗、人聲如沸钧排。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恨溜。三九已至,卻和暖如春负懦,著一層夾襖步出監(jiān)牢的瞬間筒捺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工纸厉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留系吭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓颗品,卻偏偏與公主長得像肯尺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躯枢,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容