菜鳥學習網路爬蟲的最佳路線是什麼?

我是一名快要升大三的在校學生


謝邀。

最近快期末了,很多邀我的問題都忽略了,簡單看了一下題主的主頁,似乎是信安專業的。我也是信安的,深有同病相憐之感,所以來答。
信安作為一個計算機、通信、數學的交叉學科,開設課程是大都是理工科的基礎課程和一些簡單的編程,簡單涉及密碼學和網路安全基礎,學的都比較淺,發展什麼的就要看個人興趣了。

在給出我的回答之前,我想先談一談你提的問題。
首先是「最佳路線」。討論一個開放性的問題,很難有最佳解。而且,討論最佳解,難免會有一種急功近利的嫌疑。國內有很多書冠以「21天」、「零基礎」、「從入門到精通」的名頭,這種書給我的印象就是「不靠譜」。所以你擺出一個「菜鳥」的身份,如果是想求得一份「21天零基礎從入門到精通爬蟲」的武林秘籍的話,我想就算有答案八成也是不靠譜的。

其次,你沒有給出你現有的水平,和你希望達到的目標。你只是告訴我們你是「一名快要升大三的在校學生」。這句話除了能推斷年齡以外毫無信息量,好比找工作的時候告訴別人我是一名應屆畢業生——還沒說是什麼專業的。我猜一下,你應該學過C語言,Java和C++應該是選修課。那你要達到什麼樣的目標呢?是自己娛樂一下,還是立志要做一個很大的分散式爬蟲,是當作提高工作效率的數據搜集工具,還是要以此作為未來的求職方向?你只說「學習」,也沒說是要入門還是想精通,讓別人怎麼回答嘛。

最後,編程是為了解決問題。學習編程的關鍵其實不在於學習什麼語言,而在於解決問題的能力。你現在有一個問題叫做「學習爬蟲的最佳路線」,你有沒有試著去解決這個問題呢?有太多太多的問題總不能挨個提問吧,你有沒有試試搜索呢?

(百度一下)

(好吧你可能覺得百度不靠譜,那就Google一下)

(Google打不開?那好吧,你既然選擇相信知乎的水平來知乎提問了,那有沒有先搜一下呢)

(好吧知乎的搜索做的確實有點渣,那你有沒有先去看一下爬蟲話題的精華回答呢?爬蟲(計算機網路) - 話題精華)
我覺得,你只要是自己動手搜索過了,或者看過如何入門 Python 爬蟲? - 爬蟲(計算機網路)下面的回答的話,應該就不會來提這個問題了。

我說這麼多廢話的原因是因為,你要培養自己獨立解決問題的能力,而不是培養來知乎提問的能力,何況你的提問本身就不是一個很好的提問(與已有問題重複、描述信息不足)。

下面開始回答問題。
我應該算很水的,學爬蟲也就是六月份用了一周時間而已。我的學習經歷在如何入門 Python 爬蟲? - 段曉晨的回答裡面說過了。這次大概總結一下我對爬蟲的理解吧(Python)。

爬蟲是一個按照一定規則,自動抓取互聯網信息的腳本程序
所以爬蟲的工作過程就是訪問網站-返回網站內容-從內容中獲取我們需要的信息。

單純的訪問過程是很簡單的,Python提供了內置的urllib庫,你也可以使用requests庫來實現網路請求。在最簡單最理想的情況下,你已經得到網頁的源代碼了。

但是訪問並不總是成功的。因為大家都在反爬蟲。
理論上講,我們能通過人工點擊瀏覽器訪問到的信息,都可以讓爬蟲來進行模擬。但是網站並不喜歡爬蟲啊,因為你的頻繁訪問會佔用很多網路資源。在其他的一些情況下,寫腳本可能是為了批量註冊賬號、自動回復刷金幣刷分。
所以網站會有很多措施來限制爬蟲的訪問,驗證網線另一端的是不是人在操作。大多數情況下我們自然也會有相應的解決辦法。
比如驗證你的身份——添加headers,偽造Agent。
比如限制你的訪問頻率——添加程序運行間隔,爬取訪問以後休息一下,頻率不要太高。
比如封鎖你的IP地址——添加代理IP,構造代理池。
比如驗證碼——特別簡單的驗證碼可以程序識別,複雜的驗證碼可以人工打碼,更複雜的…似乎沒什麼太好的辦法。(驗證碼的確是防機器的好辦法,但是要和用戶體驗作平衡,比如被人吐槽的12306新驗證碼)

所以你會發現,你要學的就是怎麼反反爬蟲(有點繞口),我覺得高手們你們是怎麼防爬蟲的?有沒有開源項目專做防爬蟲? - pig pig 的回答這個回答就很好。

