Python 爬蟲入門(一)urllib的基本使用

參考資料
1.用python開發(fā)爬蟲 https://www.gitbook.com/book/germey/python3webspider/details
2.論一只爬蟲的自我修養(yǎng) http://blog.fishc.com/category/python/spider
3.Python爬蟲學(xué)習(xí)系列教程 http://cuiqingcai.com/1052.html
4.Beautiful Soup 4.2.0 中文文檔 https://wizardforcel.gitbooks.io/bs4-doc/content/
5.Requests: 讓 HTTP 服務(wù)人類 http://docs.python-requests.org/zh_CN/latest/

前言:
urllib包含四個(gè)模塊:

  • urllib.request可以用來發(fā)送request和獲取request的結(jié)果
  • urllib.error包含了urllib.request產(chǎn)生的異常
  • urllib.parse用來解析和處理URL
  • urllib.robotparse用來解析頁面的robots.txt文件
1. urllib.request的基本使用方法屬性
1.1. 使用urllib.request.urlopen()來爬取網(wǎng)頁
In [1]: import urllib.request
In [2]: r=urllib.request.urlopen('http://blog.fishc.com/3597.html')
In [3]: r.read().decode('utf-8')
Out[3]: '<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"><head profile="http://gmpg.org/xfn/11">\n<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\n<title>論一只爬蟲的自我修養(yǎng)2:實(shí)戰(zhàn) – 零基礎(chǔ)入門學(xué)習(xí)Python054 | 魚C工作室</title>\n<meta name="description" content="論一只爬蟲的自我修養(yǎng)2:實(shí)戰(zhàn)" />\n<meta name="keywords" content="Python3下載網(wǎng)頁,Python3爬蟲,Python3蜘蛛,urllib" />\n<link rel="stylesheet" type="......
In [4]: type(r)
Out[4]: http.client.HTTPResponse

可以看到潜慎,使用urllib.request.urlopen()返回的對(duì)象是一個(gè)http.client.HTTPResponse類型的對(duì)象屑宠,它主要包含的方法有read(),readinto(),getheader(name),getheaders(),fileno()等函數(shù)和msg,versionstatus,reason,debuglevel,closed等屬性。

In [8]: r.getheaders()
Out[8]: 
[('Date', 'Sun, 19 Feb 2017 13:08:21 GMT'),
 ('Content-Type', 'text/html; charset=UTF-8'),
 ('Transfer-Encoding', 'chunked'),
 ('Connection', 'close'),
 ('Set-Cookie', 'acw_tc=AQAAANMMjDotOggAUUhyyn/OUgglngLJ; Path=/; HttpOnly'),
 ('Server', 'Fishc'),
 ('Vary', 'Accept-Encoding'),
 ('X-Powered-By', 'PHP/5.6.15'),
 ('X-Pingback', 'http://blog.fishc.com/xmlrpc.php'),
 ('Link', '<http://blog.fishc.com/?p=3597>; rel=shortlink')]
In [9]: r.getheader('server')
Out[9]: 'Fishc'
In [10]: r.status
Out[10]: 200

urllib.request.urlopen()使用具體參數(shù)如下:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

(1)使用data參數(shù)可發(fā)起數(shù)據(jù)提交請(qǐng)求们镜,相當(dāng)于post,詳細(xì)見文章最后實(shí)戰(zhàn)代碼。
(2)使用timeout參數(shù)可以限定超時(shí)時(shí)間组橄,超過則報(bào)錯(cuò)衣吠,默認(rèn)不設(shè)置,表示始終請(qǐng)求直至手動(dòng)關(guān)閉程序小压。
(3)context參數(shù)线梗,它必須是ssl.SSLContext類型,用來指定SSL設(shè)置怠益。cafile和capath兩個(gè)參數(shù)是指定CA證書和它的路徑仪搔,這個(gè)在請(qǐng)求HTTPS鏈接時(shí)會(huì)有用。cadefault參數(shù)現(xiàn)在已經(jīng)棄用了蜻牢,默認(rèn)為False烤咧。

