我要偷偷的學Python,然後驚呆所有人(第七天)
前一天說了,我們今天要進入到爬蟲的學習,對,今天我們開始爬
注:本文中黑色圖片來自“風變程式設計”
如果是小白的話,可以看一下下面這一段:
歡迎來到我們的圈子
我建了一個Python學習答疑群,有興趣的朋友可以瞭解一下: 這是個什麼群
直通群的傳送門: 傳送門
初見爬蟲
我和你們大部分人都一樣,首次自己玩爬蟲,以前都是被人爬的那種。
不過呢,我也不是啥大佬,所以也不會一上來就一大堆特別高大上的爬蟲技巧呈現出來,我們一步一步來吧。
網路爬蟲,也叫網路蜘蛛(Web Spider)。它根據網頁地址(URL)爬取網頁內容,而網頁地址(URL)就是我們在瀏覽器中輸入的網站連結。比如:,它就是一個URL。
為什麼是爬蟲
通用搜尋引擎的處理物件是網際網路網頁,目前網際網路網頁的數量已達百億,所以搜尋引擎首先面臨的問題是:如何能夠設計出高效的下載系統,以將如此海量的網頁資料傳送到本地,在本地形成網際網路網頁的映象備份。
網路爬蟲能夠起到這樣的作用,完成此項艱鉅的任務,它是搜尋引擎系統中很關鍵也很基礎的構件。
舉個很常見的栗子吧:百度。
百度這家公司會源源不斷地把千千萬萬個網站爬取下來,儲存在自己的伺服器上。你在百度搜尋的本質就是在它的伺服器上搜尋資訊,你搜尋到的結果是一些超連結,在超連結跳轉之後你就可以訪問其它網站了。
通用爬蟲架構
好,上面這張圖能看明白嗎?如果不能的話,我們來再看些使用者訪問網站的流程圖:
這是一個人機互動的流程,那麼我們再來看看爬蟲在這個閉環裡面能夠取代掉哪些工作:
是吧,非常符合我們的“人工智慧”的特性,解放我們的雙手。
爬蟲的工作步驟
這就是爬蟲的工作原理啦,無論之後的學習內容怎樣變化,其核心都是爬蟲原理。
本章旨在直截了當的認識爬蟲,所以過多的不必要的概念就不引伸了。
優秀爬蟲的特性
話說優秀的程式碼好像都是這些特性。
不過有人能說出優秀架構的特性嗎?讓我眼前一亮,驚呼一聲:“大佬,帶我”
1.高效能
這裡的效能主要是指爬蟲下載網頁的抓取速度,常見的評價方式是以爬蟲每秒能夠下載的網頁數量作為效能指標,單位時間能夠下載的網頁數量越多,爬蟲的效能越高。
要提高爬蟲的效能,在設計時程式訪問磁碟的操作方法( 磁碟IO)及具體實現時 資料結構的選擇很關鍵,比如對於待抓取URL佇列和已抓取URL佇列,因為URL數量非常大,不同實現方式效能表現迥異,所以高效的資料結構對於爬蟲效能影響很大。
2.可擴充套件性
即使單個爬蟲的效能很高,要將所有網頁都下載到本地,仍然需要相當長的時間週期,為了能夠儘可能縮短抓取週期,爬蟲系統應該有很好地可擴充套件性,即很容易透過增加抓取伺服器和爬蟲數量來達到此目的。
目前實用的大型網路爬蟲一定是分散式執行的,即多臺伺服器專做抓取。每臺伺服器部署多個爬蟲,每個爬蟲多執行緒執行,透過多種方式增加併發性。
對於巨型的搜尋引擎服務商來說,可能還要在全球範圍、不同地域分別部署資料中心,爬蟲也被分配到不同的資料中心,這樣對於提高爬蟲系統的整體效能是很有幫助的。
3.健壯性
爬蟲要訪問各種型別的網站伺服器,可能會遇到很多種非正常情況:比如網頁HTML編碼不規範、 被抓取伺服器突然當機,甚至爬到陷阱裡邊去了等。爬蟲對各種異常情況能否正確處理非常重要,否則可能會不定期停止工作,這是無法忍受的。
從另外一個角度來講,假設爬蟲程式在抓取過程中死掉,或者爬蟲所在的伺服器當機,健壯的爬蟲應能做到:再次啟動爬蟲時,能夠恢復之前抓取的內容和資料結構,而不是每次都需要把所有工作完全從頭做起,這也是爬蟲健壯性的一種體現。
4.友好性
爬蟲的友好性包含兩方面的含義:一是保護網站的部分私密性;另一是減少被抓取網站的網路負載。爬蟲抓取的物件是各型別的網站,對於網站所有者來說,有些內容並不希望被所有人搜到,所以需要設定協議,來告知爬蟲哪些內容是不允許抓取的。目前有兩種主流的方法可達到此目的:爬蟲禁抓協議和網頁禁抓標記。
這一點後面會再詳細說明。
爬蟲初體驗
網路爬蟲的第一步就是根據URL,獲取網頁的HTML資訊。在Python3中,可以使用urllib.request和requests進行網頁爬取。
requests庫的基礎方法如下:
requests.get()
看一段虛擬碼:
剛剛我還在群裡跟他們說,學習Python最重要的是打基礎,從資料型別,資料結構開始。
那我們就來看看這爬蟲獲取資料的返回值是個什麼資料型別。
先隨便找個網址吧,要不就開頭那個小烏龜的網址吧:
http://photogz.photo.store.qq.com/psc?/V12wi4eb4HvNdv/ruAMsa53pVQWN7FLK88i5qLH0twfxCgrwzDJPH6IRZadTdk*QTPnqFYrVt5PNiU7vBOh1cvefk4UXqNZcMdzLWowRX1pF4GqWoBZ7YPq5AQ!/b&bo=eAFyAXgBcgERECc!
網址是長了點哈,不過可以實驗的。
結果:<class ‘requests.models.Response’>
Response物件常用的四個屬性
首先是我們的status_code,它是一個很常用的屬性,用於檢查請求出否成功,可以把它的返回值列印出來看。
接著的屬性是response.content,它能把Response物件的內容以二進位制資料的形式返回,適用於圖片、音訊、影片的下載,看個例子你就懂了。
來我們把那個小烏龜爬下來,我放在我的QQ空間裡面的:
大家也可以去爬一爬自己空間裡面的小照片。
有的朋友會問:那我要怎麼知道我的小照片網址呢?
其實也好辦:右擊小照片,新建標籤頁開啟,網址不就有了嗎。
再不行,你直接把這篇部落格上的小照片拖一下嘛,拖到新視窗去,網址就有了。
好,今天的實操大概就在這裡了。
講完了response.content,繼續看response.text,這個屬性可以把Response物件的內容以字串的形式返回,適用於文字、 網頁原始碼的下載。
看清楚啊,是原始碼。
來,隨便找個網址,比方說我這篇部落格的網址,我們來體驗一下:
接下來,我們看最後一個屬性:response.encoding,它能幫我們定義Response物件的編碼。
首先,目標資料本身是什麼編碼是未知的。用requests.get()傳送請求後,我們會取得一個Response物件,其中,requests庫會對資料的編碼型別做出自己的判斷。但是!這個判斷有可能準確,也可能不準確。
如果它判斷準確的話,我們列印出來的response.text的內容就是正常的、沒有亂碼的,那就用不到res.encoding;如果判斷不準確,就會出現一堆亂碼,那我們就可以去檢視目標資料的編碼,然後再用res.encoding把編碼定義成和目標資料一致的型別即可。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2748142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我要偷偷的學Python,然後驚呆所有人(第四天)Python
- 我要偷偷的學Python,然後驚呆所有人(第三天)Python
- 我要偷偷的學Python,然後驚呆所有人(第一天)Python
- 你要偷偷學會排查線上CPU飆高的問題,然後驚豔所有人!
- 黑客:你要悄悄變富,然後驚豔所有人……黑客
- 中國果粉要告蘋果:適用法律驚呆蘋果
- 微軟表示Win10 RedStone(紅石)版要加入讓你“驚呆”的功能微軟Win10
- 被鄰居偷偷拉了條網線到他家,然後在他裝潢WiFi,我怎麼讓他不能使用我的網路?WiFi
- 我在偷偷學Python的第十八天(匿名函式)Python函式
- 良心乾貨!如何驚呆你的面試官面試
- 手把手:我的深度學習模型訓練好了,然後要做啥?深度學習模型
- (驚呆)java反序列化漏洞—被低估的破壞之王Java
- 一位朋友來我們司面試,然後。。面試
- 傳聞:誰控制了前端入口,誰就是IT行業的主宰!看完驚呆前端行業
- 6種動態報表的應用和製作,偷偷學會,年底驚豔領導和同事
- 地產大佬潘石屹:人生苦短,我要學PythonPython
- 如果我是小白,學Python要準備什麼呢?Python
- 我是怎樣克服對 React 的恐懼,然後愛上 React 的React
- 用 python 偷偷給班級群女同學的顏值進行排名Python
- 我用 Python 找出了刪除我微信的所有人並將他們自動化刪除了Python
- 學Python好久都學不會?然後選擇放棄,總結出這幾個原因Python
- 攤牌了,作為開發者,我經常用這14個 Github 偷偷學習Github
- 人生苦短,要學Python!Python
- 震驚!我勸你別盲目跟風學Python!網友:求求別在刷屏了...Python
- CSS: 試試,然後做的更好CSS
- 防呆設計/防呆處理
- 為什麼我要學習“機器學習”?機器學習
- 呆瓜呆呆的專欄stream學習連結
- 我想立刻辭職,然後閉關學習程式語言,我給自己3個月時間學習C語言!這樣行的通嗎...C語言
- 如何應用“防呆法”的原理於我們的工作上?
- 我的Java後端學習之路Java後端
- 所有人都能學會用Python寫出RNN-LSTM程式碼PythonRNN
- 和ChatGPT聊了一會天它的學習反映能力驚呆了我ChatGPT
- 陣列物件的去重然後排序陣列物件排序
- 為什麼要選擇學習python?學習python的原因!Python
- 我的 Python 網路爬蟲直播分享要來了!Python爬蟲
- 別讓使用者發呆—設計中的防呆策略
- 誰動了我的資料?如何防止資料偷偷溜走?