python爬蟲(四)_urllib2庫的基本使用

本篇我們將開始學習如何進行網(wǎng)頁抓取胯究,更多內(nèi)容請參考:python學習指南

urllib2庫的基本使用

所謂網(wǎng)頁抓取,就是把URL地址中指定的網(wǎng)絡(luò)資源從網(wǎng)絡(luò)流中讀取出來敲街,保存到本地春感。在Python中有很多庫可以用來抓取網(wǎng)頁整葡,我們先學習urllib2

urllib2是Python2.x自帶的模塊(不需要下載良姆,導入即可使用)
urllib2官網(wǎng)文檔:https://docs.python.org/2/library/urllib2.html
urllib2源碼

urllib2在python3.x中被改為urllib.request

urlopen

我們先來段代碼:

#-*- coding:utf-8 -*-
#01.urllib2_urlopen.py

#導入urllib2庫

import urllib2

#向指定的url發(fā)送請求肠虽,并返回服務(wù)器的類文件對象
response = urllib2.urlopen("http://www.baidu.com")

#類文件對象支持文件對象的操作方法,如read()方法讀取文件
html = response.read()

#打印字符串
print(html)

執(zhí)行寫好的python代碼玛追,將打印結(jié)果:

python2 01.urllib2_urlopen.py 

實際上税课,如果我們在瀏覽器打上百度主頁,右鍵選擇"查看源代碼"痊剖,你會發(fā)現(xiàn)韩玩,跟我們剛才打印出來的是一模一樣的。也就是說陆馁,上面的4行代碼就已經(jīng)幫我們把百度的首頁的全部代碼爬了下來找颓。
一個基本的url請求對應(yīng)的python代碼真的非常簡單。

Request

查看官方文檔url的用法如下:

urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
    Open the URL url, which can be either a string or a Request object.

在我們第一個例子里叮贩,urlopen()的參數(shù)就是一個url地址;
但是如果需要執(zhí)行更復雜的操作叮雳,比如增加http報頭想暗,則必須創(chuàng)建一個Request實例來作為urlopen()的參數(shù);而需要訪問的url地址則作為Request實例的參數(shù)。

#-*- coding:utf-8 -*-
#02.urllib2_request.py

import urllib2

#url作為Request()方法的參數(shù)帘不,構(gòu)造并返回一個Request對象
request = urllib2.Request("http://www.baidu.com")

#Request對象作為一個urlopen()方法的參數(shù)说莫,發(fā)送給服務(wù)器并接收響應(yīng)
response = urllib2.urlopen(request)

html = response.read()

print(html)

運行結(jié)果是完全一樣的:

新建Request實例,除了必須要有url參數(shù)之外寞焙,還可以設(shè)置另外兩個參數(shù):

  1. data(默認空):是伴隨url提交的數(shù)據(jù)(比如要post的數(shù)據(jù))储狭,同時HTTP請求將從"GET"方式改為"POST"方式。
  1. headers(默認空):是一個字典捣郊,包含了需要發(fā)送的HTTP報頭的鍵值對辽狈。

這兩個參數(shù)下面會說到。

User-Agent

但是這樣直接用urllib2給一個網(wǎng)站發(fā)送請求的話呛牲,確實略有些唐突了刮萌,就好比,人家每家都有門娘扩,你以一個路人的身份直接闖進去顯然不是很禮貌着茸。而且有一些站點不喜歡被程序(非人為訪問)訪問,有可能會拒絕你的訪問請求琐旁。

但是如果我們用一個合法的身份去請求別人網(wǎng)站涮阔,顯然人家就是歡迎的,所以我們就應(yīng)該給我們的這個代碼加上一個身份灰殴,就是所謂的User-Agent頭敬特。

  • 瀏覽器就是互聯(lián)網(wǎng)世界公認被允許的身份,如果我們希望我們的爬蟲程序更像一個真實用戶牺陶,那我們第一步伟阔,就是需要偽裝成一個被公認的瀏覽器。用不同的瀏覽器在發(fā)送請求的時候掰伸,會有不同的User-Agent頭减俏。urllib2默認的User-Agent頭為:Python-urllib/x.y(x和y是Python主版本和次版本號,例如Python-urllib/2.7)
#-*- coding:utf-8 -*-
#03.urllib2_useragent.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0的User-Agent,包含ua-header里
ua_header = {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}

# url連同headers,一起構(gòu)造Request請求碱工,這個請求將附帶IE9.0瀏覽器的User-Agent
request = urllib2.Request(url, headers = ua_header)