1.2 修改head或者使用代理來防止爬蟲被服務(wù)器阻攔

使用爬蟲對(duì)網(wǎng)頁發(fā)起請(qǐng)求時(shí),若訪問量過大則常常會(huì)被服務(wù)器阻攔抢呆,此時(shí)可通過修改headers或者使用代理進(jìn)行訪問煮嫌。
1.修改headers方法有兩種:(1)通過Request的headers參數(shù)來進(jìn)行修改 (2)通過Request.add_header()方法來進(jìn)行添加headers。

# (1)通過Request的headers參數(shù)來進(jìn)行修改
head={}
head['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
request=urllib.request.Request(url, data, head)     # 創(chuàng)建一個(gè)Request對(duì)象
response=urllib.request.urlopen(request)  # 爬取網(wǎng)頁

# (2)通過`Request.add_header()`方法來進(jìn)行添加head
request=urllib.request.Request(url, data)     # 創(chuàng)建一個(gè)Request對(duì)象
 # 添加head
request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')  
response=urllib.request.urlopen(request)  # 爬取網(wǎng)頁

2.使用代理來進(jìn)行爬蟲可簡單分為3步:

# (1)參數(shù)是一個(gè)字典{'類型':'代理ip:端口號(hào)'}
proxy_support=urllib.request.ProxyHandler({})

# (2)定制抱虐、創(chuàng)建一個(gè)opener(代理)
opener=urllib.request.build_opener(proxy_support)
# opener也可以添加head信息
opener.addheaders=[('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')]

# (3a)安裝opener昌阿,安裝后以后訪問都會(huì)使用此代理
urllib.request.install_opener(opener)

# (3b)不安裝,調(diào)用opener(也即代理)來打開網(wǎng)頁
opener.open(url)

# opener也可以添加head信息

2. 使用urllib.error處理異常

主要異常詳見使用urllib.error處理異常.
這里主要了解下try,except用法:

import urllib.request
import urllib.error
try:    
   response=urllib.request.urlopen('http://suibiankankan.com')
except urllib.error.URLError as e:
   print(e.reason)

# [Errno -2] Name or service not known   
3. 使用urllib.parse解析鏈接

使用urllib.parse.urlparse()進(jìn)行鏈接解析恳邀,拆解鏈接的各部分內(nèi)容懦冰。

In [17]: import urllib.parse
In [19]: result = urllib.parse.urlparse('http://www.baidu.com/index.html;user?id=5#comment')
In [20]: type(result)
Out[20]: urllib.parse.ParseResult
In [21]: result
Out[21]: ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
In [22]: result[1]
Out[22]: 'www.baidu.com'
In [24]: result.netloc
Out[24]: 'www.baidu.com'

觀察可以看到,返回結(jié)果是一個(gè)ParseResult類型的對(duì)象轩娶,它包含了六個(gè)部分儿奶,分別是schemenetloc鳄抒、path闯捎、paramsquery许溅、fragment瓤鼻。使用索引或者屬性可以查看解析結(jié)果。
由上可以得出一個(gè)標(biāo)準(zhǔn)的鏈接格式如下:

scheme://netloc/path;parameters?query#fragment

使用urllib.parse.urlunparse()可以將幾個(gè)部分連接起來贤重。

In [25]: data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
In [26]: urllib.parse.urlunparse(data)
Out[26]: 'http://www.baidu.com/index.html;user?a=6#comment'

其他的一些方法:
(1)urllib.parse.urlsplit()茬祷,這個(gè)和urlparse()方法非常相似,只不過它不會(huì)單獨(dú)解析parameters這一部分并蝗,只返回五個(gè)結(jié)果祭犯。上面例子中的parameters會(huì)合并到path中秸妥。
(2)urllib.parse.urlunsplit(),與urlunparse()類似沃粗,也是將鏈接的各個(gè)部分組合成完整鏈接的方法粥惧,傳入的也是一個(gè)可迭代對(duì)象。 例如list最盅、tuple等等突雪,唯一的區(qū)別是,長度必須為5涡贱。
(3)urllib.parse.urljoin()咏删,利用urljoin()方法我們可以提供一個(gè)base_url(基礎(chǔ)鏈接),新的鏈接作為第二個(gè)參數(shù)问词,方法會(huì)分析base_url的scheme督函、netloc、path這三個(gè)內(nèi)容對(duì)新鏈接缺失的部分進(jìn)行補(bǔ)充戏售,作為結(jié)果返回侨核。如果這三項(xiàng)在新的鏈接里面不存在,那么就予以補(bǔ)充灌灾,如果新的鏈接存在,那么就使用新的鏈接的部分悲柱。base_url中的parameters锋喜、query、fragments是不起作用的豌鸡。

In [27]: urllib.parse.urljoin('http://www.baidu.com', 'FAQ.html')
Out[27]: 'http://www.baidu.com/FAQ.html'
4. 使用urllib.robotparser分析robots協(xié)議

robots協(xié)議也被稱作爬蟲協(xié)議嘿般、機(jī)器人協(xié)議,它的全名叫做網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)(Robots Exclusion Protocol)涯冠,同來告訴爬蟲和搜索引擎哪些頁面可以抓取炉奴,哪些不可以抓取。它通常是一個(gè)叫做robots.txt的文本文件蛇更,放在網(wǎng)站的根目錄下瞻赶。
當(dāng)一個(gè)搜索蜘蛛訪問一個(gè)站點(diǎn)時(shí),它首先會(huì)檢查下這個(gè)站點(diǎn)根目錄下是否存在robots.txt文件派任,如果存在砸逊,搜索蜘蛛會(huì)根據(jù)其中定義的爬取范圍來爬取。如果沒有找到這個(gè)文件掌逛,那么搜索蜘蛛便會(huì)訪問所有可直接訪問的頁面师逸。

