教你如何編寫第一個爬蟲

2021-02-23 CSDN

2019年不管是程式語言排行榜還是在網際網路行業,Python一直備受爭議,到底是Java熱門還是Python熱門也是一直讓人爭吵的話題。

隨著資訊時代的迭代更新,人工智慧的興起,Python程式語言也隨之被人們廣泛學習,Python數據分析、Python web全棧、Python自動化運維等等都很受歡迎,其中還包括了Python爬蟲。但是很對人覺得Python爬蟲是違法的行為,也在懷疑自己到底要不要學爬蟲,之前有一篇文章特別火,就是《 只因寫了一段爬蟲,公司200多人被抓!》,文章裡寫了因為一名技術人員因爬取數據被抓,那麼爬蟲真的違法嗎?今天我們來探索一下。

目前網際網路世界針對爬蟲這一塊已經通過自身的協議建立起一定的道德規範(Robots協議),但法律部分還在建立和完善中。那麼Robots協議是什麼呢?

Robots協議


Robots協議(爬蟲協議)的全稱是「網絡爬蟲排除標準」(Robots Exclusion Protocol),網站通過Robots協議告訴搜尋引擎哪些頁面可以抓取,哪些頁面不能抓取。該協議是國際網際網路界通行的道德規範,雖然沒有寫入法律,但是每一個爬蟲都應該遵守這項協議。

下面以淘寶網的robots.txt為例進行介紹。

User-agent:  Baiduspider    #百度爬蟲引擎Allow:  /article     #允許訪問/article.htm、/article/12345.comAllow:  /oshtml      Allow:  /ershouDisallow:  /product/ #禁止訪問/product/12345.comDisallow:  /         #禁止訪問除Allow規定頁面外的其他所有頁面
User-Agent: Googlebot #谷歌爬蟲引擎Allow: /articleAllow: /oshtmlAllow: /product #允許訪問/product.htm、/product/12345.comAllow: /spuAllow: /dianpuAllow: /wenzhangAllow: /overseaDisallow:  /

在上面的robots文件中,淘寶網對用戶代理為百度爬蟲引擎進行了規定。

以Allow項的值開頭的URL是允許robot訪問的。例如,Allow:/article允許百度爬蟲引擎訪問/article.htm、/article/12345.com等。

以Disallow項為開頭的連結是不允許百度爬蟲引擎訪問的。例如,Disallow:/product/不允許百度爬蟲引擎訪問/product/12345.com等。

最後一行,Disallow:/禁止百度爬蟲訪問除了Allow規定頁面外的其他所有頁面。

因此,當你在百度搜索「淘寶」的時候,搜索結果下方的小字會出現:「由於該網站的robots.txt文件存在限制指令(限制搜尋引擎抓取),系統無法提供該頁面的內容描述」,如圖所示。百度作為一個搜尋引擎,良好地遵守了淘寶網的robot.txt協議,所以你是不能從百度上搜索到淘寶內部的產品信息的。

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

當你爬取網站數據時,無論是否僅供個人使用,都應該遵守Robots協議。

加入VIP會員,上百本電子書、上千門課程等你免費學


網絡爬蟲的約束


除了上述Robots協議之外,我們使用網絡爬蟲的時候還要對自己進行約束:過於快速或者頻密的網絡爬蟲都會對伺服器產生巨大的壓力,網站可能封鎖你的IP,甚至採取進一步的法律行動。因此,你需要約束自己的網絡爬蟲行為,將請求的速度限定在一個合理的範圍之內。

爬取網站的時候需要限制自己的爬蟲,遵守Robots協議和約束網絡爬蟲程序的速度;在使用數據的時候必須遵守網站的智慧財產權。

所以只要你合理利用就不會違法,爬蟲還是可以學的哦,畢竟爬蟲對數據分析真的非常有用,那麼爬蟲該怎麼學呢?今天來教大家編寫一個簡單的爬蟲!

編寫第一個簡單的爬蟲

