互聯網上,公開數據(各類網頁)都是以http(或加密的http即https)協議傳輸的。因此,咱們這裏介紹的爬蟲技術都是基於http(https)協議的爬蟲。css
在Python的模塊海洋裏,支持http協議的模塊是至關豐富的,既有官方的urllib,也有大名鼎鼎的社區(第三方)模塊 requests。它們都很好的封裝了http協議請求的各類方法,所以,咱們只須要熟悉這些模塊的用法,再也不進一步討論http協議自己。 html
你們對瀏覽器應該一點都不陌生,能夠說,只要上過網的人都知道瀏覽器。但是,明白瀏覽器各類原理的人可不必定多。python
做爲要開發爬蟲的小夥伴,是必定必定要明白瀏覽器的工做原理的。這是你寫爬蟲的必備工具,別無他。web
你們在面試的時候,有沒有遇到這麼一個很是宏觀而又到處細節的解答題:面試
這真是一個考驗知識面的題啊,經驗老道的老猿既能夠口若懸河的講上三天三夜,也能夠提煉出幾分鐘的精華講個大概。你們恐怕對整個過程就只知其一;不知其二了。ajax
巧的是,對這個問題理解的越透徹,越對寫爬蟲有幫助。換句話說,爬蟲是一個考驗綜合技能的領域。那麼,你們準備好迎接這個綜合技能挑戰了嗎?django
廢話很少說,咱們就從解答這個題目開始,認識瀏覽器和服務器,看看這中間有哪些知識是爬蟲要用到的。編程
前面也說過,這個問題能夠講上三天三夜,但咱們沒那麼多時間,其中一些細節就略過,把大體流程結合爬蟲講一講,分紅三部分:瀏覽器
在瀏覽器地址欄輸入網址後回車,瀏覽器請服務器提出網頁請求,也就是告訴服務器,我要看你的某個網頁。 上面短短一句話,蘊藏了無數玄機啊,讓我不得不費點口舌一一道來。主要講述:緩存
首先,瀏覽器要判斷你輸入的網址(URL)是否合法有效。對應URL,小猿們並不陌生吧,以http(s)開頭的那一長串的字符,可是你知道它還能夠以ftp, mailto, file, data, irc開頭嗎?下面是它最完整的語法格式:
URI = scheme:[//authority]path[?query][#fragment] # 其中, authority 又是這樣的: authority = [userinfo@]host[:port] # userinfo能夠同時包含user name和password,以:分割 userinfo = [user_name:password]
用圖更形象的表現處理就是這樣的:
經驗之談:要判斷URL的合法性
Python裏面能夠用urllib.parse來進行URL的各類操做
In [1]: import urllib.parse In [2]: url = 'http://dachong:the_password@www.yuanrenxue.com/user/info?page=2' In [3]: zz = urllib.parse.urlparse(url) Out[4]: ParseResult(scheme='http', netloc='dachong:the_password@www.yuanrenxue.com', path='/user/info', params='', query='page=2', fragment='')
咱們看到,urlparse函數把URL分析成了6部分: scheme://netloc/path;params?query#fragment 須要主要的是 netloc 並不等同於 URL 語法定義中的host
上面URL定義中的host,就是互聯網上的一臺服務器,它能夠是一個IP地址,但一般是咱們所說的域名。域名經過DNS綁定到一個(或多個)IP地址上。瀏覽器要訪問某個域名的網站就要先經過DNS服務器解析域名,獲得真實的IP地址。 這裏的域名解析通常是由操做系統完成的,爬蟲不須要關心。然而,當你寫一個大型爬蟲,像Google、百度搜索引擎那樣的爬蟲的時候,效率變得很主要,爬蟲就要維護本身的DNS緩存。 老猿經驗:大型爬蟲要維護本身的DNS緩存
瀏覽器得到了網站服務器的IP地址,就能夠向服務器發送請求了。這個請求就是遵循http協議的。寫爬蟲須要關心的就是http協議的headers,下面是訪問 en.wikipedia.org/wiki/URL 時瀏覽器發送的請求 headers:
可能已經從圖中看出來些端倪,發送的http請求頭是相似一個字典的結構:
這也是爬蟲很關心的部分。好比,你須要獲得手機版頁面,就要設置瀏覽器身份標識爲手機瀏覽器的user-agent。
經驗之談: 經過設置headers跟服務器溝通
若是咱們在瀏覽器地址欄輸入一個網頁網址(不是文件下載地址),回車後,很快就看到了一個網頁,裏面包含排版文字、圖片、視頻等數據,是一個豐富內容格式的頁面。然而,我經過瀏覽器查看源代碼,看到的倒是一對文本格式的html代碼。
沒錯,就是一堆的代碼,卻讓瀏覽器給渲染成了漂亮的網頁。這對代碼裏面有:
而咱們想要爬取的信息就藏在html代碼中,咱們能夠經過解析方法提取其中咱們想要的內容。若是html代碼裏面沒有咱們想要的數據,可是在網頁裏面卻看到了,那就是瀏覽器經過ajax請求異步加載(偷偷下載)了那部分數據。
這個時候,咱們就要經過觀察瀏覽器的加載過程來發現具體是哪一個ajax請求加載了咱們須要的數據。
若是你依然在編程的世界裏迷茫,不知道本身的將來規劃,能夠加入咱們的Python學習扣qun:784758214,看看前輩們是如何學習的!交流經驗! 本身是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、人工智能、數據挖掘等,零基礎到項目實戰的資料都有整理。 送給每一位python的小夥伴!分享一些學習的方法和須要注意的小細節,這裏是python學習者彙集地
點擊:python技術分享