User-agent: *
Disallow: /
Allow: /public/

以上的兩行實(shí)現(xiàn)了對(duì)所有搜索蜘蛛只允許爬取public目錄的作用。
如上簡單的兩行豆混,保存成robots.txt文件篓像,放在網(wǎng)站的根目錄下动知,和網(wǎng)站的入口文件放在一起。比如index.php员辩、index.html拍柒、index.jsp等等。
那么上面的User-agent就描述了搜索蜘蛛的名稱屈暗,在這里將值設(shè)置為*拆讯,則代表該協(xié)議對(duì)任何的爬取蜘蛛有效。比如你可以設(shè)置User-agent: Baiduspider养叛,就代表我們?cè)O(shè)置的規(guī)則對(duì)百度搜索引擎是有效的种呐。如果有多條User-agent記錄,則就會(huì)有多個(gè)爬取蜘蛛會(huì)受到爬取限制弃甥,但你至少需要指定一條爽室。
Disallow指定了不允許抓取的目錄,比如上述例子中設(shè)置為/則代表不允許抓取所有頁面淆攻。
Allow它一般和Disallow一起使用阔墩,一般不會(huì)單獨(dú)使用,現(xiàn)在我們?cè)O(shè)置為/public/瓶珊,起到的作用是所有頁面不允許抓取啸箫,但是public目錄是可以抓取的。

urllib.robotparser提供了一個(gè)類伞芹,叫做RobotFileParser忘苛。它可以根據(jù)某網(wǎng)站的robots.txt文件來判斷一個(gè)爬取蜘蛛是否有權(quán)限來爬取這個(gè)網(wǎng)頁。
使用方法:

urllib.robotparser.RobotFileParser(url='')

例子:

rom urllib.robotparser import RobotFileParser

rp = RobotFileParser('http://www.reibang.com/robots.txt')
rp.read()
print(rp.can_fetch('*', 'http://www.reibang.com/p/b67554025d7d'))
print(rp.can_fetch('*', "http://www.reibang.com/search?q=python&page=1&type=collections"))

