1. 程式人生 > >學 Java 網路爬蟲,需要哪些基礎知識?

學 Java 網路爬蟲,需要哪些基礎知識?

說起網路爬蟲,大家想起的估計都是 Python ,誠然爬蟲已經是 Python 的代名詞之一,相比 Java 來說就要遜色不少。有不少人都不知道 Java 可以做網路爬蟲,其實 Java 也能做網路爬蟲而且還能做的非常好,在開源社群中有不少優秀的 Java 網路爬蟲框架,例如 webmagic 。我的第一份正式工作就是使用 webmagic 編寫資料採集程式,當時參與了一個輿情分析系統的開發,這裡面涉及到了大量網站的新聞採集,我們就使用了 webmagic 進行採集程式的編寫,由於當時不知道其設計原理,使用起來還是走了不少彎路,其實 webmagic 的設計借鑑了 Scrapy ,所以它也能像 Scrapy 一樣強大,關於 webmagic 框架我們將在後續展開詳細的討論。

在後面的幾年工作中,也參與了好幾個爬蟲專案,但是大多數都是使用 Python ,拋開語言不談,爬蟲也是有一套思想的。這些年寫爬蟲程式,對我個人的技術成長幫助非常大,因為在爬蟲的過程中,會遇到各種各樣的問題,其實做網路爬蟲還是非常考驗技術的,除了保證自己的採集程式可用之外,還會遇到被爬網站各種奇奇怪怪的問題,比如整個 HTML 頁面有沒一個 class 或者 id 屬性,你要在這種頁面提取表格資料,並且做到優雅的提取,這就是非常考驗你的想象力以及技術啦。非常有幸在剛入行的時候就接觸到了網路爬蟲這一塊,它加快了我對網際網路的理解和認知,擴寬了我的視野。

這幾年來網路爬蟲比較火,如果你想學習 Java 網路爬蟲,我根據我自己的經驗總結了一下,想入門學習 Java 網路爬蟲需要知道的四點基礎知識。

1、有 “道德” 的爬蟲

我為什麼會把這一點放在最前面呢?因為我覺得這一點比較重要,什麼叫有 “道德” 的爬蟲呢?就是遵循被爬伺服器的規則,不去影響被爬伺服器的正常執行,不把被爬服務搞垮,這就是有 “道德” 的爬蟲。

經常有人討論的一個問題就是爬蟲合法嗎?知乎一下你看到的將是這樣的


答案千千萬,在這眾多答案中,我個人比較贊同下面的這個回答

爬蟲作為一種計算機技術就決定了它的中立性,因此爬蟲本身在法律上並不被禁止,但是利用爬蟲技術獲取資料這一行為是具有違法甚至是犯罪的風險的。所謂具體問題具體分析,正如水果刀本身在法律上並不被禁止使用,但是用來捅人,就不被法律所容忍了。

爬蟲為不違法?取決於你做的事情為不違法,網路爬蟲的本質是什麼?網路爬蟲的本質是用機器代替人工去訪問頁面。我檢視公開的新聞肯定不犯法,所以我去採集公開在網際網路上的新聞也不犯法,就像各大搜索引擎網站一樣,別的網站巴不得別搜尋引擎的蜘蛛抓取到。另一種恰恰相反的情況是去採集別人隱私的資料,你自己去檢視別人的隱私資訊這就是一種違法的行為,所以用程式去採集也是違法的,這就像答案中所說的水果刀本身不違法,但是用來捅人就違法啦。

要做到有 “道德” 的爬蟲,Robots 協議是你必須需要了解的,下面是Robots 協議的百度百科


在很多網站中會申明 Robots 協議告訴你哪些頁面是可以抓取的,哪些頁面是不能抓取的,當然 Robots 協議只是一種約定,就像公交車上的座位一樣標明著老弱病殘專座,你去坐了也不違法。

除了協議之外,我們的採集行為上也需要剋制,在 『資料安全管理辦法(徵求意見稿)』的第二章第十六條指出:

網路運營者採取自動化手段訪問收集網站資料,不得妨礙網站正常執行;此類行為嚴重影響網站執行,如自動化訪問收集流量超過網站日均流量三分之一,網站要求停止自動化訪問收集時,應當停止。