好的,假如你現在已經成功地反反爬蟲,拿到了網頁源碼,可是這些源碼是交給瀏覽器解釋的,並不是讓人直接閱讀的,裡面有太多你看不懂的東西(你有HTML基礎嗎…),那你要如何提取出你需要的信息呢?
答案是使用正則表達式進行匹配。這個是肯定得學得會用的。(就算你HTML沒什麼基礎學的不怎麼樣也能夠得到你想要的內容了)

有沒有比正則更好的做法呢?有。BeautifulSoup。
但是前提是你掌握了HTML和CSS的語法基礎。

到此我們就實現了訪問網站-返回內容-獲取所需內容的過程。這也是最簡單的爬蟲了。

還會遇到什麼問題,或者更複雜的情況呢?
編碼問題。(Windows/Linux;網頁使用了什麼編碼;編程使用了什麼編碼;Python3的編碼和Python2的編碼有哪些不一樣)
需要登陸才能訪問到的內容,模擬登陸,維持會話。(requests.session和cookielib)
js渲染才能得到的信息、ajax非同步自己構造請求地址(需要會通過網路抓包從伺服器與瀏覽器的通信中找到正確的請求地址和傳遞數據的方式)

大概的內容也就是這樣了,說的很草,因為自己也不專業。你可以詳細地去看一下如何入門 Python 爬蟲? - 爬蟲(計算機網路)中的回答。

總結一下就是。
需要一點Python的基礎
需要了解HTML+CSS,會用Firebug分析網頁
需要了解一點網路通信,會抓包分析網路請求
學習使用urllib庫訪問網站(推薦學習使用requests庫)
學習寫正則表達式
學習使用beautifulsoup庫
(再往大往遠說的話,可以去看一些設計性的、理念性的東西,或者去看一些大的項目是如何實現的,搜索引擎原理什麼的,看你興趣了)

如果說還有什麼建議的話,我推薦的做法是給自己構造一個情境、一個需求,然後帶著目的去做,去學。

比如你現在發現爬蟲(計算機網路) - 話題精華里的回答對你很有幫助,你如何寫一個腳本來把所有的回答自動保存到本地呢?
(可以參考我的經歷第一次在知乎獲得 1000 以上的贊是什麼體驗? - 段曉晨的回答和這裡的代碼知乎將如何應對「狗日的知乎」計劃? - 段曉晨的回答)
去試一試吧。期待你在一周內成功!

夾一點私貨:小段同學的雜記 - 知乎專欄
知乎評論區「查看對話」初探 - 小段同學的雜記 - 知乎專欄
Python 爬蟲筆記(1):綜述 - 小段同學的雜記 - 知乎專欄
Python 爬蟲筆記(2):插播——我也來做Facemash! - 小段同學的雜記 - 知乎專欄


網路爬蟲的基本工作流程如下:

1.首先選取一部分精心挑選的種子URL;

2.將這些URL放入待抓取URL隊列;

3.從待抓取URL隊列中取出待抓取在URL,解析DNS,並且得到主機的ip,並將URL對應的網頁下載下來,存儲進已下載網頁庫中。此外,將這些URL放進已抓取URL隊列;

4.分析已抓取URL隊列中的URL,分析其中的其他URL,並且將URL放入待抓取URL隊列,從而進入下一個循環。

設計並完成一個python爬蟲的流程為

1. 選擇目標網站並設定爬取目標:在編寫爬蟲之前要確定爬取網站的頁面是哪些,爬取是否需要登錄等情況,並確定爬取目標,一般爬取的目標有文本(如名稱,數字等文本信息),圖片和文件三種。

2. 編寫爬蟲,爬取頁面信息:選擇目標網站後就可以編寫爬蟲代碼,並獲取要爬取頁面的信息了。python中獲取頁面信息的代碼很簡單,如下所示:

html = requests.get(url).text

其中url是要爬取的頁面地址,html就是頁面信息,通常用BeautifulSoup包進行頁面信息解析。

soup = BeautifulSoup(html)

3. 分析頁面元素,獲取要爬取得數據:獲取頁面以後就需要根據需求從頁面選取數據,一般使用css selector或者xpath選取頁面信息。建議學習並使用xpath,xpath學習可以參考w3c xpath。使用xpath獲得幾種常見的數據方法如下:

獲取超鏈接地址

href=soup.xpath("//a/@href")

獲取文本信息

text=soup.xpath("//li/a/text()")

獲取圖片地址

imgSrc=soup.xpath("//a/img/@src")

