網(wǎng)絡(luò)爬蟲

使用第三方模塊快速抓取與解析:

https://jecvay.com/2015/02/python3-web-bug-series5.html

1.Python 3開發(fā)網(wǎng)絡(luò)爬蟲(一)

1.1?抓取指定頁面

?#encoding:UTF-8

?importurllib.request

?url ="http://www.baidu.com"

?data= urllib.request.urlopen(url).read()

?data= data.decode('UTF-8')

?print(data)

?解析:urlopen()函數(shù)胎源,這個函數(shù)返回一個http.client.HTTPResponse對象:

?urllib.request.urlopen(url,

data=None, [timeout, ]*,cafile=None,capath=None,cadefault=False)

[if ppt]?[endif]

?>>>a = urllib.request.urlopen(full_url)>>> type(a)

'http.client.HTTPResponse'>

?>>>a.geturl() # 'http://www.baidu.com/s?word=Jecvay'

?>>>a.info() #

?>>>a.getcode()? # 200


1.2?簡單處理URL

?importurllib

?importurllib.request

?

?data={}

?data['word']='JecvayNotes'

?

?url_values=urllib.parse.urlencode(data)

?url="http://www.baidu.com/s?"

?full_url=url+url_values

?

?data=urllib.request.urlopen(full_url).read()

?data=data.decode('UTF-8')

?print(data)

?解析:字典data轉(zhuǎn)換為'word=Jecvay+Notes'的字符串

?urllib.parse.urlencode(query,

doseq=False, safe='', encoding=None, errors=None)

?urllib.parse.quote_plus(string,

safe='', encoding=None, errors=None)


2.?https://jecvay.com/2014/09/python3-web-bug-series2.html


3.https://jecvay.com/2014/09/python3-web-bug-series3.html

3.1添加超時跳過功能

首先, 我簡單地將

urlop = urllib.request.urlopen(url)

改為

urlop = urllib.request.urlopen(url, timeout = 2)

運行后發(fā)現(xiàn), 當發(fā)生超時, 程序因為exception中斷. 于是我把這一句也放在try .. except 結(jié)構(gòu)里, 問題解決.

3.2?支持自動跳轉(zhuǎn)

在爬 http://baidu.com 的時候, 爬回來一個沒有什么內(nèi)容的東西, 這個東西告訴我們應(yīng)該跳轉(zhuǎn)到 http://www.baidu.com . 但是我們的爬蟲并不支持自動跳轉(zhuǎn), 現(xiàn)在我們來加上這個功能, 讓爬蟲在爬 baidu.com 的時候能夠抓取 www.baidu.com 的內(nèi)容.

首先我們要知道爬 http://baidu.com 的時候他返回的頁面是怎么樣的, 這個我們既可以用 Fiddler 看, 也可以寫一個小爬蟲來抓取. 這里我抓到的內(nèi)容如下, 你也應(yīng)該嘗試一下寫幾行 python 來抓一抓.

3.3偽裝瀏覽器

HTTP 報文分兩種:請求報文響應(yīng)報文

請求報文的請求行首部行

GET,POST, HEAD, PUT, DELETE 方法

我用 IE 瀏覽器訪問百度首頁的時候, 瀏覽器發(fā)出去的請求報文如下:

GET http://www.baidu.com/ HTTP/1.1

Accept: text/html, application/xhtml+xml, */*

Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept-Encoding: gzip, deflate

Host: www.baidu.com

DNT: 1

Connection: Keep-Alive

Cookie: BAIDUID=57F4D171573A6B88A68789EF5DDFE87:FG=1; uc_login_unique=ccba6e8d978872d57c7654130e714abd; BD_UPN=11263145; BD

然后百度收到這個消息后, 返回給我的的響應(yīng)報文如下(有刪節(jié)):

HTTP/1.1 200 OK

Date: Mon, 29 Sep 2014 13:07:01 GMT

Content-Type: text/html; charset=utf-8

Connection: Keep-Alive

Vary: Accept-Encoding

Cache-Control: private

Cxy_all: baidu+8b13ba5a7289a37fb380e0324ad688e7

Expires: Mon, 29 Sep 2014 13:06:21 GMT

X-Powered-By: HPHP

Server: BWS/1.1

BDPAGETYPE: 1

BDQID: 0x8d15bb610001fe79

BDUSERID: 0

Set-Cookie: BDSVRTM=0; path=/

Set-Cookie: BD_HOME=0; path=/

Content-Length: 80137

百度一下虐沥,你就知道 ..........這里省略兩萬字................?在 GET 的時候添加 header 有很多方法, 下面介紹兩種方法.

第一種方法比較簡便直接, 但是不好擴展功能, 代碼如下:

import urllib.request

url='http://www.baidu.com/'

req=urllib.request.Request(url,headers={

'Connection':'Keep-Alive',

'Accept':'text/html, application/xhtml+xml, */*',