這條規定指出了爬蟲程式不得妨礙網站正常執行,如果你使用爬蟲程式把網站搞垮了,真正的訪問者就不能訪問該網站了,這是一種非常不道德的行為。應該杜絕這種行為。

除了資料的採集,在資料的使用上同樣需要注意,我們即使在得到授權的情況下采集了個人資訊資料,也千萬不要去出賣個人資料,這個是法律特別指出禁止的,參見:

根據《最高人民法院 最高人民檢察院關於辦理侵犯公民個人資訊刑事案件適用法律若干問題的解釋》第五條規定,對“情節嚴重”的解釋:

  • (1)非法獲取、出售或者提供行蹤軌跡資訊、通訊內容、徵信資訊、財產資訊五十條以上的;
  • (2)非法獲取、出售或者提供住宿資訊、通訊記錄、健康生理資訊、交易資訊等其他可能影響人身、財產安全的公民個人資訊五百條以上的;
  • (3)非法獲取、出售或者提供第三項、第四項規定以外的公民個人資訊五千條以上的便構成“侵犯公民個人資訊罪”所要求的“情節嚴重”。
  • 此外,未經被收集者同意,即使是將合法收集的公民個人資訊向他人提供的,也屬於刑法第二百五十三條之一規定的“提供公民個人資訊”,可能構成犯罪。

2、學會分析 Http 請求

我們每一次與服務端的互動都是通過 Http 協議,當然也有不是 Http 協議的,這個能不能採集我就不知道啦,沒有采集過,所以我們只談論 Http 協議,在 Web 網頁中分析 Http 協議還是比較簡單,我們以百度檢索一條新聞為例

我們開啟 F12 除錯工具,點選 NetWork 檢視版能檢視到所有的請求,找到我們位址列中的連結,主連結一般存在 NetWork 最上面一條連結


在右邊headers檢視欄中,我們能夠看到這次請求所需要的引數,在這裡我們需要特別注意 Request Headers 和 Query String Parameters 這兩個選項欄。

Request Headers 表示的是該次 Http 請求所需要的請求頭的引數,有一些網站會根據請求頭來遮蔽爬蟲,所以裡面的引數還是需要了解一下的,請求頭引數中大部分引數都是公用的, User-Agent 和 Cookie 這兩個引數使用比較頻繁, User-Agent 標識瀏覽器請求頭,Cookie 存放的是使用者登入憑證。

Query String Parameters 表示該次 Http 請求的請求引數,對於post 請求來說這個還是非常重要的,因為在這裡可以檢視到請求引數,對我們模擬登陸等 Post 請求非常有用。

上面是網頁版的 HTTP 請求的連結分析,如果需要採集 APP 裡面的資料就需要藉助模擬器了,因為 APP 裡沒有除錯工具,所以只能藉助模擬器,使用較多的模擬器工具有如下兩種,有興趣的可以執行研究。

  • fiddler
  • wireshark

3、學會 HTML 頁面解析

我們採集的頁面都是 HTML 頁面,我們需要在 HTML 頁面中獲取我們需要的資訊,這裡面就涉及到了 HTML 頁面解析,也就是 DOM 節點解析,這一點是重中之重,如果你不會這一點就像魔術師沒有道具一樣,只能乾瞪眼啦。例如下面這個 HTML 頁面


我們需要獲取標題 “java user-agent 判斷是否電腦訪問” ,我們先通過 F12 檢查元素


標題所在的 span 標籤我已經在圖中框出來啦,我們該如何解析這個節點資訊呢?方法有千千萬萬,經常使用的選擇器應該是 CSS 選擇器 和 XPath ,如果你還不知道這兩種選擇器,可以點選下方連結學習瞭解一下:

CSS 選擇器參考手冊:https://www.w3school.com.cn/cssref/css_selectors.asp

XPath 教程:https://www.w3school.com.cn/xpath/xpath_syntax.asp

使用 CSS 選擇器解析的寫法為:#wgt-ask > h1 > span

使用 XPath 解析的寫法為://span[@class="wgt-ask"]

這樣就獲取到了 span 的節點,值需要取出 text 就好了,對於 CSS 選擇器 和 XPath 除了自己編寫之外,我們還可以藉助瀏覽器來幫我們完成,例如 chrome 瀏覽器


