一直以來不管是編程語言排行榜還是在互聯(lián)網(wǎng)行業(yè),Python一直備受爭議,到底是Java熱門還是Python熱門也是一直讓人爭吵的話題。隨著信息時(shí)代的迭代更新,人工智能的興起,Python編程語言也隨之被人們廣泛學(xué)習(xí),Python數(shù)據(jù)分析、Python web全棧、Python自動(dòng)化運(yùn)維等等都很受歡迎,其中還包括了Python爬蟲。但是很對(duì)人覺得Python爬蟲是違法的行為,也在懷疑自己到底要不要學(xué)爬蟲,之前有一篇文章特別火,就是《 只因?qū)懥艘欢闻老x,公司200多人被抓!》,文章里寫了因?yàn)橐幻夹g(shù)人員因爬取數(shù)據(jù)被抓,那么爬蟲真的違法嗎?今天我們來好好研究一下。
1
網(wǎng)絡(luò)爬蟲犯法嗎?
網(wǎng)絡(luò)爬蟲領(lǐng)域目前還屬于早期的拓荒階段,雖然互聯(lián)網(wǎng)世界已經(jīng)通過自身的協(xié)議建立起一定的道德規(guī)范(Robots協(xié)議),但法律部分還在建立和完善中。從目前的情況來看,如果抓取的數(shù)據(jù)屬于個(gè)人使用或科研范疇,基本不存在問題;而如果數(shù)據(jù)屬于商業(yè)盈利范疇,就要就事而論,有可能屬于違法行為,也有可能不違法。
Robots協(xié)議
Robots協(xié)議(爬蟲協(xié)議)的全稱是“網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)”(Robots Exclusion Protocol),網(wǎng)站通過Robots協(xié)議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。該協(xié)議是國際互聯(lián)網(wǎng)界通行的道德規(guī)范,雖然沒有寫入法律,但是每一個(gè)爬蟲都應(yīng)該遵守這項(xiàng)協(xié)議。
下面以淘寶網(wǎng)的robots.txt為例進(jìn)行介紹。
User-agent: Baiduspider #百度爬蟲引擎 Allow: /article #允許訪問/article.htm、/article/12345.com Allow: /oshtml Allow: /ershouDisallow: /product/ #禁止訪問/product/12345.com Disallow: / #禁止訪問除Allow規(guī)定頁面外的其他所有頁面 User-Agent: Googlebot #谷歌爬蟲引擎 Allow: /articleAllow: /oshtml Allow: /product #允許訪問/product.htm、/product/12345.com Allow: /spuAllow: /dianpuAllow: /wenzhang Allow: /oversea Disallow: /
淘寶的Robots協(xié)議對(duì)谷歌爬蟲的待遇則不一樣,和百度爬蟲不同的是,它允許谷歌爬蟲爬取產(chǎn)品的頁面Allow:/product。因此,當(dāng)你在谷歌搜索“淘寶iphone7”的時(shí)候,可以搜索到淘寶中的產(chǎn)品,如圖所示。當(dāng)你爬取網(wǎng)站數(shù)據(jù)時(shí),無論是否僅供個(gè)人使用,都應(yīng)該遵守Robots協(xié)議。
網(wǎng)絡(luò)爬蟲的約束
除了上述Robots協(xié)議之外,我們使用網(wǎng)絡(luò)爬蟲的時(shí)候還要對(duì)自己進(jìn)行約束:過于快速或者頻密的網(wǎng)絡(luò)爬蟲都會(huì)對(duì)服務(wù)器產(chǎn)生巨大的壓力,網(wǎng)站可能封鎖你的IP,甚至采取進(jìn)一步的法律行動(dòng)。因此,你需要約束自己的網(wǎng)絡(luò)爬蟲行為,將請(qǐng)求的速度限定在一個(gè)合理的范圍之內(nèi)。
實(shí)際上,由于網(wǎng)絡(luò)爬蟲獲取的數(shù)據(jù)帶來了巨大的價(jià)值,網(wǎng)絡(luò)爬蟲逐漸演變成一場網(wǎng)站方與爬蟲方的戰(zhàn)爭,你的矛長一寸,我的盾便厚一寸。在攜程技術(shù)微分享上,攜程酒店研發(fā)部研發(fā)經(jīng)理崔廣宇分享過一個(gè)“三月爬蟲”的故事,也就是每年的三月份會(huì)迎來一個(gè)爬蟲高峰期。因?yàn)橛写罅康拇髮W(xué)生五月份交論文,在寫論文的時(shí)候會(huì)選擇爬取數(shù)據(jù),也就是三月份爬取數(shù)據(jù),四月份分析數(shù)據(jù),五月份交論文。
因此,各大互聯(lián)網(wǎng)巨頭也已經(jīng)開始調(diào)集資源來限制爬蟲,保護(hù)用戶的流量和減少有價(jià)值數(shù)據(jù)的流失。
2007年,愛幫網(wǎng)利用垂直搜索技術(shù)獲取了大眾點(diǎn)評(píng)網(wǎng)上的商戶簡介和消費(fèi)者點(diǎn)評(píng),并且直接大量使用。大眾點(diǎn)評(píng)網(wǎng)多次要求愛幫網(wǎng)停止使用這些內(nèi)容,而愛幫網(wǎng)以自己是使用垂直搜索獲得的數(shù)據(jù)為由,拒絕停止抓取大眾點(diǎn)評(píng)網(wǎng)上的內(nèi)容,并且質(zhì)疑大眾點(diǎn)評(píng)網(wǎng)對(duì)這些內(nèi)容所享有的著作權(quán)。為此,雙方開打了兩場官司。2011年1月,北京海淀法院做出判決:愛幫網(wǎng)侵犯大眾點(diǎn)評(píng)網(wǎng)著作權(quán)成立,應(yīng)當(dāng)停止侵權(quán)并賠償大眾點(diǎn)評(píng)網(wǎng)經(jīng)濟(jì)損失和訴訟必要支出。
2013年10月,百度訴360違反Robots協(xié)議。百度方面認(rèn)為,360違反了Robots協(xié)議,擅自抓取、復(fù)制百度網(wǎng)站內(nèi)容并生成快照向用戶提供。2014年8月7日,北京市第一中級(jí)人民法院做出一審判決,法院認(rèn)為被告奇虎360的行為違反了《反不正當(dāng)競爭法》相關(guān)規(guī)定,應(yīng)賠償原告百度公司70萬元。
雖然說大眾點(diǎn)評(píng)上的點(diǎn)評(píng)數(shù)據(jù)、百度知道的問答由用戶創(chuàng)建而非企業(yè),但是搭建平臺(tái)需要投入運(yùn)營、技術(shù)和人力成本,所以平臺(tái)擁有對(duì)數(shù)據(jù)的所有權(quán)、使用權(quán)和分發(fā)權(quán)。
以上兩起敗訴告訴我們,在爬取網(wǎng)站的時(shí)候需要限制自己的爬蟲,遵守Robots協(xié)議和約束網(wǎng)絡(luò)爬蟲程序的速度;在使用數(shù)據(jù)的時(shí)候必須遵守網(wǎng)站的知識(shí)產(chǎn)權(quán)。如果違反了這些規(guī)定,很可能會(huì)吃官司,并且敗訴的概率相當(dāng)高。
所以只要你合理利用就不會(huì)違法,爬蟲還是可以學(xué)的哦,畢竟爬蟲對(duì)數(shù)據(jù)分析真的非常有用,那么爬蟲該怎么學(xué)呢?今天來教大家編寫一個(gè)簡單的爬蟲吧!
2
編寫第一個(gè)簡單的爬蟲
#!/usr/bin/python
# coding: utf-8 import requests #引入包requestslink = "http://www.santostang.com/" #定義link為目標(biāo)網(wǎng)頁地址 # 定義請(qǐng)求頭的瀏覽器代理,偽裝成瀏覽器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) #請(qǐng)求網(wǎng)頁print (r.text) #r.text是獲取的網(wǎng)頁內(nèi)容代碼
上述代碼就能獲取博客首頁的HTML代碼,HTML是用來描述網(wǎng)頁的一種語言,也就是說網(wǎng)頁呈現(xiàn)的內(nèi)容背后都是HTML代碼。如果你對(duì)HTML不熟悉的話,可以先去w3school(http://www.w3school.com.cn/html/index.asp)學(xué)習(xí)一下,大概花上幾個(gè)小時(shí)就可以了解HTML。
在上述代碼中,首先import requests引入包requests,之后獲取網(wǎng)頁。
(1)首先定義link為目標(biāo)網(wǎng)頁地址。
(2)之后用headers來定義請(qǐng)求頭的瀏覽器代理,進(jìn)行偽裝
(3)r是requests的Response回復(fù)對(duì)象,我們從中可以獲取想要的信息。r.text是獲取的網(wǎng)頁內(nèi)容代碼。
運(yùn)行上述代碼得到的結(jié)果如圖所示。
#!/usr/bin/python # coding: utf-8 import requestsfrom bs4 import BeautifulSoup #從bs4這個(gè)庫中導(dǎo)入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解析 #找到第一篇文章標(biāo)題,定位到class是"post-title"的h1元素,提取a,提取a里面的字符串,strip()去除左右空格title = soup.find("h1", class_="post-title").a.text.strip()print (title)
在獲取整個(gè)頁面的HTML代碼后,我們需要從整個(gè)網(wǎng)頁中提取第一篇文章的標(biāo)題。
這里用到BeautifulSoup這個(gè)庫對(duì)頁面進(jìn)行解析,BeautifulSoup將會(huì)在第4章進(jìn)行詳細(xì)講解。首先需要導(dǎo)入這個(gè)庫,然后把HTML代碼轉(zhuǎn)化為soup對(duì)象,接下來用soup.find(“h1”,class_=“post-title”).a.text.strip()得到第一篇文章的標(biāo)題,并且打印出來
soup.find(“h1”,class_=“post-title”).a.text.strip()的意思是,找到第一篇文章標(biāo)題,定位到class是"post-title"的h1元素,提取a元素,提取a元素里面的字符串,strip()去除左右空格。
對(duì)初學(xué)者來說,使用BeautifulSoup從網(wǎng)頁中提取需要的數(shù)據(jù)更加簡單易用。
那么,我們?cè)趺磸哪敲撮L的代碼中準(zhǔn)確找到標(biāo)題的位置呢?
這里就要隆重介紹Chrome瀏覽器的“檢查(審查元素)”功能了。下面介紹找到需要元素的步驟。
步驟01 使用Chrome瀏覽器打開博客首頁www.santostang.com。右擊網(wǎng)頁頁面,在彈出的快捷菜單中單擊“檢查”命令,如圖所示。
步驟02 出現(xiàn)如下圖所示的審查元素頁面。單擊左上角的鼠標(biāo)鍵按鈕,然后在頁面上單擊想要的數(shù)據(jù),下面的Elements會(huì)出現(xiàn)相應(yīng)的code所在的地方,就定位到想要的元素了。
步驟03 在代碼中找到標(biāo)藍(lán)色的地方,為
import requests from bs4 import BeautifulSoup #從bs4這個(gè)庫中導(dǎo)入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)
# 打開一個(gè)空白的txt,然后使用f.write寫入剛剛的字符串titlewith open('title_test.txt', "a+") as f: f.write(title)
存儲(chǔ)到本地的txt文件非常簡單,在第二步的基礎(chǔ)上加上2行代碼就可以把這個(gè)字符串保存在text中,并存儲(chǔ)到本地。txt文件地址應(yīng)該和你的Python文件放在同一個(gè)文件夾。
以上就是編寫第一個(gè)爬蟲的方法,你們學(xué)會(huì)了嗎?暫時(shí)沒學(xué)會(huì)也沒關(guān)系,你可以慢慢學(xué)哦!
原文鏈接:https://blog.csdn.net/weixin_37649168/article/details/104265388