貓哥教你寫爬蟲 029--爬蟲初探-requests

什麼是爬蟲?

從本質上來講,就是利用程序在網上拿到對咱們有價值的數據

爬蟲能作不少事,能作商業分析,也能作生活助手,

好比:分析北京近兩年二手房成交均價是多少?

深圳的Python工程師平均薪資是多少?

北京哪家餐廳粵菜最好吃?等等。

這是我的利用爬蟲所作到的事情,而公司,一樣能夠利用爬蟲來實現巨大的商業價值。

好比你所熟悉的搜索引擎——百度和谷歌,它們的核心技術之一也是爬蟲,並且是超級爬蟲。

1559082538356
1559082607322

百度這家公司會源源不斷地把千千萬萬個網站爬取下來,存儲在本身的服務器上。

你在百度搜索的本質就是在它的服務器上搜索信息,

你搜索到的結果是一些超連接,在超連接跳轉以後你就能夠訪問其它網站了

瀏覽器工做原理

1559082753633
1559082768483
1559082795780

當服務器把數據響應給瀏覽器以後,瀏覽器並不會直接把數據丟給你。

由於這些數據是用計算機的語言寫的,瀏覽器還要把這些數據翻譯成你能看得懂的樣子,

這是瀏覽器作的另外一項工做【解析數據】。

爬蟲的工做原理

1559082874334
1559082914086
1559082935388

獲取數據

咱們將會利用一個強大的庫——requests來獲取數據。

安裝requests pip install requests

requests庫能夠幫咱們下載網頁源代碼、文本、圖片,甚至是音頻。

其實,「下載」本質上是向服務器發送請求並獲得響應。

requests.get()

import requests
#引入requests庫
res = requests.get('URL')
#requests.get是在調用requests庫中的get()方法,它向服務器發送了一個請求,括號裏的參數是你須要的數據所在的網址,而後服務器對請求做出了響應。
#咱們把這個響應返回的結果賦值在變量res上。
複製代碼

1559083085690

嘗試下載三國演義...

localprod.pandateacher.com/python-manu…

import requests 
#引入requests庫
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md') 
#發送請求,並把響應結果賦值在變量res上
print(res)
print(type(res))
複製代碼

Response對象的經常使用屬性

在爬蟲中,理解數據是什麼對象是很是、特別、以及極其重要的一件事。

由於只有知道了數據是什麼對象,咱們才知道對象有什麼屬性和方法可供咱們操做

res是一個對象,屬於requests.models.Response

1559083440304

import requests 
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png') 
print(res.status_code)
#打印變量res的響應狀態碼,以檢查請求是否成功
複製代碼

1559083486518
1559083688701

  • 301—永久移動。被請求的資源已被永久移動位置;
  • 302—請求的資源如今臨時從不一樣的 URI 響應請求;
  • 305—使用代理。被請求的資源必須經過指定的代理才能被訪問;
  • 307—臨時跳轉。被請求的資源在臨時從不一樣的URL響應請求;
  • 400—錯誤請求;
  • 402—須要付款。該狀態碼是爲了未來可能的需求而預留的,用於一些數字貨幣或者是微支付;
  • 403—禁止訪問。服務器已經理解請求,可是拒絕執行它;
  • 404—找不到對象。請求失敗,資源不存在;
  • 406—不可接受的。請求的資源的內容特性沒法知足請求頭中的條件,於是沒法生成響應實體;
    1559083708684
  • 408—請求超時;
  • 409—衝突。因爲和被請求的資源的當前狀態之間存在衝突,請求沒法完成;
  • 410—遺失的。被請求的資源在服務器上已經再也不可用,並且沒有任何已知的轉發地址;
  • 413—響應實體太大。服務器拒絕處理當前請求,請求超過服務器所能處理和容許的最大值。
  • 417—指望失敗。在請求頭 Expect 中指定的預期內容沒法被服務器知足;
  • 418—我是一個茶壺。超文本咖啡罐控制協議,可是並無被實際的HTTP服務器實現;
  • 420—方法失效。
  • 422—不可處理的實體。請求格式正確,可是因爲含有語義錯誤,沒法響應;
  • 500—服務器內部錯誤。服務器遇到了一個不曾預料的情況,致使了它沒法完成對請求的處理;
    1559083739026

接着的屬性是response.content,它能把Response對象的內容以二進制數據的形式返回,

適用於圖片、音頻、視頻的下載

import requests
res = requests.get('https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1559093899057&di=f87221caaa1719bf8a99623f18ee9866&imgtype=0&src=http%3A%2F%2Fk.zol-img.com.cn%2Fsjbbs%2F7692%2Fa7691515_s.jpg')
#發出請求,並把返回的結果放在變量res中
pic=res.content
#把Reponse對象的內容以二進制數據的形式返回
photo = open('ppt.jpg','wb')
#新建了一個文件ppt.jpg,這裏的文件沒加路徑,它會被保存在程序運行的當前目錄下。
#圖片內容須要以二進制wb讀寫。你在學習open()函數時接觸過它。
photo.write(pic) 
#獲取pic的二進制內容
photo.close()
#關閉文件
複製代碼

