洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
urllib2
?
1.簡(jiǎn)介
urllib2模塊定義的函數(shù)和類用來獲取URL(主要是HTTP的),他提供一些復(fù)雜的接口用于處理: 基本認(rèn)證,重定向,Cookies等。urllib2和urllib差不多,不過少了些功能,又多了些功能不僅可以使用http協(xié)議,而且可以擴(kuò)展到ftp等協(xié)議,大體的用法沒什么區(qū)別
?
2.方法/屬性
大體都和urllib差不多,所以不做詳細(xì)的解析
?
3.常用方法/屬性解析
最常用的就是urllib2.urlopen()了,其參數(shù)可以用一個(gè)request的對(duì)象來代替URL(這個(gè)在前面?zhèn)卧祛^部信息都已經(jīng)用過了),而且增加了一個(gè)URLError異常,對(duì)于HTTP協(xié)議的錯(cuò)誤,增加了一個(gè)HTTPError的異常,其中這個(gè)HTTPError自動(dòng)變成一個(gè)合法的response來返回。
前面說過,urlopen有兩種方式,一種是GET,一種POST,默認(rèn)data=None,當(dāng)為None時(shí)就是使用的GET方式,如果需要傳入data參數(shù),就得是POST參數(shù),在一些情況下,必須是url+?+data才行。
?前面GET的請(qǐng)求方式已經(jīng)解析,這次就說說POST請(qǐng)求方式,但我也不知道咋回事一時(shí)沒想到可以POST并且符合目前難度的網(wǎng)站,格式樣本是這樣的:
?
import urllib import urllib2 url = 'http://XXX.XXX' values = {'username' : 'yang', 'passwd' : '123456'} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) html = response.read()?如果您找到有的話,自己測(cè)試吧
?
這里我只能搞個(gè)偽POST的方式來解析了。比如我要用百度搜索胡歌,但大家都知道百度網(wǎng)站是不需要POST任何數(shù)據(jù)就可以直接訪問,如果上一篇博文里關(guān)于如果沒看懂的話,這里也可以當(dāng)作鞏固吧。先直接用瀏覽器搜索看看:
當(dāng)在百度首頁(yè)輸入關(guān)鍵詞【胡歌】時(shí),url會(huì)發(fā)生變化,把這個(gè)url復(fù)制下來看看(這里當(dāng)復(fù)制url粘貼時(shí)里面的中文【胡歌】卻是一個(gè)url編碼,這也證明了之前說的url編碼不能是中文等等特殊符號(hào)的規(guī)則)
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=%E8%83%A1%E6%AD%8C&oq=python%2520urllib2%25E6%25A8%25A1%25E5%259D%2597&rsv_pq=f4f84a020000fe90&rsv_t=98dfd%2FbHG%2BUUjRN7tUwz%2FmgPVkJbNptcPgEj1KyNIHVmkPAjs660ximJgiTjTN7Curbt&rqlang=cn&rsv_enter=1&rsv_sug3=2&rsv_sug1=2&rsv_sug7=100&rsv_sug2=0&inputT=850&rsv_sug4=1543看到這種格式了嗎?上面url里的紅色部分是我標(biāo)記的,不是自然存在的,然后我把url整理下得到:
https://www.baidu.com/s?wd=%E8%83%A1%E6%AD%8C粘貼到瀏覽器地址欄里可以訪問同樣的網(wǎng)頁(yè)(粘貼到地址欄那些編碼符會(huì)自動(dòng)變?yōu)橹形暮?#xff09;:
好的,相信有朋友會(huì)說,既然這么簡(jiǎn)單的一串代碼就可以搜索,百度干嘛要搞那么一大堆看不懂的東西,那些東西存在自然有其作用,絕對(duì)是有用的,不然連正常人都能想到的你覺得百度想不到嗎?只是這里我們用不到而已,好的,這問題過。
?
既然我們已經(jīng)把url簡(jiǎn)化到我們可以接受的程序,開始寫代碼。既然是偽POST,那么可以不用使用urllib2.Request方法了。
# -*- coding:utf-8 -*- import urllib import urllib2 url = 'http://www.baidu.com/s' value = {'wd':'胡歌'} #按照分析的url格式,定義關(guān)鍵詞胡歌 data = urllib.urlencode(value) #轉(zhuǎn)為url格式編碼 print dataurl = url+'?'+data #加入關(guān)鍵詞 response = urllib2.urlopen(url) #打開已加入關(guān)鍵詞的url html = response.read() #print html with open('test.html','w') as test: #將得到的代碼存入當(dāng)前路徑下的test.html文檔中,方面查看test.write(response.read())?
因?yàn)槿绻豢淳W(wǎng)頁(yè)代碼的話,就不好對(duì)比直接用瀏覽器打開的和用程序打開的效果了,所以我們保存到一個(gè)文檔里,用文檔打開。
找到py文件所在目錄,test.html也在
雙擊打開:
看起來和瀏覽器打開不太一樣是因?yàn)楫?dāng)前的文件只是一個(gè)html代碼,沒有js和css樣式表作渲染,圖片也不存在。但是功能確實(shí)是實(shí)現(xiàn)了。
?
你想,我就是要用POST請(qǐng)求來用百度搜索呢?可以啊,我拿出來展示,不用你自己試了:
import urllib import urllib2 url = 'http://www.baidu.com/s?' values = {'wd' : '胡歌' } data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) html = response.read() print html結(jié)果:
【頁(yè)面不存在,報(bào)錯(cuò)了】。所以確實(shí)是不行的。
?
好的那如果我只想打開那些網(wǎng)站有子目錄那種又怎么搞呢?比如http://www.baidu.com/test/download/test/pic? …… 像這種網(wǎng)站又怎么辦呢?也可以的。
比如就打開百度個(gè)人頁(yè)面,比如我的個(gè)人百度頁(yè)面:
?
把url復(fù)制出來是這樣的:https://www.baidu.com/p/%E7%9B%97%E5%A2%93%E8%80%8518,這里并沒有【s?】和【wd=】之類的,怎么搞呢?
?
# -*- coding:utf-8 -*- import urllib import urllib2url = 'http://www.baidu.com/p' value = {'wd':'盜墓者18'} data =urllib.urlencode(value).replace('wd=','') #把不需要的用replace去除就行 print dataurl = url+'/'+data print url response = urllib2.urlopen(url) with open('baiduperson.html','w') as test:test.write(response.read())?結(jié)果和瀏覽器打開一樣的,不展示了。
?
4.urllib和urllib2的區(qū)別和共性
urllib與urllib2并不是可以代替的,Python的urllib和urllib2模塊都做與請(qǐng)求URL相關(guān)的操作,但他們提供不同的功能。他們兩個(gè)最顯著的差異如下:
- urllib2可以接受一個(gè)Request對(duì)象,并以此可以來設(shè)置一個(gè)URL的headers,但是urllib只接收一個(gè)URL。這意味著,urllib不能偽裝你的用戶代理字符串等。
- urllib模塊可以提供進(jìn)行urlencode的方法,該方法用于GET查詢字符串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經(jīng)常在一起使用的原因
5.異常
1)URLError異常
通常引起URLError的原因是:無網(wǎng)絡(luò)連接(沒有到目標(biāo)服務(wù)器的路由)、訪問的目標(biāo)服務(wù)器不存在。在這種情況下,異常對(duì)象會(huì)有reason屬性(是一個(gè)(錯(cuò)誤碼、錯(cuò)誤原因)的元組)
2)HTTPError
每一個(gè)從服務(wù)器返回的HTTP響應(yīng)都有一個(gè)狀態(tài)碼。其中,有的狀態(tài)碼表示服務(wù)器不能完成相應(yīng)的請(qǐng)求,默認(rèn)的處理程序可以為我們處理一些這樣的狀態(tài)碼(如返回的響應(yīng)是重定向,urllib2會(huì)自動(dòng)為我們從重定向后的頁(yè)面中獲取信息)。有些狀態(tài)碼,urllib2模塊不能幫我們處理,那么urlopen函數(shù)就會(huì)引起HTTPError異常,其中典型的有404/401
?
免責(zé)聲明
本博文只是為了分享技術(shù)和共同學(xué)習(xí)為目的,并不出于商業(yè)目的和用途,也不希望用于商業(yè)用途,特此聲明。如果內(nèi)容中測(cè)試的貴站站長(zhǎng)有異議,請(qǐng)聯(lián)系我立即刪除
?
?
關(guān)于狀態(tài)碼,下一篇講解
轉(zhuǎn)載于:https://www.cnblogs.com/yangva/p/7772644.html
總結(jié)
以上是生活随笔為你收集整理的洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【UI自动化测试】Mac下进行Monke
- 下一篇: 微信公众号文章中图片加载时,占位图宽高大