提及網絡爬蟲,你們想起的估計都是 Python ,誠然爬蟲已是 Python 的代名詞之一,相比 Java 來講就要遜色很多。有很多人都不知道 Java 能夠作網絡爬蟲,其實 Java 也能作網絡爬蟲並且還能作的很是好,在開源社區中有很多優秀的 Java 網絡爬蟲框架,例如 webmagic 。個人第一份正式工做就是使用 webmagic 編寫數據採集程序,當時參與了一個輿情分析系統的開發,這裏面涉及到了大量網站的新聞採集,咱們就使用了 webmagic 進行採集程序的編寫,因爲當時不知道其設計原理,使用起來仍是走了很多彎路,其實 webmagic 的設計借鑑了 Scrapy ,因此它也能像 Scrapy 同樣強大,關於 webmagic 框架咱們將在後續展開詳細的討論。css
在後面的幾年工做中,也參與了好幾個爬蟲項目,可是大多數都是使用 Python ,拋開語言不談,爬蟲也是有一套思想的。這些年寫爬蟲程序,對我我的的技術成長幫助很是大,由於在爬蟲的過程當中,會遇到各類各樣的問題,其實作網絡爬蟲仍是很是考驗技術的,除了保證本身的採集程序可用以外,還會遇到被爬網站各類奇奇怪怪的問題,好比整個 HTML 頁面有沒一個 class 或者 id 屬性,你要在這種頁面提取表格數據,而且作到優雅的提取,這就是很是考驗你的想象力以及技術啦。很是有幸在剛入行的時候就接觸到了網絡爬蟲這一塊,它加快了我對互聯網的理解和認知,擴寬了個人視野。html
這幾年來網絡爬蟲比較火,若是你想學習 Java 網絡爬蟲,我根據我本身的經驗總結了一下,想入門學習 Java 網絡爬蟲須要知道的四點基礎知識。java
我爲何會把這一點放在最前面呢?由於我以爲這一點比較重要,什麼叫有 「道德」 的爬蟲呢?就是遵循被爬服務器的規則,不去影響被爬服務器的正常運行,不把被爬服務搞垮,這就是有 「道德」 的爬蟲。web
常常有人討論的一個問題就是爬蟲合法嗎?知乎一下你看到的將是這樣的ajax
答案千千萬,在這衆多答案中,我我的比較贊同下面的這個回答chrome
爬蟲做爲一種計算機技術就決定了它的中立性,所以爬蟲自己在法律上並不被禁止,可是利用爬蟲技術獲取數據這一行爲是具備違法甚至是犯罪的風險的。所謂具體問題具體分析,正如水果刀自己在法律上並不被禁止使用,可是用來捅人,就不被法律所容忍了。瀏覽器
爬蟲爲不違法?取決於你作的事情爲不違法,網絡爬蟲的本質是什麼?網絡爬蟲的本質是用機器代替人工去訪問頁面。我查看公開的新聞確定不犯法,因此我去採集公開在互聯網上的新聞也不犯法,就像各大搜索引擎網站同樣,別的網站恨不得別搜索引擎的蜘蛛抓取到。另外一種偏偏相反的狀況是去採集別人隱私的數據,你本身去查看別人的隱私信息這就是一種違法的行爲,因此用程序去採集也是違法的,這就像答案中所說的水果刀自己不違法,可是用來捅人就違法啦。安全
要作到有 「道德」 的爬蟲,Robots 協議是你必須須要瞭解的,下面是Robots 協議的百度百科服務器
在不少網站中會申明 Robots 協議告訴你哪些頁面是能夠抓取的,哪些頁面是不能抓取的,固然 Robots 協議只是一種約定,就像公交車上的座位同樣標明着老弱病殘專座,你去坐了也不違法。微信
除了協議以外,咱們的採集行爲上也須要剋制,在 『數據安全管理辦法(徵求意見稿)』的第二章第十六條指出:
網絡運營者採起自動化手段訪問收集網站數據,不得妨礙網站正常運行;此類行爲嚴重影響網站運行,如自動化訪問收集流量超過網站日均流量三分之一,網站要求中止自動化訪問收集時,應當中止。
這條規定指出了爬蟲程序不得妨礙網站正常運行,若是你使用爬蟲程序把網站搞垮了,真正的訪問者就不能訪問該網站了,這是一種很是不道德的行爲。應該杜絕這種行爲。
除了數據的採集,在數據的使用上一樣須要注意,咱們即便在獲得受權的狀況下采集了我的信息數據,也千萬不要去出賣我的數據,這個是法律特別指出禁止的,參見:
根據《最高人民法院 最高人民檢察院關於辦理侵犯公民我的信息刑事案件適用法律若干問題的解釋》第五條規定,對「情節嚴重」的解釋:
- (1)非法獲取、出售或者提供行蹤軌跡信息、通訊內容、徵信信息、財產信息五十條以上的;
- (2)非法獲取、出售或者提供住宿信息、通訊記錄、健康生理信息、交易信息等其餘可能影響人身、財產安全的公民我的信息五百條以上的;
- (3)非法獲取、出售或者提供第三項、第四項規定之外的公民我的信息五千條以上的便構成「侵犯公民我的信息罪」所要求的「情節嚴重」。
- 此外,未經被收集者贊成,即便是將合法收集的公民我的信息向他人提供的,也屬於刑法第二百五十三條之一規定的「提供公民我的信息」,可能構成犯罪。
咱們每一次與服務端的交互都是經過 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 裏沒有調試工具,因此只能藉助模擬器,使用較多的模擬器工具備以下兩種,有興趣的能夠執行研究。
咱們採集的頁面都是 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,這個功能仍是很是有用的。
由於如今爬蟲很是氾濫,不少網站都會有反爬蟲機制,來過濾掉爬蟲程序,以便保證網站的能夠用,這也是很是有必要的手段,畢竟若是網站不能使用了,就沒有利益可談啦。反爬蟲的手段很是多,咱們來看看幾種常見的反爬蟲手段。
這是一種比較常見的反爬蟲機制,網站經過檢查 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 網絡爬蟲預計會有六篇文章的篇幅,從簡單到複雜,一步一步深刻,內容涉及到了我這些年爬蟲所遇到的全部問題。下面是模擬的六篇文章介紹。
這一篇是網絡爬蟲的入門,會使用 Jsoup 和 HttpClient 兩種方式獲取到頁面,而後利用選擇器解析獲得數據。最後你會收穫到爬蟲就是一條 http 請求,就是這麼簡單。
這一章節簡單的聊一聊獲取須要登陸的數據,以獲取豆瓣我的信息爲例,從手動設置 cookies 和模擬登錄這兩種方式簡單的聊一聊這類問題。
這一章節簡單的聊一聊異步數據的問題,以網易新聞爲例,從利用 htmlunit 工具獲取渲染完頁面和反向思惟直接獲取到 Ajax 請求鏈接獲取數據兩種方式,簡單的聊一下這類問題的處理方式。
IP 訪問被限制這應該是常見的事情,以豆瓣電影爲例,主要以設置代理IP爲中心,簡單的聊一聊 IP 被限制的解決辦法,還會簡單的聊一下如何搭建本身的ip代理服務。
有時候對爬蟲程序的性能有要求,這種單線程的方式可能就行不通了,咱們可能就須要多線程甚至是分佈式的爬蟲程序啦,因此這一篇主要聊一聊多線程爬蟲以及分佈式爬蟲架構方案。
之前用 webmagic 作過一次爬蟲,可是那個時候我似懂非懂的,沒有很好的理解 webmagic 框架,通過這幾年的經歷,我如今對這個框架有了全新的認識,因此想按照 webmagic 的規範搭建一個簡單的 demo來體驗 webmagic 的強大之處。
以上就是個人爬蟲系列博文,用文字記錄點點滴滴,記錄我這個非專業的爬蟲玩家那些年遇到的坑,若是你準備學習 Java 網絡爬蟲,不妨關注一波,我相信你會獲得必定的收穫,由於我會用心的寫好每一篇文章。
打個小廣告,歡迎掃碼關注微信公衆號:「平頭哥的技術博文」,一塊兒進步吧。