教你如何編寫第一個爬蟲
- 2020 年 2 月 24 日
- 筆記
2019年不管是程式語言排行榜還是在互聯網行業,Python一直備受爭議,到底是Java熱門還是Python熱門也是一直讓人爭吵的話題。
隨著資訊時代的迭代更新,人工智慧的興起,Python程式語言也隨之被人們廣泛學習,Python數據分析、Python web全棧、Python自動化運維等等都很受歡迎,其中還包括了Python爬蟲。但是很對人覺得Python爬蟲是違法的行為,也在懷疑自己到底要不要學爬蟲,之前有一篇文章特別火,就是《 只因寫了一段爬蟲,公司200多人被抓!》,文章里寫了因為一名技術人員因爬取數據被抓,那麼爬蟲真的違法嗎?今天我們來探索一下。
目前互聯網世界針對爬蟲這一塊已經通過自身的協議建立起一定的道德規範(Robots協議),但法律部分還在建立和完善中。那麼Robots協議是什麼呢?
1
Robots協議
Robots協議(爬蟲協議)的全稱是「網路爬蟲排除標準」(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。該協議是國際互聯網界通行的道德規範,雖然沒有寫入法律,但是每一個爬蟲都應該遵守這項協議。
下面以淘寶網的robots.txt為例進行介紹。
User-agent: Baiduspider #百度爬蟲引擎 Allow: /article #允許訪問/article.htm、/article/12345.com Allow: /oshtml Allow: /ershou Disallow: /product/ #禁止訪問/product/12345.com Disallow: / #禁止訪問除Allow規定頁面外的其他所有頁面 User-Agent: Googlebot #Google爬蟲引擎 Allow: /article Allow: /oshtml Allow: /product #允許訪問/product.htm、/product/12345.com Allow: /spu Allow: /dianpu Allow: /wenzhang Allow: /oversea Disallow: /
在上面的robots文件中,淘寶網對用戶代理為百度爬蟲引擎進行了規定。
以Allow項的值開頭的URL是允許robot訪問的。例如,Allow:/article允許百度爬蟲引擎訪問/article.htm、/article/12345.com等。
以Disallow項為開頭的鏈接是不允許百度爬蟲引擎訪問的。例如,Disallow:/product/不允許百度爬蟲引擎訪問/product/12345.com等。
最後一行,Disallow:/禁止百度爬蟲訪問除了Allow規定頁面外的其他所有頁面。
因此,當你在百度搜索「淘寶」的時候,搜索結果下方的小字會出現:「由於該網站的robots.txt文件存在限制指令(限制搜索引擎抓取),系統無法提供該頁面的內容描述」,如圖所示。百度作為一個搜索引擎,良好地遵守了淘寶網的robot.txt協議,所以你是不能從百度上搜索到淘寶內部的產品資訊的。

淘寶的Robots協議對Google爬蟲的待遇則不一樣,和百度爬蟲不同的是,它允許Google爬蟲爬取產品的頁面Allow:/product。因此,當你在Google搜索「淘寶iphone7」的時候,可以搜索到淘寶中的產品,如圖所示。

當你爬取網站數據時,無論是否僅供個人使用,都應該遵守Robots協議。
加入VIP會員,上百本電子書、上千門課程等你免費學
2
網路爬蟲的約束
除了上述Robots協議之外,我們使用網路爬蟲的時候還要對自己進行約束:過於快速或者頻密的網路爬蟲都會對伺服器產生巨大的壓力,網站可能封鎖你的IP,甚至採取進一步的法律行動。因此,你需要約束自己的網路爬蟲行為,將請求的速度限定在一個合理的範圍之內。
爬取網站的時候需要限制自己的爬蟲,遵守Robots協議和約束網路爬蟲程式的速度;在使用數據的時候必須遵守網站的知識產權。
所以只要你合理利用就不會違法,爬蟲還是可以學的哦,畢竟爬蟲對數據分析真的非常有用,那麼爬蟲該怎麼學呢?今天來教大家編寫一個簡單的爬蟲!
3
編寫第一個簡單的爬蟲
第一步:獲取頁面
#!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.com/" #定義link為目標網頁地址 # 定義請求頭的瀏覽器代理,偽裝成瀏覽器 headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) #請求網頁 print (r.text) #r.text是獲取的網頁內容程式碼
上述程式碼就能獲取部落格首頁的HTML程式碼,HTML是用來描述網頁的一種語言,也就是說網頁呈現的內容背後都是HTML程式碼。如果你對HTML不熟悉的話,可以先去w3school(http://www.w3school.com.cn/html/index.asp)學習一下,大概花上幾個小時就可以了解HTML。
在上述程式碼中,首先import requests引入包requests,之後獲取網頁。
(1)首先定義link為目標網頁地址。
(2)之後用headers來定義請求頭的瀏覽器代理,進行偽裝
(3)r是requests的Response回復對象,我們從中可以獲取想要的資訊。r.text是獲取的網頁內容程式碼。
運行上述程式碼得到的結果如圖所示。

第二步:提取需要的數據
#!/usr/bin/python # coding: utf-8 import requests from bs4 import BeautifulSoup #從bs4這個庫中導入BeautifulSoup link = "http://www.santostang.com/" headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析 #找到第一篇文章標題,定位到class是"post-title"的h1元素,提取a,提取a裡面的字元串,strip()去除左右空格 title = soup.find("h1", class_="post-title").a.text.strip() print (title)
在獲取整個頁面的HTML程式碼後,我們需要從整個網頁中提取第一篇文章的標題。
這裡用到BeautifulSoup這個庫對頁面進行解析,BeautifulSoup將會在第4章進行詳細講解。首先需要導入這個庫,然後把HTML程式碼轉化為soup對象,接下來用soup.find(「h1」,class_=「post-title」).a.text.strip()得到第一篇文章的標題,並且列印出來
soup.find(「h1」,class_=「post-title」).a.text.strip()的意思是,找到第一篇文章標題,定位到class是"post-title"的h1元素,提取a元素,提取a元素裡面的字元串,strip()去除左右空格。
對初學者來說,使用BeautifulSoup從網頁中提取需要的數據更加簡單易用。
那麼,我們怎麼從那麼長的程式碼中準確找到標題的位置呢?
這裡就要隆重介紹Chrome瀏覽器的「檢查(審查元素)」功能了。下面介紹找到需要元素的步驟。
步驟01
使用Chrome瀏覽器打開部落格首頁www.santostang.com。右擊網頁頁面,在彈出的快捷菜單中單擊「檢查」命令,如圖所示。

步驟02
出現如下圖所示的審查元素頁面。單擊左上角的滑鼠鍵按鈕,然後在頁面上單擊想要的數據,下面的Elements會出現相應的code所在的地方,就定位到想要的元素了。

步驟03
在程式碼中找到標藍色的地方,為echarts學習筆記(2)–同一頁面多圖表。我們可以用soup.find("h1",class_="post-title").a.text.strip()提取該博文的標題。
第三步:存儲數據
import requests from bs4 import BeautifulSoup #從bs4這個庫中導入BeautifulSoup link = "http://www.santostang.com/" headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析 title = soup.find("h1", class_="post-title").a.text.strip() print (title) # 打開一個空白的txt,然後使用f.write寫入剛剛的字元串title with open('title_test.txt', "a+") as f: f.write(title)
存儲到本地的txt文件非常簡單,在第二步的基礎上加上2行程式碼就可以把這個字元串保存在text中,並存儲到本地。txt文件地址應該和你的Python文件放在同一個文件夾。
返迴文件夾,打開title.txt文件,其中的內容如圖所示。

以上就是編寫第一個爬蟲的方法,你們學會了嗎?暫時沒學會也沒關係,你可以慢慢學哦~以上內容自《Python網路爬蟲從入門到實踐(第2版)》【文末有福利】往下拉!