4. 數據清洗:在將數據存入到資料庫或文本中時需要將數據進行格式化或者整理,如去除所有的符號字元或按照設計要求組織數據格式。

5. 數據存儲:選擇存儲策略,可以存儲在資料庫中,也可以寫入csv等文本形式。

Python還有一個非常實用的爬蟲框架Scrapy,可以去了解下;

Java爬蟲框架:

1. Nutch

Nutch屬於分散式爬蟲,爬蟲使用分散式,主要是解決兩個問題:1)海量URL管理;2)網速。如果要做搜索引擎,Nutch1.x是一個非常好的選擇。Nutch1.x和solr或者es配合,就可以構成一套非常強大的搜索引擎,否則盡量不要選擇Nutch作為爬蟲。用Nutch進行爬蟲的二次開發,爬蟲的編寫和調試所需的時間,往往是單機爬蟲所需的十倍時間不止。

2. Heritrix

Heritrix 是個「Archival Crawler」——來獲取完整的、精確的、站點內容的深度複製。包括獲取圖像以及其他非文本內容。抓取並存儲相關的內容。對內容來者不拒,不對頁面進行內容上的修改。重新爬行對相同的URL不針對先前的進行替換。爬蟲主要通過Web用戶界面啟動、監控和調整,允許彈性的定義要獲取的url。

3. crawler4j

crawler4j是Java實現的開源網路爬蟲。提供了簡單易用的介面,可以在幾分鐘內創建一個多線程網路爬蟲。

4. WebCollector

WebCollector使用了Nutch的爬取邏輯(分層廣度遍歷),Crawler4j的的用戶介面(覆蓋visit方法,定義用戶操作),以及一套自己的插件機制,設計了一套爬蟲內核。

5. WebMagic

WebMagic項目代碼分為核心和擴展兩部分。核心部分(webmagic-core)是一個精簡的、模塊化的爬蟲實現,而擴展部分則包括一些便利的、實用性的功能。WebMagic的架構設計參照了Scrapy,目標是盡量的模塊化,並體現爬蟲的功能特點。

6. HttpClientJsoup

爬蟲實現的技術有很多,對於java語言來說,有以上很多的選擇,可以是很多開源的爬蟲框架,也可以使用基本httpClient,Jsoup來爬取網頁。

httpClient負責模擬瀏覽器發送請求,Jsoup負責解析httpClient請求返回的HTML頁面,解析獲取需要的數據。

用谷歌瀏覽器開發者工具(F12)分析網頁的結構。


我自學 Python 爬蟲,到這個月出書《Python 網路爬蟲:從入門到實踐》(機械工業出版社出版),一共也就過去兩年。這兩年自學的過程,走過了無數的坑,多虧了各位大神無私地回答我的問題,我想我是有資格幫你解決零基礎學爬蟲技術的。

作為零基礎的你,我想你可能是想解決工作中的一個實際問題,或者僅僅是很想學習一下爬蟲的技術,多一技之長。其實我準備開始學 Python 爬蟲的時候也是一樣,老闆派了任務,暫時沒有人會爬蟲,我只有自學頂硬上。因此,我可以用思維圖給你理清楚,你應該幹什麼。

我零基礎但我想學網路爬蟲:

路徑1:我不想寫代碼,那上面的回答已經列舉了很多,Excel/八爪魚,用這些工具的好處是你可以很快上手,但是只能爬一些簡單的網站,一旦網站出現限制,這些方法就是個玩具。因此,想弄點數據玩玩,玩這些玩具就好。

路徑2:我可以學寫代碼,但是會不會很難啊?我以我的經驗告訴你,找一個好的老師比自我胡思亂想,自我設限好得多。寫代碼這個事不難學,這也是為什麼市面上有那麼多代碼速成的教學。這也是為什麼我有些同學1年轉專業進 Google 的事情發生。

這裡給你描畫一下你的學習之路:

  1. 學會 Python 的基本代碼: 假如你沒有任何編程基礎,時間可能花1-2周,每天3小時。假設你有編程基礎(VBA 也算吧),1小時
  2. 理解爬蟲原理:5分鐘。為什麼這麼重要?我自認為學一個東西就像建大樓,先弄清楚大框架,然後再從地基學起。很多時候我們的學習是,還沒弄懂大框架,就直接看網上的碎片化的教學,或者是跟著網上教學一章一章學,很容易學了芝麻丟了西瓜。我的自學就在這上面走了很多彎路。請參見:【爬蟲二】爬蟲的框架和基本議題
  3. 應用爬蟲原理做一個簡單爬蟲:30分鐘。請參見:5分鐘入門網路爬蟲 - 原來可以這麼簡單易懂
  4. 先吃透獲取網頁:就是給一個網址發個請求,那麼該網址會返回整個網頁的數據。類似:你在瀏覽器鍵入網址,回車,然後你就看到了網站的整個頁面。
  5. 再吃透解析網頁:就是從整個網頁的數據中提取你想要的數據。類似:你在瀏覽器中看到網站的整個頁面,但是你想找到產品的價格,價格就是你想要的數據。
  6. 再學會儲存數據:存儲很簡單,就是把數據存下來。

