4.25(第一天)
**
第0關 認識爬蟲
**
1、初始爬蟲
爬蟲,從本質上來說,就是利用程式在網上拿到對我們有價值的資料,
2、明晰路徑
2-1、瀏覽器作業原理
(1)決議資料:當服務器把資料回應給瀏覽器之后,瀏覽器并不會直接把資料丟給我們,因為這些資料是用計算機的語言寫的,瀏覽器還要把這些資料翻譯成我們能看得懂的內容;
(2)提取資料:我們就可以在拿到的資料中,挑選出對我們有用的資料;
(3)存盤資料:將挑選出來的有用資料保存在某一檔案/資料庫中,
2-2、爬蟲作業原理
(1)獲取資料:爬蟲程式會根據我們提供的網址,向服務器發起請求,然后回傳資料;
(2)決議資料:爬蟲程式會把服務器回傳的資料決議成我們能讀懂的格式;
(3)提取資料:爬蟲程式再從中提取出我們需要的資料;
(4)儲存資料:爬蟲程式把這些有用的資料保存起來,便于你日后的使用和分析,
3、體驗爬蟲
3-1、requests.get()
①、安裝 requests 庫
Mac電腦里打開終端軟體(terminal),輸入pip3 install requests,然后點擊 enter;
Windows電腦里叫命令提示符(cmd),輸入pip install requests ,
提示:往后安裝其他庫時與上方類似,pip install 模塊名
②、requests 庫作用
requests 庫可以幫我們下載網頁源代碼、文本、圖片,甚至是音頻,其實,“下載”本質上是向服務器發送請求并得到回應,
③、requests 庫使用
選擇語言
res = requests.get(‘URL’)
requests.get 是在呼叫requests庫中的get()方法,它向服務器發送了一個請求,括號里的引數是你需要的資料所在的網址,然后服務器對請求作出了回應,我們把這個回應回傳的結果賦值在變數res上,
3-2、Response物件的常用屬性
①、response.status_code
列印 response 的回應狀態碼,以檢查請求是否成功,
②、response.content
把 Response 物件的內容以二進制資料的形式回傳,適用于圖片、音頻、視頻的下載,
③、response.text
把 Response 物件的內容以字串的形式回傳,適用于文字、網頁源代碼的下載,
④、response.encoding
能幫我們定義Response物件的編碼,(遇上文本的亂碼問題,才考慮用res.encoding)
3-3、匯總圖解
4、爬蟲倫理
4-1、Robots 協議
Robots 協議是互聯網爬蟲的一項公認的道德規范,它的全稱是“網路爬蟲排除標準”(Robots exclusion protocol),這個協議用來告訴爬蟲,哪些頁面是可以抓取的,哪些不可以,
4-2、協議查看
(1)在網站的域名后加上/robots.txt就可以了,如淘寶的robots協議 ( http://www.taobao.com/robots.txt);
(2)協議里最常出現的英文是Allow和Disallow,Allow代表可以被訪問,Disallow代表禁止被訪問,
目錄
1、初始爬蟲
2、明晰路徑
2-1、瀏覽器作業原理
2-2、爬蟲作業原理
3、體驗爬蟲
3-1、requests.get()
3-2、Response物件的常用屬性
3-3、匯總圖解
4、爬蟲倫理
4-1、Robots 協議
4-2、協議查看
程中我們的示范,會用谷歌瀏覽器(Chrome)進行演示,強烈推薦你也使用它,
如果你還沒有谷歌瀏覽器(Chrome),打開下面的鏈接,就可以下載Chrome的安裝包了,Windows和Mac都有:谷歌瀏覽器(Chrome)安裝教程(https://www.google.cn/intl/zh-CN/chrome/)
初識爬蟲
什么是爬蟲?
到底什么是爬蟲呢?
爬蟲,從本質上來說,就是利用程式在網上拿到對我們有價值的資料,
爬蟲能做很多事,能做商業分析,也能做生活助手,比如:分析北京近兩年二手房成交均價是多少?深圳的Python工程師平均薪資是多少?北京哪家餐廳粵菜最好吃?等等,
這是個人利用爬蟲所做到的事情,而公司,同樣可以利用爬蟲來實作巨大的商業價值,比如你所熟悉的搜索引擎——百度和谷歌,它們的核心技術之一也是爬蟲,而且是超級爬蟲,
以百度為例,你在搜索的時候仔細看,會發現每個搜索結果下面都有一個百度快照,

點擊百度快照,你會發現網址的開頭有baidu這個詞,也就是說這個網頁屬于百度,

這是因為,百度這家公司會源源不斷地把千千萬萬個網站爬取下來,存盤在自己的服務器上,你在百度搜索的本質就是在它的服務器上搜索資訊,你搜索到的結果是一些超鏈接,在超鏈接跳轉之后你就可以訪問其它網站了,
爬蟲還讓這些搜索巨頭有機會朝著人工智能的未來邁進,因為人工智能的發展離不開海量的資料,而每天使用這些搜索網站的用戶都是數以億計的,產生的資料自然也是難以計量的,
從搜索巨頭到人工智能巨頭,這是一條波瀾壯闊的路,而我們應該看到,事情的源頭,卻是我們今日所書寫的“爬蟲”,
我們會通過一個網站:人人都是蜘蛛俠 來學習瀏覽器的作業原理,(這是我們自己搭建的網站,方便教學和實操)


首先,我們在瀏覽器的地址欄輸入網址(也可以叫URL),然后,瀏覽器向服務器傳達了我們想訪問某個網頁的需求,這個程序就叫做【請求】,
緊接著,服務器把你想要的網站資料發送給瀏覽器,這個程序叫做【回應】,
所以瀏覽器和服務器之間,先請求,后回應,有這么一層關系,
爬蟲的作業原理

爬蟲學習大綱

第0關,初識爬蟲,你會了解爬蟲的作業原理,寫出一個簡單的爬蟲程式,學會爬蟲的第0步:獲取資料,
icon
第1關,你將會快速入門HTML基礎知識,達到讀懂和修改HTML檔案的水平,有了這些基礎,你才能去學習如何決議資料和提取資料,
icon
第2、3、4、5關,我會教你爬蟲的第1和第2步:決議資料和提取資料,同時,你還會學到兩種不同的發起請求的方式,
icon
在第6關,你將學會存盤資料,即把目標資料寫入到本地的Excel表格中,到此,你就學會了爬蟲完整的四個步驟,掌握了最基本的爬蟲技能啦,
icon
第7關,我們一起做一個專案,爬取一個知乎大v的所有文章,并且存到Excel中,以此,我們鞏固和復習了0-6關的所有知識,第7關會是一個分水嶺,后面關卡的進階知識都建立在前7關的基礎上,
icon
第8關,學會cookies,就可以讓瀏覽器記住你,你們可以更方便地長期保持聯系,而不是在一次見面之后就相忘于江湖,
icon
第9關,學習控制瀏覽器,來應對爬蟲中一些更復雜的情況,第10關,你的爬蟲會變得更自動化,爬蟲程式不但可以定時作業,還可以把爬取結果傳遞給你,
icon
接下來的4關,你將學會更高效更強大的爬蟲方法,讓爬蟲技能升級,
icon
第15關畢業總結,就到了告別的時刻了,這時你也學成出師,可以用爬蟲知識去做自己想做的事情了,讓爬蟲為你消滅重復勞動,高效獲取資訊,創造出更多價值,
icon
以上,就是爬蟲學習大綱,
# 引入requests庫
import requests
# requests.get是在呼叫requests庫中的get()方法,它向服務器發送了一個請求,括號里的引數是你需要的資料所在的網址,然后服務器對請求作出了回應,
# 我們把這個回應回傳的結果賦值給變數res
res = requests.get('URL')

現在,我們試著用requests.get()來下載一個小說——《三國演義》:

# 來吧,寫代碼吧
import requests
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md'
response = requests.get(url)

import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 列印變數res的回應狀態碼,以檢查請求是否成功
print(res.status_code)
icon
第5行代碼是在列印res的回應狀態碼,它可以用來檢查我們的requests請求是否得到了成功的回應,我們看到終端結果顯示了200,這個數字代表服務器同意了請求,并回傳了資料給我們,
icon
除了200,我們還可能收到其他的狀態碼,下面有一個表格,供你參考不同的狀態碼代表什么,但不需要記住它們,在遇到問題的時候查詢就好,

icon
response.status_code是一個很常用的屬性,在我們之后的爬蟲代碼中也將多次出現,

icon
接著的屬性是response.content,它能把Response物件的內容以二進制資料的形式回傳,適用于圖片、音頻、視頻的下載,看個例子你就懂了,
icon
假如我們想下載這張圖片,它的URL是:https://res.pandateacher.com/2018-12-18-10-43-07.png

# 引入requests庫
import requests
# 發出請求,并把回傳的結果放在變數res中
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
# 把Reponse物件的內容以二進制資料的形式回傳
pic = res.content
# 新建了一個檔案ppt.jpg,這里的檔案沒加路徑,它會被保存在程式運行的當前目錄下,
# 圖片內容需要以二進制wb讀寫,你在學習open()函式時接觸過它,
photo = open('ppt.jpg','wb')
# 獲取pic的二進制內容
photo.write(pic)
# 關閉檔案
photo.close()
icon
這樣,我們的圖片就下載成功啦~你也可以在本地運行這個程式,
icon
講完了response.content,繼續看response.text,這個屬性可以把Response物件的內容以字串的形式回傳,適用于文字、網頁源代碼的下載,
icon
舉個例子,我們還是來下載小說《三國演義》的第一回,
# 參考requests庫
import requests
# 下載《三國演義》第一回,我們得到一個物件,它被命名為res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response物件的內容以字串的形式回傳
novel=res.text
# 現在,可以列印小說了,但考慮到整章太長,只輸出800字看看就好,在關于串列的知識那里,你學過[:800]的用法,
print(novel[:800])
icon
之后,我們就可以用通過讀寫檔案把小說保存到本地了,這是Python基礎語法知識,你應該已經學會了,下面直接給出做法,你也可以在自己的本地電腦上做嘗試練習,
# 引入requests庫
import requests
#下載《三國演義》第一回,我們得到一個物件,它被命名為res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
# 把Response物件的內容以字串的形式回傳
novel = res.text
# 創建一個名為《三國演義》的txt檔案,指標放在檔案末尾,追加內容
k = open('《三國演義》.txt','a+')
# 寫進檔案中
k.write(novel)
# 關閉檔案
k.close()

爬蟲倫理
icon
就像是兩個人在來來往往的相處中,會考慮對方的感受;在互聯網的世界中,我們也要考慮一下服務器對爬蟲的感受是怎樣的,
icon
我們說過,服務器其實就是一個超級電腦,擁有這個服務器的公司,對爬蟲其實也有明確的態度,
icon
通常情況下,服務器不太會在意小爬蟲,但是,服務器會拒絕頻率很高的大型爬蟲和惡意爬蟲,因為這會給服務器帶來極大的壓力或傷害,
icon
不過,服務器在通常情況下,對搜索引擎是歡迎的態度(剛剛講過,谷歌和百度的核心技術之一就是爬蟲),當然,這是有條件的,通常這些條件會寫在robots協議里,
icon
robots協議是互聯網爬蟲的一項公認的道德規范,它的全稱是“網路爬蟲排除標準”(robots exclusion protocol),這個協議用來告訴爬蟲,哪些頁面是可以抓取的,哪些不可以,
icon
我們使用robots協議的場景通常是:看到想獲取的內容后,檢查一下網站是否允許爬取,因此我們只需要能找到、簡單讀懂robots協議就足夠了,
icon
我們截取了一部分淘寶的robots協議,可以看到淘寶對百度和谷歌這兩個爬蟲的訪問規定,以及對其它爬蟲的規定,
icon
有的同學可能就要問了:“域名是什么?域名和URL(網址)有什么關系?”很敏銳喲!
icon
我們前面說過,如果把一個網頁類比為一幢房子,URL指示了網頁的地址,就像房子在地球上的詳細到某某街道某某號的具體地址,那么域名就像房子所在的國家,指示了網站的地址,
icon
如果我們看到一個網頁,想爬上面的內容,怎么找到它的URL我們剛剛學過了,如果網頁的URL是https://pypi.org/project/requests/,那么,此網站的域名是pypi.org;如果網頁的URL是http://cn.python-requests.org/zh_CN/latest/,那么網站的域名是cn.python-requests.org,
icon
我們再來看一個,如果網頁的URL是https://www.taobao.com/markets/3c/tbdc?spm=a21bo.2017.201867-main.11.5af911d9VV8EyS,那么網站的域名是www.taobao.com,
單選題
看懂了么?我們來試一次,某網頁的網址是https://www.bilibili.com/v/douga/?spm_id_from=333.851.b_7072696d6172794368616e6e656c4d656e75.1,那么網站的域名是?
答對了!
icon
沒錯,你已經找到了規律!
icon
有個課后思考交給你:域名中會藏著網站的國籍或功能領域等資訊,那么.cn,.com,.gov結尾的域名分別代表了什么?
icon
來看一個實體:我們截取了一部分淘寶的robots協議 (
http://www.taobao.com/robots.txt),在截取的部分,可以看到淘寶對百度和谷歌這兩個爬蟲的訪問規定,以及對其它爬蟲的規定,
User-agent: Baiduspider # 百度爬蟲
Allow: /article # 允許訪問 article
Allow: /oshtml # 允許訪問 oshtml
Allow: /ershou # 允許訪問 ershou
Allow: /$ # 允許訪問根目錄,即淘寶主頁
Disallow: /product/ # 禁止訪問product檔案夾下面的所有檔案,但是product檔案夾本身允許被訪問
Disallow: / # 禁止訪問除 Allow 規定頁面之外的其他所有頁面
?
User-Agent: Googlebot # 谷歌爬蟲
Allow: /article
Allow: /oshtml
Allow: /product # 允許訪問product檔案夾及product檔案夾下面的所有檔案
Allow: /spu
Allow: /dianpu
Allow: /oversea
Allow: /list
Allow: /ershou
Allow: /$
Disallow: / # 禁止訪問除 Allow 規定頁面之外的其他所有頁面
?
…… # 檔案太長,省略了對其它爬蟲的規定,想看全文的話,點擊上面的鏈接
?
User-Agent: * # 其他爬蟲
Disallow: / # 禁止訪問所有頁面
icon
可以看出robots協議是“分段”的嗎?每個段落都含有以下兩種欄位:一種是User-agent:,另一種是Allow:或Disallow:,
icon
User-agent表示的是爬蟲型別,上面的示例代碼注釋了“百度爬蟲”和“谷歌爬蟲”,我們自己寫的爬蟲一般要看User-Agent: *,*指向所有未被明確提及的爬蟲,
icon
Allow代表允許被訪問,Disallow代表禁止被訪問,欄位對應的值都含有路徑分隔符/,限制了哪些或哪一層目錄的內容是允許或者禁止被訪問的,可以對比上述百度爬蟲Disallow: /product/和谷歌爬蟲Allow: /product的注釋行理解一下,
練習介紹
要求:
獲取文章《HTTP狀態回應碼》全部內容,并且列印出全文內容,
目的:
練習獲取網上的文本檔案,
題目要求:獲取文章《HTTP狀態回應碼》全部內容,并且列印出全文內容,
獲取資料:
文本URL:
https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md
首先呼叫requests庫,使用requests.get(‘URL’)獲取檔案,回傳的是Response物件,
然后需要把Response物件用合適的資料形式回傳,
存盤資料:
存盤檔案的三個步驟:打開檔案,存盤檔案,關閉檔案,
import requests
destnation_url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md'
res = requests.get (destnation_url)
print(res.status_code) # 查看回應碼
article=res.text # 把Response物件的內容以字串的形式回傳
print(article)
回傳結果如下
# HTTP回應狀態碼
## 1xx:臨時回應
#### 表示臨時回應并需要請求者繼續執行操作的狀態代碼,
100 **繼續**請求者應當繼續提出請求,服務器回傳此代碼表示已收到請求的第一部分,正在等待其余部分,
101 **切換協議**請求者已要求服務器切換協議,服務器已確認并準備切換,
---
## 2xx : 成功
#### 表示成功處理了請求的狀態代碼,
200 **成功** 服務器已成功處理了請求,通常,這表示服務器提供了請求的網頁,
201 **已創建** 請求成功并且服務器創建了新的資源,
202 **已接受** 服務器已接受請求,但尚未處理,
203 **非授權資訊** 服務器已成功處理了請求,但回傳的資訊可能來自另一來源,
204 **無內容** 服務器成功處理了請求,但沒有回傳任何內容,
205 **重置內容**服務器成功處理了請求,但沒有回傳 任何內容,
206 **部分內容** 服??器成功處理了部分 GET 請求,
---
## 3xx : 重定向
#### 表示要完成請求,需要進一步操作,通常,以下狀態代碼用來重定向,
300 **多種選擇** 針對請求,服務器可執行多種操作,服務器可根據請求者 (user agent) 選擇一項操作,或提供操作串列供請求者選擇,
301 **永久移動** 請求的網頁已永久移動到新位置,服務器回傳此回應(對 GET 或 HEAD 請求的回應)時,會自動將請求者轉到新位置,
302 **臨時移動** 服務器目前從不同位置的網頁回應請求,但請求者應繼續使用原有位置來進行以后的請求,
303 **查看其他位置**請求者應當對不同的位置使用單獨的 GET 請求來檢索回應時,服務器回傳此代碼,
304 **未修改**自從上次請求后,請求的網頁未修改過,服務器回傳此回應時,不會回傳網頁內容,
305 **使用代理**請求者只能使用代理訪問請求的網頁,如果服務器回傳此回應,還表示請求者應使用代理,
307 **臨時重定向** 服務器目前從不同位置的網頁回應請求,但請求者應繼續使用原有位置來進行以后的請求,
---
## 4xx:請求錯誤
### 以下狀態代碼表示請求可能出錯,妨礙了服務器的處理,
400 **錯誤請求**服務器不理解請求的語法,
401 **未授權**請求要求身份驗證,對于需要登錄的網頁,服務器可能回傳此回應,
403 **禁止**服務器拒絕請求,
404 **未找到**服務器找不到請求的網頁,
405 **方法禁用**禁用請求中指定的方法,
406 **不接受**無法使用請求的內容特性回應請求的網頁,
407 **需要代理授權**此狀態代碼與 401(未授權)類似,但指定請求者應當授權使用代理,
408 **請求超時** 服務器等候請求時發生超時,
409 **沖突** 服務器在完成請求時發生沖突,服務器必須在回應中包含有關?2突的資訊,
410 **已洗掉** 如果請求的資源已永久洗掉,服務器就會回傳此回應,
411 **需要有效長度**服務器不接受不含有效內容長度標頭欄位的請求,
412 **未滿足前提條件**服務器未滿足請求者在請求中設定的其中一個前提條件,
413 **請求物體過大**服務器無法處理請求,因為請求物體過大,超出服務器的處理能力,
414 **請求的 URI 過長**請求的 URI(通常為網址)過長,服務器無法處理,
415 **不支持的媒體型別**請求的格式不受請求頁面的支持,
416 **請求范圍不符合要求**如果頁面無法提供請求的范圍,則服務器會回傳此狀態代碼,
417 **未滿足期望值**服務器未滿足"期望"請求標頭欄位的要求,
---
## 5xx:服務器錯誤
### 以下狀態代碼表示服務器在嘗試處理請求時發生內部錯誤,這些錯誤可能是服務器本身的錯誤,而不是請求出錯,
500 **服務器內部錯誤** 服務器遇到錯誤,無法完成請求,
501 **尚未實施**服務器不具備完成請求的功能,例如,服務器無法識別請求方法時可能會回傳此代碼,
502 **錯誤網關**服務器作為網關或代理,從上游服務器收到無效回應,
503 **服務不可用**服務器目前無法使用(由于超載或停機維護),通常,這只是暫時狀態,
504 **網關超時** 服務器作為網關或代理,但是沒有及時從上游服務器收到請求,
505 **HTTP 版本不受支持**服務器不支持請求中所用的 HTTP 協議版本,
練習介紹
要求:
獲取下面的圖片,并且儲存圖片,

目的:
練習獲取網上的圖片檔案,
import requests
# 發出請求,并把回傳的結果放在變數res中
res = requests.get('https://res.pandateacher.com/2019-01-12-15-29-33.png')
# 把Reponse物件的內容以二進制資料的形式回傳
pic=res.content
# 新建了一個檔案ppt.jpg,這里的檔案沒加路徑,它會被保存在程式運行的當前目錄下,
# 圖片內容需要以二進制wb讀寫,你在學習open()函式時接觸過它,
photo = open('spider.jpg','wb')
# 獲取pic的二進制內容
photo.write(pic)
# 關閉檔案
photo.close()
練習介紹
題目要求:
獲取下面的音樂,并且儲存它,然后請重繪頁面,這樣你就可以在【檔案】內看到它,音樂URL:
https://static.pandateacher.com/Over%20The%20Rainbow.mp3
獲取資料
音樂URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3
首先呼叫requests庫,使用requests.get(‘URL’)獲取檔案,回傳的是Response物件,
然后需要把Response物件用合適的資料形式回傳,
存盤檔案
存盤檔案的三個步驟:打開檔案,存盤檔案,關閉檔案,
import requests
# 發出請求,并把回傳的結果放在變數res中
res = requests.get('https://static.pandateacher.com/Over%20The%20Rainbow.mp3')
# 把Reponse物件的內容以二進制資料的形式回傳
mp3 = res.content
# 新建了一個檔案rainbow.mp3,這里的檔案沒加路徑,它會被保存在程式運行的當前目錄下,
# 音頻內容需要以二進制wb讀寫,你在學習open()函式時接觸過它,
music = open('rainbow.mp3','wb')
# 寫入mp3的二進制內容
music.write(mp3)
# 關閉檔案
music.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/281775.html
標籤:python
上一篇:python正則運算式
下一篇:撰寫代碼(最好能說明一下思路)
