日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php框架 > 框架設(shè)計(jì) > 社會(huì)化海量數(shù)據(jù)采集爬蟲框架搭建

社會(huì)化海量數(shù)據(jù)采集爬蟲框架搭建

來源:程序員人生   發(fā)布時(shí)間:2015-01-19 08:23:11 閱讀次數(shù):4257次

原文地址: http://www.lanceyan.com/tech/arch/snscrawler.html


隨著BIG DATA大數(shù)據(jù)概念逐步升溫,如何搭建1個(gè)能夠收集海量數(shù)據(jù)的架構(gòu)體系擺在大家眼前。如何能夠做到所見即所得的無阻止式收集、如何快速把不規(guī)則頁面結(jié)構(gòu)化并存儲、如何滿足愈來愈多的數(shù)據(jù)收集還要在有限時(shí)間內(nèi)收集。這篇文章結(jié)合我們本身項(xiàng)目經(jīng)驗(yàn)談1下。

我們來看1下作為人是怎樣獲得網(wǎng)頁數(shù)據(jù)的呢?

1、打開閱讀器,輸入網(wǎng)址url訪問頁面內(nèi)容。
2、復(fù)制頁面內(nèi)容的標(biāo)題、作者、內(nèi)容。
3、存儲到文本文件或excel。

從技術(shù)角度來講全部進(jìn)程主要為 網(wǎng)絡(luò)訪問、扣取結(jié)構(gòu)化數(shù)據(jù)、存儲。我們看1下用java程序如何來實(shí)現(xiàn)這1進(jìn)程。

import java.io.IOException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.lang.StringUtils;

public class HttpCrawler {
       public static void main(String[] args) {

            String content = null ;
             try {
                  HttpClient httpClient = new HttpClient();
                   //1、網(wǎng)絡(luò)要求
                  GetMethod method = new GetMethod("http://www.baidu.com" );
                   int statusCode = httpClient.executeMethod(method);
                   if (statusCode == HttpStatus. SC_OK) {
                        content = method.getResponseBodyAsString();
                         //結(jié)構(gòu)化扣取
                        String title = StringUtils.substringBetween(content, "<title>" , "</title>" );
                         //存儲
                        Systemout .println(title);
                  }

            } catch (HttpException e) {
                  e.printStackTrace();
            } catch (IOException e) {
                  e.printStackTrace();
            } finally {
            }
      }
}

通過這個(gè)例子,我們看到通過httpclient獲得數(shù)據(jù),通過字符串操作扣取標(biāo)題內(nèi)容,然后通過system.out輸出內(nèi)容。大家是否是感覺做1個(gè)爬蟲也還是蠻簡單呢。這是1個(gè)基本的入門例子,我們再詳細(xì)介紹怎樣1步1步構(gòu)建1個(gè)散布式的適用于海量數(shù)據(jù)收集的爬蟲框架。

