urllib2模塊的基礎(chǔ)使用

Author| 塵世gu行
??????????????????????????轉(zhuǎn)載請注明出處

urllib2 是 Python2.7 自帶的模塊(不需要下載,導(dǎo)入即可使用)
urllib2 官方文檔:https://docs.python.org/2/library/urllib2.html
urllib2 源碼:https://hg.python.org/cpython/file/2.7/Lib/urllib2.py

在 python3 中依啰,urllib2 被改為urllib.request

urlopen

我們先來段代碼:

# urllib2_urlopen.py

# 導(dǎo)入urllib2 庫
import urllib2

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

# 類文件對象支持 文件對象的操作方法,如read()方法讀取文件全部內(nèi)容速警,返回字符串
html = response.read()

# 打印字符串
print html

執(zhí)行寫的python代碼叹誉,將打印結(jié)果
實際上,如果我們在瀏覽器上打開百度主頁坏瞄, 右鍵選擇“查看源代碼”桂对,你會發(fā)現(xiàn),跟我們剛才打印出來的是一模一樣鸠匀。也就是說蕉斜,上面的4行代碼就已經(jīng)幫我們把百度的首頁的全部代碼爬了下來。
一個基本的url請求對應(yīng)的python代碼真的非常簡單缀棍。

Request

在我們第一個例子里宅此,urlopen()的參數(shù)就是一個url地址;

但是如果需要執(zhí)行更復(fù)雜的操作爬范,比如增加HTTP報頭父腕,必須創(chuàng)建一個 Request 實例來作為urlopen()的參數(shù);而需要訪問的url地址則作為 Request 實例的參數(shù)青瀑。

我們編輯urllib2_request.py

# 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(默認空):提交的Form表單數(shù)據(jù),同時 HTTP 請求方法將從默認的 "GET"方式 改為 "POST"方式哑诊。
? ?2.headers(默認空):參數(shù)為字典類型群扶,包含了需要發(fā)送的HTTP報頭的鍵值對。

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)

import urllib2

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

# IE 9.0 的 User-Agent衅枫,包含在 user_agent里
user_agent = {"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 = user_agent)

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

html = response.read()
print html 

這些復(fù)制過去就能用:
USER_AGENT_LIST = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 (like Firefox/3.x) SeaMonkey/2.0.12",
"Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0 ",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5",
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14",
"Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"
]

添加更多的Header信息

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

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

添加一個特定的header
# urllib2_headers.py

import urllib2

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

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

#也可以通過調(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
# urllib2_add_headers.py

import urllib2
import random

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

ua_list = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6"
]

user_agent = random.choice(ua_list)

request = urllib2.Request(url)

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

# get_header()的字符串參數(shù)益楼,第一個字母大寫,后面的全部小寫
request.get_header("User-agent")

response = urllib2.urlopen(request)

html = response.read()
print html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点晴,一起剝皮案震驚了整個濱河市感凤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粒督,老刑警劉巖陪竿,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屠橄,居然都是意外死亡族跛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門锐墙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礁哄,“玉大人,你說我怎么就攤上這事贮匕〗憬觯” “怎么了花枫?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵刻盐,是天一觀的道長掏膏。 經(jīng)常有香客問我,道長敦锌,這世上最難降的妖魔是什么馒疹? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任啄刹,我火速辦了婚禮由境,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘陪蜻。我一直安慰自己听想,他們只是感情好腥刹,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著汉买,像睡著了一般衔峰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蛙粘,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天垫卤,我揣著相機與錄音,去河邊找鬼出牧。 笑死穴肘,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的舔痕。 我是一名探鬼主播评抚,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赵讯!你這毒婦竟也來了盈咳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤边翼,失蹤者是張志新(化名)和其女友劉穎鱼响,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體组底,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡丈积,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了债鸡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片江滨。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厌均,靈堂內(nèi)的尸體忽然破棺而出唬滑,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布晶密,位于F島的核電站擒悬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稻艰。R本人自食惡果不足惜懂牧,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尊勿。 院中可真熱鬧僧凤,春花似錦、人聲如沸元扔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎语。三九已至吻氧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咏连,已是汗流浹背盯孙。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祟滴,地道東北人振惰。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像垄懂,于是被迫代替她去往敵國和親骑晶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355