洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
urllib2
?
1.簡介
urllib2模塊定義的函數和類用來獲取URL(主要是HTTP的),他提供一些復雜的接口用于處理: 基本認證,重定向,Cookies等。urllib2和urllib差不多,不過少了些功能,又多了些功能不僅可以使用http協議,而且可以擴展到ftp等協議,大體的用法沒什么區別
?
2.方法/屬性
大體都和urllib差不多,所以不做詳細的解析
?
3.常用方法/屬性解析
最常用的就是urllib2.urlopen()了,其參數可以用一個request的對象來代替URL(這個在前面偽造頭部信息都已經用過了),而且增加了一個URLError異常,對于HTTP協議的錯誤,增加了一個HTTPError的異常,其中這個HTTPError自動變成一個合法的response來返回。
前面說過,urlopen有兩種方式,一種是GET,一種POST,默認data=None,當為None時就是使用的GET方式,如果需要傳入data參數,就得是POST參數,在一些情況下,必須是url+?+data才行。
?前面GET的請求方式已經解析,這次就說說POST請求方式,但我也不知道咋回事一時沒想到可以POST并且符合目前難度的網站,格式樣本是這樣的:
?
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()?如果您找到有的話,自己測試吧
?
這里我只能搞個偽POST的方式來解析了。比如我要用百度搜索胡歌,但大家都知道百度網站是不需要POST任何數據就可以直接訪問,如果上一篇博文里關于如果沒看懂的話,這里也可以當作鞏固吧。先直接用瀏覽器搜索看看:
當在百度首頁輸入關鍵詞【胡歌】時,url會發生變化,把這個url復制下來看看(這里當復制url粘貼時里面的中文【胡歌】卻是一個url編碼,這也證明了之前說的url編碼不能是中文等等特殊符號的規則)
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里的紅色部分是我標記的,不是自然存在的,然后我把url整理下得到:
https://www.baidu.com/s?wd=%E8%83%A1%E6%AD%8C粘貼到瀏覽器地址欄里可以訪問同樣的網頁(粘貼到地址欄那些編碼符會自動變為中文胡歌):
好的,相信有朋友會說,既然這么簡單的一串代碼就可以搜索,百度干嘛要搞那么一大堆看不懂的東西,那些東西存在自然有其作用,絕對是有用的,不然連正常人都能想到的你覺得百度想不到嗎?只是這里我們用不到而已,好的,這問題過。
?
既然我們已經把url簡化到我們可以接受的程序,開始寫代碼。既然是偽POST,那么可以不用使用urllib2.Request方法了。
# -*- coding:utf-8 -*- import urllib import urllib2 url = 'http://www.baidu.com/s' value = {'wd':'胡歌'} #按照分析的url格式,定義關鍵詞胡歌 data = urllib.urlencode(value) #轉為url格式編碼 print dataurl = url+'?'+data #加入關鍵詞 response = urllib2.urlopen(url) #打開已加入關鍵詞的url html = response.read() #print html with open('test.html','w') as test: #將得到的代碼存入當前路徑下的test.html文檔中,方面查看test.write(response.read())?
因為如果只看網頁代碼的話,就不好對比直接用瀏覽器打開的和用程序打開的效果了,所以我們保存到一個文檔里,用文檔打開。
找到py文件所在目錄,test.html也在
雙擊打開:
看起來和瀏覽器打開不太一樣是因為當前的文件只是一個html代碼,沒有js和css樣式表作渲染,圖片也不存在。但是功能確實是實現了。
?
你想,我就是要用POST請求來用百度搜索呢?可以啊,我拿出來展示,不用你自己試了:
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結果:
【頁面不存在,報錯了】。所以確實是不行的。
?
好的那如果我只想打開那些網站有子目錄那種又怎么搞呢?比如http://www.baidu.com/test/download/test/pic? …… 像這種網站又怎么辦呢?也可以的。
比如就打開百度個人頁面,比如我的個人百度頁面:
?
把url復制出來是這樣的: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())?結果和瀏覽器打開一樣的,不展示了。
?
4.urllib和urllib2的區別和共性
urllib與urllib2并不是可以代替的,Python的urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。他們兩個最顯著的差異如下:
- urllib2可以接受一個Request對象,并以此可以來設置一個URL的headers,但是urllib只接收一個URL。這意味著,urllib不能偽裝你的用戶代理字符串等。
- urllib模塊可以提供進行urlencode的方法,該方法用于GET查詢字符串的生成,urllib2的不具有這樣的功能。這就是urllib與urllib2經常在一起使用的原因
5.異常
1)URLError異常
通常引起URLError的原因是:無網絡連接(沒有到目標服務器的路由)、訪問的目標服務器不存在。在這種情況下,異常對象會有reason屬性(是一個(錯誤碼、錯誤原因)的元組)
2)HTTPError
每一個從服務器返回的HTTP響應都有一個狀態碼。其中,有的狀態碼表示服務器不能完成相應的請求,默認的處理程序可以為我們處理一些這樣的狀態碼(如返回的響應是重定向,urllib2會自動為我們從重定向后的頁面中獲取信息)。有些狀態碼,urllib2模塊不能幫我們處理,那么urlopen函數就會引起HTTPError異常,其中典型的有404/401
?
免責聲明
本博文只是為了分享技術和共同學習為目的,并不出于商業目的和用途,也不希望用于商業用途,特此聲明。如果內容中測試的貴站站長有異議,請聯系我立即刪除
?
?
關于狀態碼,下一篇講解
轉載于:https://www.cnblogs.com/yangva/p/7772644.html
總結
以上是生活随笔為你收集整理的洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【UI自动化测试】Mac下进行Monke
- 下一篇: 微信公众号文章中图片加载时,占位图宽高大