response.text,這個屬性能夠把Response對象的內容以字符串的形式返回,

適用於文字、網頁源代碼的下載。

import requests
#引用requests庫
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
#下載《三國演義》第一回,咱們獲得一個對象,它被命名爲res
novel=res.text
#把Response對象的內容以字符串的形式返回
print(novel[:800])
#如今,能夠打印小說了,但考慮到整章太長,只輸出800字看看就好。在關於列表的知識那裏,你學過[:800]的用法。
複製代碼

response.encoding,它能幫咱們定義Response對象的編碼。

import requests
#引用requests庫
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/sanguo.md')
#下載《三國演義》第一回,咱們獲得一個對象,它被命名爲res
res.encoding='gbk'
#定義Response對象的編碼爲gbk
novel=res.text
#把Response對象的內容以字符串的形式返回
print(novel[:800])
#打印小說的前800個字
複製代碼

1559084006121
1559084033903

咱們打印出來的response.text的內容就是正常的、沒有亂碼的,那就用不到res.encoding

若是亂碼,去查看目標數據的編碼,再用res.encoding把編碼定義成和目標數據一致的類型便可。

1559084136716

爬蟲倫理

一般狀況下,服務器不太會在乎小爬蟲,

可是,服務器會拒絕頻率很高的大型爬蟲和惡意爬蟲,由於這會給服務器帶來極大的壓力或傷害

服務器在一般狀況下,對搜索引擎是歡迎的態度(谷歌和百度的核心技術之一就是爬蟲)。

固然,這是有條件的,而這些條件會寫在Robots協議。

Robots協議是互聯網爬蟲的一項公認的道德規範,

全稱是「網絡爬蟲排除標準」(Robots exclusion protocol),

這個協議用來告訴爬蟲,哪些頁面是能夠抓取的,哪些不能夠。

如何查看網站的robots協議呢,很簡單,在網站的域名後加上/robots.txt就能夠了。

淘寶的robots協議 ( www.taobao.com/robots.txt)。

在截取的部分,能夠看到淘寶對百度和谷歌這兩個爬蟲的訪問規定,以及對其它爬蟲的規定。

User-agent:  Baiduspider #百度爬蟲
Allow:  /article #容許訪問 /article.htm
Allow:  /oshtml #容許訪問 /oshtml.htm
Allow:  /ershou #容許訪問 /ershou.htm
Allow: /$ #容許訪問根目錄,即淘寶主頁
Disallow:  /product/ #禁止訪問/product/
Disallow:  / #禁止訪問除 Allow 規定頁面以外的其餘全部頁面
​
User-Agent:  Googlebot #谷歌爬蟲
Allow:  /article
Allow:  /oshtml
Allow:  /product #容許訪問/product/
Allow:  /spu
Allow:  /dianpu
Allow:  /oversea
Allow:  /list
Allow:  /ershou
Allow: /$
Disallow:  / #禁止訪問除 Allow 規定頁面以外的其餘全部頁面
​
…… # 文件太長,省略了對其它爬蟲的規定,想看全文的話,點擊上面的連接
​
User-Agent:  * #其餘爬蟲
Disallow:  / #禁止訪問全部頁面
複製代碼

Allow表明能夠被訪問,Disallow表明禁止被訪問。

並且有趣的是,淘寶限制了百度對產品頁面的爬蟲,卻容許谷歌訪問。

1559084366094

網站的服務器被爬蟲爬得多了,也會受到較大的壓力,所以,各大網站也會作一些反爬蟲的措施。

不過呢,有反爬蟲,也就有相應的反反爬蟲

限制好爬蟲的速度,對提供數據的服務器心存感謝,避免給它形成太大壓力,維持良好的互聯網秩序

總結

1559084433453
1559084448029
1559084459191
1559084473513

小做業1

獲取文章《HTTP狀態響應碼》所有內容,而且打印出全文內容。

localprod.pandateacher.com/python-manu…

小做業2

從網上下載圖片 user-gold-cdn.xitu.io/2019/6/9/16…

img

小做業3

從網上下載音樂 static.pandateacher.com/Over The Ra…

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 衝突 服務器在完成請求時發生衝突。服務器必須在響應中包含有關衝突的信息。 410 已刪除 若是請求的資源已永久刪除,服務器就會返回此響應。 411 須要有效長度服務器不接受不含有效內容長度標頭字段的請求。 412 未知足前提條件服務器未知足請求者在請求中設置的其中一個前提條件。 413 請求實體過大服務器沒法處理請求,由於請求實體過大,超出服務器的處理能力。 414 請求的 URI 過長請求的 URI(一般爲網址)過長,服務器沒法處理。 415 不支持的媒體類型請求的格式不受請求頁面的支持。 416 請求範圍不符合要求若是頁面沒法提供請求的範圍,則服務器會返回此狀態代碼。 417 未知足指望值服務器未知足"指望"請求標頭字段的要求。