學會這些之後,你可以出去和別人說,我會 Python 爬蟲,我想也沒有人質疑你了。那麼學完這一套下來,你的時間成本是多少呢?如果你有編程基礎的話,1周吧。

所以,你是想當爬蟲做個玩具玩玩,還是掌握一門實戰利器。我覺得你可以自己衡量一下。

其實我已經把我這幾年的心得,遇到的坑都濃縮在這本書里,希望大家的學習之路上少走點坑。

想系統學習 Python,對上面六步感興趣的可以讀:如何有系統地學習Python爬蟲?

貼個鏈接,希望大家支持:

京東:《Python網路爬蟲從入門到實踐》(唐松,陳智銓)【摘要 書評 試讀】- 京東圖書

噹噹:《Python網路爬蟲從入門到實踐》(唐松 陳智銓)【簡介_書評_在線閱讀】 - 噹噹圖書


如今已是大數據時代,好多不太懂編程的計算機小白想學爬蟲,在網上搜索爬蟲一看都是很長很長的Python代碼。今天就給大家介紹一款軟體——按鍵精靈,學會了它即使你不懂Python你也能寫爬蟲。

我將以豆瓣網為例,通過按鍵精靈爬取豆瓣網影視點評信息。

1、在按鍵精靈官網上下載並安裝好這款軟體。

按鍵精靈www.anjian.com

2、安裝好之後再首頁新建腳本。

按鍵精靈的一大優點就是擁有非常方便並且強大的插件,如圖所示這次我們將用到的是Web網頁插件。

3、先上一個我已經寫好的代碼,可以直接複製到按鍵精靈源文件里調試運行。注意修改文件保存地址。

PID=Plugin.Web.Bind("wqm.exe") //關鍵代碼-綁定按鍵精靈自帶瀏覽器
UserVar a=26985857 "電影編號變數"
UserVar Address="https://movie.douban.com/subject/" "地址"

For i = 1 To 20 //循環次數依據自己的需要修改
Address_1 = Address a
Call Plugin.Web.Go(Address_1)
Name = Plugin.Web.HtmlGet("text", "tag:SPANindex:2")
If len(Name) = 1 Then //判斷此編號下是否存在電影
Goto mak //不存在此電影—跳轉到Rem mak
End If
Grade = Plugin.Web.HtmlGet("text", "tag:STRONGindex:0")
If Grade = "" Then //判斷此電影是否有評分
Grade="暫無評分"
End If
Call Plugin.File.WriteFileEx("C:UsersDELLDesktop1.txt", Name " " Grade) //將信息寫入指定txt,文件地址自行修改
Rem mak
a = a + 1
Next

MessageBox "結束"

4、通過運行這段代碼,我們可以爬取到下面這段信息。

巨額來電 猜猜我是誰 6.0
平民大總統 暫無評分
桃花扇喋血記 暫無評分
迷失天堂2 Hot boy n?i lo?n 2 暫無評分
令嬢ナース か?ん?じ?る 白い制服 暫無評分
100%帕斯卡老師 100%パスカル先生 暫無評分
妹の甘い唇2 せつない吐息 暫無評分
いもうと-幼い性衝動 暫無評分
恨世者 Le Misanthrope 暫無評分
農家の嫁 夫婦交換の村 暫無評分
顏值雜貨鋪 4.3

當然如果你願意的話,你可以將循環次數調到1000甚至更多。


這個知乎專欄寫的都是爬蟲類的文章,還有些實例教程,可以看看
數據工廠


如果你要自己編程的話,要學習Python,如果你是想要一個軟體,gooseeker推薦給你,我們老師推薦的


正則表達式不是必備的知識點嗎?
可以去看看這個教程,學習了下,很容易上手。
淘寶教育精品課程


推薦閱讀:

爬蟲相關的技能適合放進簡歷裡面嗎?
是否有智能爬蟲,即不需要會寫代碼,只要定義後就可以開始爬蟲了?
哪個開發軟體可以寫python啊,VS可以么?
想寫代碼,特別是爬蟲代碼,腫么辦?
Python中用BeautifulSoup解析中文網頁里的中文都是亂碼,怎麼回事?

TAG:爬蟲計算機網路 |