全部框架應(yīng)當(dāng)包括以下部份,資源管理、反監(jiān)控管理、抓取管理、監(jiān)控管理。看1下全部框架的架構(gòu)圖:


  • 資源管理指網(wǎng)站分類體系、網(wǎng)站、網(wǎng)站訪問url等基本資源的管理保護(hù);
  • 反監(jiān)控管理指被訪問網(wǎng)站(特別是社會(huì)化媒體)會(huì)制止爬蟲訪問,怎樣讓他們不能監(jiān)控到我們的訪問時(shí)爬蟲軟件,這就是反監(jiān)控機(jī)制了;

  • 1個(gè)好的收集框架,不管我們的目標(biāo)數(shù)據(jù)在哪兒,只要用戶能夠看到都應(yīng)當(dāng)能收集到。所見即所得的無阻止式收集,不管是不是需要登錄的數(shù)據(jù)都能夠順利收集?,F(xiàn)在大部份社交網(wǎng)站都需要登錄,為了應(yīng)對登錄的網(wǎng)站要有摹擬用戶登錄的爬蟲系統(tǒng),才能正常獲得數(shù)據(jù)。不過社會(huì)化網(wǎng)站都希望自己構(gòu)成1個(gè)閉環(huán),不愿意把數(shù)據(jù)放到站外,這類系統(tǒng)也不會(huì)像新聞等內(nèi)容那末開放的讓人獲得。這些社會(huì)化網(wǎng)站大部份會(huì)采取1些限制避免機(jī)器人爬蟲系統(tǒng)爬取數(shù)據(jù),1般1個(gè)賬號爬取不了多久就會(huì)被檢測出來被制止訪問了。那是否是我們就不能爬取這些網(wǎng)站的數(shù)據(jù)呢?肯定不是這樣的,只要社會(huì)化網(wǎng)站不關(guān)閉網(wǎng)頁訪問,正常人能夠訪問的數(shù)據(jù),我們也能訪問。說到底就是摹擬人的正常行動(dòng)操作,專業(yè)1點(diǎn)叫“反監(jiān)控”。

    那1般網(wǎng)站會(huì)有甚么限制呢?

    1定時(shí)間內(nèi)單IP訪問次數(shù),沒有哪一個(gè)人會(huì)在1段延續(xù)時(shí)間內(nèi)過快訪問,除非是隨便的點(diǎn)著玩,延續(xù)時(shí)間也不會(huì)太長??梢圆扇〈罅坎灰?guī)則代理IP來摹擬。

    1定時(shí)間內(nèi)單賬號訪問次數(shù),這個(gè)同上,正常人不會(huì)這么操作??梢圆扇〈罅啃袆?dòng)正常的賬號,行動(dòng)正常就是普通人怎樣在社交網(wǎng)站上操作,如果1個(gè)人1天24小時(shí)都在訪問1個(gè)數(shù)據(jù)接口那就有多是機(jī)器人了。

    如果能把賬號和IP的訪問策略控制好了,基本可以解決這個(gè)問題了。固然對方網(wǎng)站也會(huì)有運(yùn)維會(huì)調(diào)劑策略,說到底這是1個(gè)戰(zhàn)爭,躲在電腦屏幕后的敵我雙方,爬蟲必須要能感知到對方的反監(jiān)控策略進(jìn)行了調(diào)劑,通知管理員及時(shí)處理。未來比較理想應(yīng)當(dāng)是通過機(jī)器學(xué)習(xí)算法自動(dòng)完成策略調(diào)劑,保證抓取不中斷。

  • 抓取管理指通過url,結(jié)合資源、反監(jiān)控抓取數(shù)據(jù)并存儲;我們現(xiàn)在大部份爬蟲系統(tǒng),很多都需要自己設(shè)定正則表達(dá)式,或使用htmlparser、jsoup等軟件來硬編碼解決結(jié)構(gòu)化抓取的問題。不過大家在做爬蟲也會(huì)發(fā)現(xiàn),如果爬取1個(gè)網(wǎng)站就去開發(fā)1個(gè)類,在范圍小的時(shí)候還可以接受,如果需要抓取的網(wǎng)站不計(jì)其數(shù),那我們不是要開發(fā)成百上千的類。為此我們開發(fā)了1個(gè)通用的抓取類,可以通過參數(shù)驅(qū)動(dòng)內(nèi)部邏輯調(diào)度。比如我們在參數(shù)里指定抓取新浪微博,抓取機(jī)器就會(huì)調(diào)度新浪微博網(wǎng)頁扣取規(guī)則抓取節(jié)點(diǎn)數(shù)據(jù),調(diào)用存儲規(guī)則存儲數(shù)據(jù),不管甚么類型最后都調(diào)用同1個(gè)類來處理。對我們用戶只需要設(shè)置抓取規(guī)則,相應(yīng)的后續(xù)處理就交給抓取平臺了。

  • 全部抓取使用了 xpath、正則表達(dá)式、消息中間件、多線程調(diào)度框架(參考)。xpath 是1種結(jié)構(gòu)化網(wǎng)頁元素選擇器,支持列表和單節(jié)點(diǎn)數(shù)據(jù)獲得,他的好處可以支持規(guī)整網(wǎng)頁數(shù)據(jù)抓取。我們使用的是google插件 XPath Helper,這個(gè)玩意可以支持在網(wǎng)頁點(diǎn)擊元素生成xpath,就省去了自己去查找xpath的工夫,也便于未來做到所點(diǎn)即所得的功能。正則表達(dá)式補(bǔ)充xpath抓取不到的數(shù)據(jù),還可以過濾1些特殊字符。消息中間件,起到抓取任務(wù)中間轉(zhuǎn)發(fā)的目的,避免抓取和各個(gè)需求方耦合。比如各個(gè)業(yè)務(wù)系統(tǒng)都可能抓取數(shù)據(jù),只需要向消息中間件發(fā)送1個(gè)抓取指令,抓取平臺抓完了會(huì)返回1條消息給消息中間件,業(yè)務(wù)系統(tǒng)在從消息中間件收到消息反饋,全部抓取完成。多線程調(diào)度框架之條件到過,我們的抓取平臺不可能在同1時(shí)刻只抓1個(gè)消息的任務(wù);也不可能無窮制抓取,這樣資源會(huì)耗盡,致使惡性循環(huán)。這就需要使用多線程調(diào)度框架來調(diào)度多線程任務(wù)并行抓取,并且任務(wù)的數(shù)量,保證資源的消耗正常。

    不管怎樣摹擬總還是會(huì)有異常的,這就需要有個(gè)異常處理模塊,有些網(wǎng)站訪問1段時(shí)間需要輸入驗(yàn)證碼,如果不處理后續(xù)永久返回不了正確數(shù)據(jù)。我們需要有機(jī)制能夠處理像驗(yàn)證碼這類異常,簡單就是有驗(yàn)證碼了人為去輸入,高級1些可以破解驗(yàn)證碼辨認(rèn)算法實(shí)現(xiàn)自動(dòng)輸入驗(yàn)證碼的目的。

    擴(kuò)大1下 :所見即所得我們是否是真的做到?規(guī)則配置也是個(gè)重復(fù)的大任務(wù)?重復(fù)網(wǎng)頁如何不抓???

    1、有些網(wǎng)站利用js生成網(wǎng)頁內(nèi)容,直接查看源代碼是1堆js。 可使用mozilla、webkit等可以解析閱讀器的工具包解析js、ajax,不過速度會(huì)有點(diǎn)慢。
    2、網(wǎng)頁里有1些css隱藏的文字。使用工具包把css隱藏文字去掉。
    3、圖片flash信息。 如果是圖片中文字辨認(rèn),這個(gè)比較好處理,能夠使用ocr辨認(rèn)文字就行,如果是flash目前只能存儲全部url。
    4、1個(gè)網(wǎng)頁有多個(gè)網(wǎng)頁結(jié)構(gòu)。如果只有1套抓取規(guī)則肯定不行的,需要多個(gè)規(guī)則配合抓取。
    5、html不完全,不完全就不能依照正常模式去扣取。這個(gè)時(shí)候用xpath肯定解析不了,我們可以先用htmlcleaner清洗網(wǎng)頁后再解析。
    6、 如果網(wǎng)站多起來,規(guī)則配置這個(gè)工作量也會(huì)非常大。如何幫助系統(tǒng)快速生成規(guī)則呢?首先可以配置規(guī)則可以通過可視化配置,比如用戶在看到的網(wǎng)頁想對它抓取數(shù)據(jù),只需要拉開插件點(diǎn)擊需要的地方,規(guī)則就自動(dòng)生成好了。另在量比較大的時(shí)候可視化還是不夠的,可以先將類型相同的網(wǎng)站歸類,再通過抓取的1些內(nèi)容聚類,可以統(tǒng)計(jì)學(xué)、可視化抓取把內(nèi)容扣取出幾個(gè)版本給用戶去糾正,最后確認(rèn)的規(guī)則就是新網(wǎng)站的規(guī)則。這些算法后續(xù)再講。這塊再補(bǔ)充1下(多謝zicjin建議)

    背景:如果我們需要抓取的網(wǎng)站很多,那如果靠可視化配置需要耗費(fèi)大量的人力,這是個(gè)本錢。并且這個(gè)交給不懂html的業(yè)務(wù)去配置準(zhǔn)確性值得考量,所以最后還是需要技術(shù)做很多事情。那我們能否通過技術(shù)手段可以幫助生成規(guī)則減少人力本錢,或幫助不懂技術(shù)的業(yè)務(wù)準(zhǔn)確的把數(shù)據(jù)扣取下來并大量復(fù)制。

    方案:先對網(wǎng)站分類,比如分為新聞、論壇、視頻等,這1類網(wǎng)站的網(wǎng)頁結(jié)構(gòu)是類似的。在業(yè)務(wù)打開需要扣取的還沒有錄入我們規(guī)則庫的網(wǎng)頁時(shí),他先設(shè)定這個(gè)頁面的分類(固然這個(gè)也能夠機(jī)器預(yù)先判斷,他們來選擇,這1步必須要人判斷下),有了分類后,我們會(huì)通過“統(tǒng)計(jì)學(xué)、可視化判斷”辨認(rèn)這1分類的字段規(guī)則,但是這個(gè)是機(jī)器辨認(rèn)的規(guī)則,可能不準(zhǔn)確,機(jī)器辨認(rèn)完后,還需要人在判斷1下。判斷完成后,最后構(gòu)成規(guī)則才是新網(wǎng)站的規(guī)則

    7、對付重復(fù)的網(wǎng)頁,如果重復(fù)抓取會(huì)浪費(fèi)資源,如果不抓需要1個(gè)海量的去重判斷緩存。判斷抓不抓,抓了后存不存,并且這個(gè)緩存需要快速讀寫。常見的做法有bloomfilter、相似度聚合、分類海明距離判斷。

  • 監(jiān)控管理指不管甚么系統(tǒng)都可能出問題,如果對方服務(wù)器宕機(jī)、網(wǎng)頁改版、更換地址等我們需要第1時(shí)間知道,這時(shí)候監(jiān)控系統(tǒng)就起到出現(xiàn)了問題及時(shí)發(fā)現(xiàn)并通知聯(lián)系人。