只需要選中對應的節點,右鍵找到 Copy ,它提供了幾種獲取該節點的解析方式,具體的入上圖所示,Copy selector 對應的就是 Css 選擇器,Copy XPath 對應的是 XPath,這個功能還是非常有用的。

4、瞭解反爬蟲策略

因為現在爬蟲非常氾濫,很多網站都會有反爬蟲機制,來過濾掉爬蟲程式,以便保證網站的可以用,這也是非常有必要的手段,畢竟如果網站不能使用了,就沒有利益可談啦。反爬蟲的手段非常多,我們來看看幾種常見的反爬蟲手段。

基於 Headers 的反爬蟲機制

這是一種比較常見的反爬蟲機制,網站通過檢查 Request Headers 中的 User-Agent 、Referer 引數,來判斷該程式是不是爬蟲程式。要繞過這種機制就比較簡單,我們只需要在網頁中先檢視該網站所需要的 User-Agent 、Referer 引數的值,然後在爬蟲程式的 Request Headers 設定好這些引數就好啦。

基於使用者行為的反爬蟲機制

這也是一種常見的反爬蟲機制,最常用的就是 IP 訪問限制,一個 IP 在一段時間內只被允許訪問多少次,如果超過這個頻次的話就會被認為是爬蟲程式,比如豆瓣電影就會通過 IP 限制。

對於這種機制的話,我們可以通過設定代理 IP 來解決這個問題,我們只需要從代理ip網站上獲取一批代理ip,在請求的時候通過設定代理 IP 即可。

除了 IP 限制之外,還會有基於你每次的訪問時間間隔,如果你每次訪問的時間間隔都是固定的,也可能會被認為是爬蟲程式。要繞過這個限制就是在請求的時候,時間間隔設定不一樣,比例這次休眠 1 分鐘,下次 30 秒。

基於動態頁面的反爬蟲機制

有很多網站,我們需要採集的資料是通過 Ajax 請求的或者通過 JavaScript生成的,對於這種網站是比較蛋疼的,繞過這種機制,我們有兩種辦法,一種是藉助輔助工具,例如 Selenium 等工具獲取渲染完成的頁面。第二種方式就是反向思維法,我們通過獲取到請求資料的 AJAX 連結,直接訪問該連結獲取資料。

以上就是爬蟲的一些基本知識,主要介紹了網路爬蟲的使用工具和反爬蟲策略,這些東西在後續對我們的爬蟲學習會有所幫助,由於這幾年斷斷續續的寫過幾個爬蟲專案,使用 Java 爬蟲也是在前期,後期都是用 Python,最近突然間對 Java 爬蟲又感興趣了,所以準備寫一個爬蟲系列博文,重新梳理一下 Java 網路爬蟲,算是對 Java 爬蟲的一個總結,如果能幫助到想利用 Java 做網路爬蟲的小夥伴,那就更棒啦。Java 網路爬蟲預計會有六篇文章的篇幅,從簡單到複雜,一步一步深入,內容涉及到了我這些年爬蟲所遇到的所有問題。下面是模擬的六篇文章介紹。

1、網路爬蟲,原來這麼簡單

這一篇是網路爬蟲的入門,會使用 Jsoup 和 HttpClient 兩種方式獲取到頁面,然後利用選擇器解析得到資料。最後你會收穫到爬蟲就是一條 http 請求,就是這麼簡單。

2、網頁採集遇到登入問題,我該怎麼辦?

這一章節簡單的聊一聊獲取需要登入的資料,以獲取豆瓣個人資訊為例,從手動設定 cookies 和模擬登陸這兩種方式簡單的聊一聊這類問題。

3、網頁採集遇到資料 Ajax 非同步載入,我該怎麼辦?

這一章節簡單的聊一聊非同步資料的問題,以網易新聞為例,從利用 htmlunit 工具獲取渲染完頁面和反向思維直接獲取到 Ajax 請求連接獲取資料兩種方式,簡單的聊一下這類問題的處理方式。

4、網頁採集 IP 被封,我該怎麼辦?

IP 訪問被限制這應該是常見的事情,以豆瓣電影為例,主要以設定代理IP為中心,簡單的聊一聊 IP 被限制的解決辦法,還會簡單的聊一下如何搭建自己的ip代理服務。

5、網路採集效能太差,我該怎麼辦?