#向服務(wù)器發(fā)送這個請求
response = urllib2.urlopen(request)

html = response.read()

print(html)

添加更多的Header信息

在HTTP Request中加入特定的Header娃承,來構(gòu)造一個完整的HTTP請求。

可以通過調(diào)用Request.add_header()添加/修改一個特定的header也可以通過調(diào)用Request.get_header()來查看已有的header怕篷。

  • 添加一個特定的header
#-*- coding:utf-8 -*-
#04.urllib2_headers.py

import urllib2

url = "http://www.itcast.cn"

#IE 9.0的User-Agent
header = {"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
request  =urllib2.Request(url, headers = header)

#也可以通過調(diào)用Request.add_header()添加/修改一個特定的header
request.add_header("Connection","keep-alive")

#也可以通過調(diào)用Request.get_header()來查看header信息
request.get_header(header_name = "Connection")

response = urllib2.urlopen(request)
print(response.code)   #可以查看響應(yīng)狀態(tài)碼

html = response.read()
print(html)
  • 隨機添加/修改User-Agent
#-*- coding:utf-8 -*-
#05.urllib2_add_headers.py

import urllib2
import random

url = "http://www.itcast.cn"

ua_list = [
    "Mozilla/5.0 (Windows NT 6.1; ) Apple.... ",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0)... ",
    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X.... ",
    "Mozilla/5.0 (Macintosh; Intel Mac OS... "
]

user_agent = random.choice(ua_list)

request = urllib2.Request(url)

#也可以通過調(diào)用Request.add_header()添加/修改一個特定的header
request.add_header("User-Agent", user_agent)

#第一個字母大寫历筝,后面的全部小寫
request.add_header("User-agent")

response = urllib2.urlopen(req)

html = response.read()

print(html)

注意

注意:The urllib2 module has been split across several modules in Python 3 named urllib.request and urllib.error

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廊谓,隨后出現(xiàn)的幾起案子梳猪,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春弥,死亡現(xiàn)場離奇詭異呛哟,居然都是意外死亡,警方通過查閱死者的電腦和手機匿沛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門扫责,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人逃呼,你說我怎么就攤上這事鳖孤。” “怎么了抡笼?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵苏揣,是天一觀的道長。 經(jīng)常有香客問我推姻,道長平匈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任藏古,我火速辦了婚禮增炭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘校翔。我一直安慰自己弟跑,他們只是感情好灾前,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布防症。 她就那樣靜靜地躺著,像睡著了一般哎甲。 火紅的嫁衣襯著肌膚如雪蔫敲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天炭玫,我揣著相機與錄音奈嘿,去河邊找鬼。 笑死吞加,一個胖子當著我的面吹牛裙犹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衔憨,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼叶圃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了践图?” 一聲冷哼從身側(cè)響起掺冠,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎码党,沒想到半個月后德崭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斥黑,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年眉厨,在試婚紗的時候發(fā)現(xiàn)自己被綠了锌奴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡缺猛,死狀恐怖缨叫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荔燎,我是刑警寧澤耻姥,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站有咨,受9級特大地震影響琐簇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜座享,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一婉商、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧渣叛,春花似錦丈秩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箫攀,卻和暖如春肠牲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背靴跛。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工缀雳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梢睛。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓肥印,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绝葡。 傳聞我的和親對象是個殘疾皇子深碱,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Python爬蟲入門(urllib+Beautifulsoup) 本文包括:1、爬蟲簡單介紹2挤牛、爬蟲架構(gòu)三大模塊3...
    廖少少閱讀 9,793評論 0 6
  • 1 先扒一個網(wǎng)頁下來看看 import urllib2response=urllib2.urlopen("http...
    Master_K閱讀 804評論 0 3
  • 一莹痢、概述 urllib2是Python的一個針對URLs的庫。他以urlopen函數(shù)的形式提供了一個非常簡單的...
    MiracleJQ閱讀 1,482評論 0 5
  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取竞膳、數(shù)據(jù)存儲航瞭、數(shù)據(jù)提取、數(shù)據(jù)分析坦辟、數(shù)據(jù)挖掘刊侯、...
    whenif閱讀 18,061評論 45 523
  • 我擁有大把時間 無聊也無助著 我會, 伴著日光清醒 隨著月色入睡 屋外的大樹也知曉我的秘密 它們沉默著锉走,堅守著 等...
    太睡閱讀 286評論 17 14