什麼是爬蟲?
從本質上來講,就是利用程序在網上拿到對咱們有價值的數據
爬蟲能作不少事,能作商業分析,也能作生活助手,
好比:分析北京近兩年二手房成交均價是多少?
深圳的Python工程師平均薪資是多少?
北京哪家餐廳粵菜最好吃?等等。
這是我的利用爬蟲所作到的事情,而公司,一樣能夠利用爬蟲來實現巨大的商業價值。
好比你所熟悉的搜索引擎——百度和谷歌,它們的核心技術之一也是爬蟲,並且是超級爬蟲。
百度這家公司會源源不斷地把千千萬萬個網站爬取下來,存儲在本身的服務器上。
你在百度搜索的本質就是在它的服務器上搜索信息,
你搜索到的結果是一些超連接,在超連接跳轉以後你就能夠訪問其它網站了
瀏覽器工做原理
當服務器把數據響應給瀏覽器以後,瀏覽器並不會直接把數據丟給你。
由於這些數據是用計算機的語言寫的,瀏覽器還要把這些數據翻譯成你能看得懂的樣子,
這是瀏覽器作的另外一項工做【解析數據】。
爬蟲的工做原理
獲取數據
咱們將會利用一個強大的庫——
requests
來獲取數據。安裝requests
pip install requests
requests
庫能夠幫咱們下載網頁源代碼、文本、圖片,甚至是音頻。其實,「下載」本質上是向服務器發送請求並獲得響應。
requests.get()
import requests
#引入requests庫
res = requests.get('URL')
#requests.get是在調用requests庫中的get()方法,它向服務器發送了一個請求,括號裏的參數是你須要的數據所在的網址,而後服務器對請求做出了響應。
#咱們把這個響應返回的結果賦值在變量res上。
複製代碼
嘗試下載三國演義...
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
類
import requests
res = requests.get('https://res.pandateacher.com/2018-12-18-10-43-07.png')
print(res.status_code)
#打印變量res的響應狀態碼,以檢查請求是否成功
複製代碼
接着的屬性是
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個字
複製代碼
咱們打印出來的
response.text
的內容就是正常的、沒有亂碼的,那就用不到res.encoding
;若是亂碼,去查看目標數據的編碼,再用
res.encoding
把編碼定義成和目標數據一致的類型便可。
爬蟲倫理
一般狀況下,服務器不太會在乎小爬蟲,
可是,服務器會拒絕頻率很高的大型爬蟲和惡意爬蟲,由於這會給服務器帶來極大的壓力或傷害
服務器在一般狀況下,對搜索引擎是歡迎的態度(谷歌和百度的核心技術之一就是爬蟲)。
固然,這是有條件的,而這些條件會寫在
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
表明禁止被訪問。並且有趣的是,淘寶限制了百度對產品頁面的爬蟲,卻容許谷歌訪問。
網站的服務器被爬蟲爬得多了,也會受到較大的壓力,所以,各大網站也會作一些反爬蟲的措施。
不過呢,有反爬蟲,也就有相應的反反爬蟲
限制好爬蟲的速度,對提供數據的服務器心存感謝,避免給它形成太大壓力,維持良好的互聯網秩序
總結
小做業1
獲取文章《HTTP狀態響應碼》所有內容,而且打印出全文內容。
localprod.pandateacher.com/python-manu…
小做業2
從網上下載圖片 user-gold-cdn.xitu.io/2019/6/9/16…
小做業3
從網上下載音樂 static.pandateacher.com/Over The Ra…
1xx:臨時響應
表示臨時響應並須要請求者繼續執行操做的狀態代碼。
2xx : 成功
表示成功處理了請求的狀態代碼。
3xx : 重定向
表示要完成請求,須要進一步操做。一般,如下狀態代碼用來重定向。
4xx:請求錯誤
如下狀態代碼表示請求可能出錯,妨礙了服務器的處理。
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