# True
# False

以上簡單介紹urllib的簡單用法唱较,下面給出一個(gè)實(shí)戰(zhàn)例子扎唾,交互式有道翻譯請(qǐng)求:

import urllib.request
import urllib.parse
import json

url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=https://www.google.com.hk/'
data=dict()
data['type']='AUTO'
data['i']=input("Plz input what you want to translate: ")
data['doctype']='json'
data['xmlVersion']='1.8'
data['keyfrom']='fanyi.web'
data['ue']='UTF-8'
data['action']='FY_BY_CLICKBUTTON'
data['typoResult']='true'
data=urllib.parse.urlencode(data).encode('utf-8')
# 必須對(duì)data進(jìn)行轉(zhuǎn)碼

response=urllib.request.urlopen(url,data)
html=response.read().decode('utf-8')

target=json.loads(html)

print('翻譯結(jié)果:',target['translateResult'][0][0]['tgt'])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市南缓,隨后出現(xiàn)的幾起案子胸遇,更是在濱河造成了極大的恐慌,老刑警劉巖汉形,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纸镊,死亡現(xiàn)場離奇詭異,居然都是意外死亡获雕,警方通過查閱死者的電腦和手機(jī)薄腻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來届案,“玉大人庵楷,你說我怎么就攤上這事。” “怎么了尽纽?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵咐蚯,是天一觀的道長。 經(jīng)常有香客問我弄贿,道長春锋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任差凹,我火速辦了婚禮期奔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘危尿。我一直安慰自己呐萌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布谊娇。 她就那樣靜靜地躺著肺孤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪济欢。 梳的紋絲不亂的頭發(fā)上赠堵,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音法褥,去河邊找鬼茫叭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛挖胃,可吹牛的內(nèi)容都是我干的杂靶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼酱鸭,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了垛吗?” 一聲冷哼從身側(cè)響起凹髓,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怯屉,沒想到半個(gè)月后蔚舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锨络,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年赌躺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羡儿。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡礼患,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缅叠,我是刑警寧澤悄泥,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布弹囚,位于F島的核電站鸥鹉,受9級(jí)特大地震影響庶骄,放射性物質(zhì)發(fā)生泄漏瓢姻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望儡嘶。 院中可真熱鬧恍风,春花似錦朋贬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至廷没,卻和暖如春垂寥,著一層夾襖步出監(jiān)牢的瞬間另锋,已是汗流浹背盏缤。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留台舱,地道東北人竞惋。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓拆宛,卻偏偏與公主長得像浑厚,于是被迫代替她去往敵國和親钳幅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炎滞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • 1 前言 作為一名合格的數(shù)據(jù)分析師钠导,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取森瘪、數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)提取扼睬、數(shù)據(jù)分析湃望、數(shù)據(jù)挖掘痰驱、...
    whenif閱讀 18,070評(píng)論 45 523
  • 本內(nèi)容為《用Python寫網(wǎng)絡(luò)爬蟲》書籍內(nèi)容瞳浦,有興趣的讀者可以購買本書担映,本章的代碼皆可在Python3中運(yùn)行。為了...
    海人為記閱讀 2,248評(píng)論 0 5
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬蟲入門教程一 安裝和基本使用Scr...
    inke閱讀 35,295評(píng)論 7 93
  • 對(duì)電視劇蝇完,對(duì)讀書,對(duì)工作,對(duì)興趣短蜕,一切都是半拉柯基氢架。讀透朋魔,讀懂岖研,那太慢了孙援。 可是有那么多的東西都想看看扇雕,也是浮光掠...
    金地陽光閱讀 1,300評(píng)論 0 0
  • 曾有朋友和我說過础淤,不談以后。因?yàn)椤耙院蟆笔怯擅恳粋€(gè)“現(xiàn)在”組成的:如果現(xiàn)在都不能做好哨苛,又何來得以后吱瘩,所以想做的事,...
    向應(yīng)昌閱讀 1,106評(píng)論 5 23