有時候對爬蟲程式的效能有要求,這種單執行緒的方式可能就行不通了,我們可能就需要多執行緒甚至是分散式的爬蟲程式啦,所以這一篇主要聊一聊多執行緒爬蟲以及分散式爬蟲架構方案。

6、開源爬蟲框架 webmagic 使用案例解析

以前用 webmagic 做過一次爬蟲,但是那個時候我似懂非懂的,沒有很好的理解 webmagic 框架,經過這幾年的經歷,我現在對這個框架有了全新的認識,所以想按照 webmagic 的規範搭建一個簡單的 demo來體驗 webmagic 的強大之處。

以上就是我的爬蟲系列博文,用文字記錄點點滴滴,記錄我這個非專業的爬蟲玩家那些年遇到的坑,如果你準備學習 Java 網路爬蟲,不妨關注一波,我相信你會得到一定的收穫,因為我會用心的寫好每一篇文章。

最後

打個小廣告,歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,一起進步吧。

相關推薦

Java 網路爬蟲需要哪些基礎知識

說起網路爬蟲,大家想起的估計都是 Python ,誠然爬蟲已經是 Python 的代名詞之一,相比 Java 來說就要遜色不少。有不少人都不知道 Java 可以做網路爬蟲,其實 Java 也能做網路爬蟲而且還能做的非常好,在開源社群中有不少優秀的 Java 網路爬蟲框架,例如 webmagic 。我的第一份正

嵌入式軟體開發是否需要經驗需要哪些基礎知識

       本人從畢業到現在一直在嵌入式軟體這個行業發展,已七年有餘,也曾經迷茫無助過,也驕傲自滿過,到現在算是趨於一個比較穩定的狀態,嵌入式軟體開發的專案本身程式碼量不會太大,除了一些特殊的方面外,基本難度都不是太大,曾經認為只要有人帶著,什麼樣的人都可以從事這個行業,

Java 網路爬蟲就是這麼的簡單

這是 Java 網路爬蟲系列文章的第一篇,如果你還不知道 Java 網路爬蟲系列文章,請參看 學 Java 網路爬蟲,需要哪些基礎知識。第一篇是關於 Java 網路爬蟲入門內容,在該篇中我們以採集虎撲列表新聞的新聞標題和詳情頁為例,需要提取的內容如下圖所示: 我們需要提取圖中圈出來的文字及其對應的連結,在

Web安全需要哪些基礎知識

html, js, css, json, xml, url, http header 的語法格式和編碼 字元編碼主要就是ascii, iso-8859-1, utf-8, utf-16 作業系統(WIndwos、linux等)命令列編碼,檔名規則,  oracle, m

程式設計學習小結(2)程式設計需要哪些基礎知識

編碼這麼久,編碼需要哪些基礎知識呢?有人說“貌似不需要什麼基礎知識?我們公司只要是大學畢業,不管什麼專業,在我們這搞一段時間都可以做的很好!”。的確很多公司,尤其是大公司,培訓流程相對完善,工作流程也比較規範,無論是什麼專業,即使程式設計0基礎,在公司學習一段時間,掌握一些編碼基礎知識和程式設

爬蟲需要掌握哪些Python基礎

入手爬蟲確實不要求你精通Python程式設計,但基礎知識還是不能忽視的,那麼我們需要哪些Python基礎呢? 首先我們先來看看一個最簡單的爬蟲流程:     第一步要確定爬取頁面的連結,由於我們通常爬取的內容不止一頁,所以要注意看看翻頁、關鍵字變化時連結

【熱門】零基礎手繪插畫需要掌握哪些要點?

零基礎學手繪插畫,需要掌握哪些要點?這是學習畫手繪插畫的人最開始苦惱的一個問題。想要讓自己更好的畫出完美的手繪插畫,是需要掌握一些小技巧的。下面就和小編一起來看看零基礎自學手繪插畫的方法。   學手繪插畫的方法   一、學手繪插畫的基礎 素描基礎是所有美術繪畫的敲門

入行大資料需要學習哪些基礎知識

大資料的發展歷程總體上可以劃分為三個重要階段,萌芽期、成熟期和大規模應用期,20世紀90年至21世紀初,為萌芽期,隨著,一批商業智慧工具和知識管理技術的開始和應用,度過了資料萌芽。 推薦下小編的大資料學習群;251956502,不管你是小白還是大牛,小編我都歡迎,不定期分享乾貨,歡迎初學和進階中