第一步:獲取頁面
#!/usr/bin/python# coding: utf-8
import requests 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) print (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 requestsfrom 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 requestsfrom 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寫入剛剛的字符串titlewith open('title_test.txt', "a+") as f:    f.write(title)

存儲到本地的txt文件非常簡單,在第二步的基礎上加上2行代碼就可以把這個字符串保存在text中,並存儲到本地。txt文件地址應該和你的Python文件放在同一個文件夾。返回文件夾,打開title.txt文件,其中的內容如圖所示。以上就是編寫第一個爬蟲的方法,你們學會了嗎?暫時沒學會也沒關係,你可以慢慢學哦~以上內容自《Python網絡爬蟲從入門到實踐(第2版)》【文末有福利】往下拉!

掃碼加入VIP會員免費讀

使用Python編寫網絡爬蟲程序獲取網際網路上的大數據是當前的熱門專題。本書內容包括三部分:基礎部分、進階部分和項目實踐。基礎部分(第1~7章)主要介紹爬蟲的三個步驟——獲取網頁、解析網頁和存儲數據,並通過諸多示例的講解,讓讀者能夠從基礎內容開始系統性地學習爬蟲技術,並在實踐中提升Python爬蟲水平。進階部分(第8~13章)包括多線程的並發和並行爬蟲、分布式爬蟲、更換IP等,幫助讀者進一步提升爬蟲水平。項目實踐部分(第14~17章)使用本書介紹的爬蟲技術對幾個真實的網站進行抓取,讓讀者能在讀完本書後根據自己的需求寫出爬蟲程序。

推薦理由:

基礎知識+完整的知識模塊+4個實踐案例的教學,讓讀者快速掌握爬蟲程序的編寫,快速成長為爬蟲高手

更多Python好書推薦

以上書籍均已加入到VIP會員卡權益,只要擁有這張VIP會員卡即可免費閱讀上百本電子書,還有上千門優質課程免費看哦,快掃碼查看!

參與方式:只要在本文留言參與話題「技術書籍上,你會選擇購買紙質書籍還是電子書籍,為什麼呢?」即可有機會獲得價值129元的可擦筆記本一個,只有2個名額哦~

獲獎公布時間:2月21日14:00


如果可以的話也可掃碼入群一起交流學習哦~電子書的任何問題都可以在群裡溝通!


相關焦點

  • 網絡爬蟲違法?扯!繼續學習我的第一個爬蟲
    網絡爬蟲的約束除了上述Robots協議之外,我們使用網絡爬蟲的時候還要對自己進行約束:過於快速或者頻密的網絡爬蟲都會對伺服器產生巨大的壓力,網站可能封鎖你的IP,甚至採取進一步的法律行動。因此,你需要約束自己的網絡爬蟲行為,將請求的速度限定在一個合理的範圍之內。
  • 用程式語言編寫web爬蟲,不得不提Python的簡單、高效
    畢竟這關係到你以後的就業,實際收入,甚至決定了你的職業發展方向。所以,問題來了。Python行業前景如何?主要使用領域有哪些?本文中,小科從以下幾個方面給你解答!1.網頁開發-讓世界看到你的作品Python常用於Web開發。比如Apache可以通過mod_wsgi模塊運行Python編寫的Web程序。Python定義了WSGI標準應用接口,協調Http伺服器和基於Python的Web程序之間的通信。
  • python爬蟲-- Scrapy入門
    準備寫一個系列的Scrapy爬蟲教程,一方面通過輸出鞏固和梳理自己這段時間學到的知識,另一方面當初受惠於別人的博客教程,我也想通過這個系列教程幫助一些想要學習Scrapy的人。Scrapy簡介Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。
  • 爬蟲入門到放棄01:什麼是爬蟲
    序章18年初,還在實習期的我因為工作需求開始接觸Java爬蟲,從一個網站爬取了163W條poi數據,這是我人生中寫的第一個爬蟲,也是唯一的一個Java爬蟲。後來這些poi數據也成了我畢業設計中的一部分。
  • 想自學Python來開發爬蟲,該如何制定學習計劃
    學習Python的第一個階段是Python基本語法的學習,這個階段的學習一定要邊做實驗邊學習,而且實驗要有層次(驗證性實驗、綜合性實驗)來推進,這樣才會有一個比較好的學習效果。第二:重點練習爬蟲的開發。很多同學學習Python都是為了提升數據收集和分析的能力,所以爬蟲往往是學習Python的一個重點,很多Python書籍也是針對於爬蟲來編寫的。
  • 教你學Python21-帶你寫第一個爬蟲
    通過上一個章節的講解,我們已經了解到了開發一個爬蟲需要做的工作以及一些常見的問題,下面我們給出一個爬蟲開發相關技術的清單以及這些技術涉及到的標準庫和第三方庫,稍後我們會一一介紹這些內容。下載數據 - urllib / requests / aiohttp。
  • 10分鐘教你Python爬蟲(上)-- HTML和爬蟲基礎
    這次給大家帶來的是爬蟲系列的第一課---HTML和爬蟲基礎。在最開始的時候,我們需要先了解一下什麼是爬蟲。簡單地來說呢,爬蟲就是一個可以自動登陸網頁獲取網頁信息的程序。舉個例子來說,比如你想每天看到自己喜歡的新聞內容,而不是各類新聞平臺給你推送的各種各樣的信息,你就可以寫一個爬蟲去爬取這些關鍵詞的內容,使自己能夠按時獲得自己感興趣的內容,等等。總的來說,爬蟲能用來進行數據監控,數據收集,信息整合,資源採集。然後,我們一起來總結一下我們瀏覽網頁的過程。
  • 手把手教你寫網絡爬蟲(5):PhantomJS實戰
    本系列:《手把手教你寫網絡爬蟲(1):網易雲音樂歌單》《手把手教你寫網絡爬蟲(2):迷你爬蟲架構》
  • requests-html:最簡單的爬蟲框架,看完你就會了
    分析網頁編寫爬蟲之前還要做一件事情,就是分析網頁的結構。這個工作其實也很簡單,打開你要訪問的網頁,按F12打開開發人員工具,可以看到最左邊有這麼一個按鈕。點擊這個按鈕,然後點擊網頁上你想要查看的網頁元素,然後你就可以發現這個元素對應的相關原始碼已經為你定位完畢了。定位按鈕通過這個功能,我們就可以輕鬆的分析網頁,然後通過它的結構來編寫爬蟲了。
  • 精通 Python 網絡爬蟲:網絡爬蟲學習路線
    如何才能精通Python網絡爬蟲呢?學習Python網絡爬蟲的路線應該如何進行呢?在此為大家具體進行介紹。
  • 初識pycharm編寫方法
    使用pycharm編輯器 雙擊我們安裝好的pycharm編輯器(安裝過程在前幾節)選擇第一個新建項目第一個pure python是純python,下面的那些是一些擴展,暫時不用,我們就選第一個Location是選擇編寫代碼保存的路徑,根據自己的情況點右側小文件夾按鈕,自行選擇一個路徑保存即可保存後點擊右下角的
  • 初學者如何用「python爬蟲」技術抓取網頁數據?
    而這裡的「技術手段」就是指網絡爬蟲。 今天,小編將與您分享一個爬蟲的基本知識和入門教程:什麼是爬蟲?網絡爬蟲,也叫作網絡數據採集,是指通過編程從Web伺服器請求數據(HTML表單),然後解析HTML以提取所需的數據。
  • Python程式語言:如何建立爬蟲框架
    這篇文章小編要和大家分享的知識是爬蟲框架,以及小編對學習它的感悟!如何建立爬蟲框架,這很重要,就像我們蓋房子需要基石一樣!才能蓋起摩天大樓,讓我們學習Python語言的路,走得更遠!路漫漫其修遠兮,吾將上下而求索!
  • 如何開始寫你的第一個python腳本——簡單爬蟲入門!
    好多朋友在入門python的時候都是以爬蟲入手,而網絡爬蟲是近幾年比較流行的概念,特別是在大數據分析熱門起來以後,學習網絡爬蟲的人越來越多,哦對,現在叫數據挖掘了!其實,一般的爬蟲具有2個功能:取數據和存數據!好像說了句廢話。。。
  • scrapy爬蟲框架的運用
    # scrapy# 爬蟲框架- 框架- 爬蟲框架- scrapy- pyspider- crawley- scrapy框架介紹- https://doc.scrapy.org/en/latest/- http://scrapy-chs.readthedocs.io
  • 福利 | 精選幾本 Python 爬蟲的經典書,免費送你
    此外,本書還介紹了如何使用AJAX URL和Firebug擴展來爬取數據,以及有關爬取技術的更多真相,比如使用瀏覽器渲染、管理cookie、通過提交表單從受驗證碼保護的複雜網站中抽取數據等。本書使用Scrapy創建了一個高級網絡爬蟲,並對一些真實的網站進行了爬取。四、精通Python網絡爬蟲:核心技術、框架與項目實戰
  • 適合新手學習的Python爬蟲書籍
    此外,本書還介紹了如何使用AJAX URL和Firebug擴展來爬取數據,以及有關爬取技術的更多真相,比如使用瀏覽器渲染、管理cookie、通過提交表單從受驗證碼保護的複雜網站中抽取數據等。本書使用Scrapy創建了一個高級網絡爬蟲,並對一些真實的網站進行了爬取。Python網絡數據採集
  • 如何編寫屬於你的第一個 Android 單元測試?
    本文主要面向單元測試新手,首先簡單介紹了什麼是單元測試,為什麼要寫單元測試,討論了一下 Android 項目中哪些代碼適合做單元測試,並以一個簡單例子演示了如何編寫屬於你的第一個
  • Python爬蟲之urllib庫—爬蟲的第一步
    第一個爬蟲代碼的實現我想應該是從urllib開始吧,博主開始學習的時候就是使用urllib庫敲了幾行代碼就實現了簡單的爬數據功能,我想大多夥伴們也都是這麼過來的
  • 5分鐘教你編寫不會受限的Python爬蟲
    最後的代碼如下:from selenium import webdriverdriver = webdriver.Firefox(executable_path = r'C:\Users\ santostang\Desktop\geckodriver.exe')#把上述地址改成你電腦中geckodriver.exe程序的地址driver.get("")運行後會打開Hello World