'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'

})

oper=urllib.request.urlopen(req)

data=oper.read()

print(data.decode())

第二種方法使用了 build_opener 這個方法, 用來自定義 opener, 這種方法的好處是可以方便的拓展功能, 例如下面的代碼就拓展了自動處理?Cookies 的功能.

import urllib.request

import http.cookiejar

# head: dict of header

defmakeMyOpener(head={

'Connection':'Keep-Alive',

'Accept':'text/html, application/xhtml+xml, */*',

'Accept-Language':'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',

'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'

}):

cj=http.cookiejar.CookieJar()

opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))

header=[]

forkey,valueinhead.items():

elem=(key,value)

header.append(elem)

opener.addheaders=header

returnopener

oper=makeMyOpener()

uop=oper.open('http://www.baidu.com/',timeout=1000)

data=uop.read()

print(data.decode())

上述代碼運行后通過 Fiddler 抓到的 GET 報文如下所示:

GET http://www.baidu.com/ HTTP/1.1

Accept-Encoding: identity

Connection: close

Host: www.baidu.com

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Accept: text/html, application/xhtml+xml, */*

Accept-Language: en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3

3.4保存抓回來的報文

順便說說文件操作. Python 的文件操作還是相當方便的. 我們可以講抓回來的數(shù)據(jù) data 以二進制形式保存, 也可以經(jīng)過 decode() 處理成為字符串后以文本形式保存. 改動一下打開文件的方式就能用不同的姿勢保存文件了. 下面是參考代碼:

defsaveFile(data):

save_path='D:\temp.out'

f_obj=open(save_path,'wb')# wb 表示打開方式

f_obj.write(data)

f_obj.close()

# 這里省略爬蟲代碼

# ...

# 爬到的數(shù)據(jù)放到 dat 變量里

# 將 dat 變量保存到 D 盤下

saveFile(dat)


4.https://jecvay.com/2014/10/python3-web-bug-series4.html#more-372


5.使用第三方模塊快速抓取與解析

https://jecvay.com/2015/02/python3-web-bug-series5.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伞辛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子读恃,更是在濱河造成了極大的恐慌辩诞,老刑警劉巖辫狼,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件聪蘸,死亡現(xiàn)場離奇詭異狰闪,居然都是意外死亡疯搅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門埋泵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔欧,“玉大人罪治,你說我怎么就攤上這事〗刚幔” “怎么了觉义?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浴井。 經(jīng)常有香客問我晒骇,道長,這世上最難降的妖魔是什么滋饲? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任厉碟,我火速辦了婚禮,結(jié)果婚禮上屠缭,老公的妹妹穿的比我還像新娘箍鼓。我一直安慰自己,他們只是感情好呵曹,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布款咖。 她就那樣靜靜地躺著,像睡著了一般奄喂。 火紅的嫁衣襯著肌膚如雪铐殃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天跨新,我揣著相機與錄音富腊,去河邊找鬼。 笑死域帐,一個胖子當著我的面吹牛赘被,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肖揣,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼民假,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了龙优?” 一聲冷哼從身側(cè)響起羊异,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彤断,沒想到半個月后野舶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年筒愚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩浙。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劲蜻,到底是詐尸還是另有隱情陆淀,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布先嬉,位于F島的核電站轧苫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏疫蔓。R本人自食惡果不足惜含懊,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望衅胀。 院中可真熱鬧岔乔,春花似錦、人聲如沸滚躯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掸掏。三九已至茁影,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丧凤,已是汗流浹背募闲。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留愿待,地道東北人浩螺。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像呼盆,于是被迫代替她去往敵國和親年扩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355