目前這樣的框架搭建起來基本可以解決大量的抓取需求了。通過界面可以管理資源、反監(jiān)控規(guī)則、網(wǎng)頁扣取規(guī)則、消息中間件狀態(tài)、數(shù)據(jù)監(jiān)控圖表,并且可以通過后臺調(diào)劑資源分配并能動(dòng)態(tài)更新保證抓取不斷電。不過如果1個(gè)任務(wù)的處理特別大,可能需要抓取24個(gè)小時(shí)或幾天。比如我們要抓取1條微博的轉(zhuǎn)發(fā),這個(gè)轉(zhuǎn)發(fā)是30w,那如果每頁線性去抓取耗時(shí)肯定是非常慢了,如果能把這30w拆分很多小任務(wù),那我們的并行計(jì)算能力就會(huì)提高很多。不能不提的就是把大型的抓取任務(wù)hadoop化,空話不說直接上圖:




生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产免费看| 国产黄色一级电影 | 黄色毛片在线 | 国产精品一区二区无线 | 伊人网站 | 爱情岛论坛首页永久网址 | 91精品国产91久久综合桃花 | 日本综合视频 | 精品成人在线视频 | 99久久久久久久久久久 | 成人av网站在线观看 | 日韩精品一区二区视频 | 青青草成人网 | 久久精品国产亚洲一区二区三区 | 精品国产乱码久久久久久久软件 | 91麻豆蜜桃一区二区三区 | 福利视频在线看 | 久久久夜色精品亚洲 | 97视频免费在线 | 黄污污网站 | 国产精品欧美一区二区三区不卡 | 欧美激情五月 | 久久久蜜臀国产一区二区 | 日韩三级一区 | 国产欧美一区二区精品久导航 | 日本色网址 | 国产亚洲视频在线观看 | 久久免费精品 | 欧美理论视频 | 国产专区在线 | 麻豆精品网站 | 天天看毛片 | 欧美日韩国产一区二区三区 | 欧美日韩国产二区 | av中文字幕一区二区 | 中文字幕日本视频 | 男人的av | 久久久久国产一级毛片高清网站 | 国产亚洲二区 | 亚洲精品电影网在线观看 | 亚洲国产精品福利 |