5xx:服務器錯誤

如下狀態代碼表示服務器在嘗試處理請求時發生內部錯誤。

這些錯誤多是服務器自己的錯誤,而不是請求出錯。

500 服務器內部錯誤 服務器遇到錯誤,沒法完成請求。 501 還沒有實施服務器不具有完成請求的功能。例如,服務器沒法識別請求方法時可能會返回此代碼。 502 錯誤網關服務器做爲網關或代理,從上游服務器收到無效響應。 503 服務不可用服務器目前沒法使用(因爲超載或停機維護)。一般,這只是暫時狀態。 504 網關超時 服務器做爲網關或代理,可是沒有及時從上游服務器收到請求。 505 HTTP 版本不受支持服務器不支持請求中所用的 HTTP 協議版本。html

快速跳轉:

貓哥教你寫爬蟲 000--開篇.md
貓哥教你寫爬蟲 001--print()函數和變量.md
貓哥教你寫爬蟲 002--做業-打印皮卡丘.md
貓哥教你寫爬蟲 003--數據類型轉換.md
貓哥教你寫爬蟲 004--數據類型轉換-小練習.md
貓哥教你寫爬蟲 005--數據類型轉換-小做業.md
貓哥教你寫爬蟲 006--條件判斷和條件嵌套.md
貓哥教你寫爬蟲 007--條件判斷和條件嵌套-小做業.md
貓哥教你寫爬蟲 008--input()函數.md
貓哥教你寫爬蟲 009--input()函數-人工智能小愛同窗.md
貓哥教你寫爬蟲 010--列表,字典,循環.md
貓哥教你寫爬蟲 011--列表,字典,循環-小做業.md
貓哥教你寫爬蟲 012--布爾值和四種語句.md
貓哥教你寫爬蟲 013--布爾值和四種語句-小做業.md
貓哥教你寫爬蟲 014--pk小遊戲.md
貓哥教你寫爬蟲 015--pk小遊戲(全新改版).md
貓哥教你寫爬蟲 016--函數.md
貓哥教你寫爬蟲 017--函數-小做業.md
貓哥教你寫爬蟲 018--debug.md
貓哥教你寫爬蟲 019--debug-做業.md
貓哥教你寫爬蟲 020--類與對象(上).md
貓哥教你寫爬蟲 021--類與對象(上)-做業.md
貓哥教你寫爬蟲 022--類與對象(下).md
貓哥教你寫爬蟲 023--類與對象(下)-做業.md
貓哥教你寫爬蟲 024--編碼&&解碼.md
貓哥教你寫爬蟲 025--編碼&&解碼-小做業.md
貓哥教你寫爬蟲 026--模塊.md
貓哥教你寫爬蟲 027--模塊介紹.md
貓哥教你寫爬蟲 028--模塊介紹-小做業-廣告牌.md
貓哥教你寫爬蟲 029--爬蟲初探-requests.md
貓哥教你寫爬蟲 030--爬蟲初探-requests-做業.md
貓哥教你寫爬蟲 031--爬蟲基礎-html.md
貓哥教你寫爬蟲 032--爬蟲初體驗-BeautifulSoup.md
貓哥教你寫爬蟲 033--爬蟲初體驗-BeautifulSoup-做業.md
貓哥教你寫爬蟲 034--爬蟲-BeautifulSoup實踐.md
貓哥教你寫爬蟲 035--爬蟲-BeautifulSoup實踐-做業-電影top250.md
貓哥教你寫爬蟲 036--爬蟲-BeautifulSoup實踐-做業-電影top250-做業解析.md
貓哥教你寫爬蟲 037--爬蟲-寶寶要聽歌.md
貓哥教你寫爬蟲 038--帶參數請求.md
貓哥教你寫爬蟲 039--存儲數據.md
貓哥教你寫爬蟲 040--存儲數據-做業.md
貓哥教你寫爬蟲 041--模擬登陸-cookie.md
貓哥教你寫爬蟲 042--session的用法.md
貓哥教你寫爬蟲 043--模擬瀏覽器.md
貓哥教你寫爬蟲 044--模擬瀏覽器-做業.md
貓哥教你寫爬蟲 045--協程.md
貓哥教你寫爬蟲 046--協程-實踐-吃什麼不會胖.md
貓哥教你寫爬蟲 047--scrapy框架.md
貓哥教你寫爬蟲 048--爬蟲和反爬蟲.md
貓哥教你寫爬蟲 049--完結撒花.mdpython

相關文章
相關標籤/搜索