[記錄]Java網路爬蟲基礎和抓取網站資料的兩個小例項

前段時間在學習爬蟲,並從網路抓取了一些簡單的資料,記錄一下。 抓取分成下面3個部分: 1、網路請求 2、解析抓取下來的頁面,並且處理亂碼或者解壓程式碼的問題 3、拿到指定的資料、資源 完整程式碼如下: 第一個例項: /** * 從某網站查詢所有帖子標題 * 把所有

基礎轉行學習Java編程哪些學習方法可以借鑒

智慧 交通 ice 一個 智能 移動互聯 更多 方式 做網頁 中國互聯網的加速發展,大概從1997年開始,前期是 PC 互聯網,後來移動互聯網,現在互聯網+,再接下來物聯網、智慧城市、智慧交通、人工智能,一路蓬勃發展,雖有小波折,大趨勢從未變過,未來一面泛化、一面深化,十年

入門大資料需要學習哪些基礎知識

大資料的發展歷程總體上可以劃分為三個重要階段,萌芽期、成熟期和大規模應用期,20世紀90年至21世紀初,為萌芽期,隨著,一批商業智慧工具和知識管理技術的開始和應用,度過了資料萌芽。 推薦一個大資料學習群 119599574晚上20:10都有一節【免費的】大資料直播課程,專注

java 開發用到網路爬蟲抓取汽車之家網站全部資料經歷

經歷了兩個禮拜的折騰,某某知名網站的資料終於到手了。犯罪沒被發現這種心情感覺很爽。 說一下我的犯罪經歷,之前公司總是抓取某某網站資料,可能是被發現了。某某網站改變了策略。通過各種技術終止了我們的行為,導致我們的抓取功能報錯,逐步跟蹤,發現我們之前是在人家的網站,通過Webh

Java開發系統學習需要哪些內容?

Java開發 Java編程 Java基礎 Java入門 隨著技術的發展,市場的需要,很多盆友想轉行Java開發,但又苦惱於不知道該學什麽內容,總是找了很多資料,但總是不夠系統。那麽要做Java開發,蛻變學習需要的內容有:  第一階段,Java SE基礎:  Java環境搭建、Java流程控制語

開補習班辦資證難不難需要哪些證呢?

習慣養成 涵蓋 線下 營業執照 高素質 ali 教育資源 justify 培訓機構 很多沒有經驗開補習班的盆友都在開班前考慮一個問題,如果我開一個補習班需要辦資質證明嗎,隨著國家對一些不合規的教輔機構的嚴查,都使得很多想開班的人望而卻步。那麽開班需要哪些證呢?為什麽要辦

實施微服務需要哪些基礎框架和技術熱點

文章來自微信公眾號:DevOps 引 言 微服務(MicroServices)架構是當前網際網路業界的一個技術熱點,圈裡有不少同行朋友當前有計劃在各自公司開展微服務化體系建設,他們都有相同的疑問:一個微服務架構有哪些技術關注點(technical concerns)?需要哪些基

Java網路爬蟲初體驗

一.什麼是爬蟲 引用百度百科的介紹:“網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或著蠕蟲” 以上介紹關鍵資訊:自動的抓取資訊的程式或指

java實現爬蟲爬取網易歌單資訊

之前一直對爬蟲很好奇,覺得它很神祕,而我有個朋友是做爬蟲的,最近有空就向他學習了一下,並試著寫了個小程式。 首先是獲得httpclient物件及httpresponse物件,此兩者是用於傳送請求及接受資料。 CloseableHttpClient httpClient

2018年末Java主流技術還有哪些是你不知道的?

2018年全新的Java後端技術(如下圖) 1.原始碼分析   2.1分散式架構   2.2分散式架構   2.3分散式架構   3.微服務架構   4.併發程式設計

一門程式語言的發展史-----python!(人生苦短我用python)------一門語言需要先了解

起源----呱呱落地     Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的指令碼解釋程式,作為ABC 語言的一種繼承。之所以選中Python(大蟒蛇的意思)作為該程式語言的名字,是因為

一門編程語言的發展史-----python!(人生苦短我用python)------一門語言需要先了解√

ref ali 視覺 str 縮進 自己的 發展史 tdi for 起源----呱呱落地 Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本解釋程序,作為ABC 語言的一