二次解析源碼開源(簡單二次解析源碼)
本篇文章給大家談?wù)劧谓馕鲈创a開源,以及簡單二次解析源碼對應(yīng)的知識點,希望對各位有所幫助,不要忘了收藏本站喔。
本文目錄一覽:
- 1、開源爬蟲框架各有什么優(yōu)缺點?
- 2、手把手帶你分析LeanCancary源碼
- 3、半年java經(jīng)驗,二次開發(fā)不懂,正常嗎?
- 4、CMS二次開發(fā)概念
- 5、怎么自己做網(wǎng)站
開源爬蟲框架各有什么優(yōu)缺點?
首先爬蟲框架有三種
分布式爬蟲:Nutch
JAVA單機(jī)爬蟲:Crawler4j,WebMagic,WebCollector
非JAVA單機(jī)爬蟲:scrapy
第一類:分布式爬蟲
優(yōu)點:
海量URL管理
網(wǎng)速快
缺點:
Nutch是為搜索引擎設(shè)計的爬蟲,大多數(shù)用戶是需要一個做精準(zhǔn)數(shù)據(jù)爬?。ň槿。┑呐老x。Nutch運(yùn)行的一套流程里,有三分之二是為了搜索引擎而設(shè)計的。對精抽取沒有太大的意義。
用Nutch做數(shù)據(jù)抽取,會浪費(fèi)很多的時間在不必要的計算上。而且如果你試圖通過對Nutch進(jìn)行二次開發(fā),來使得它適用于精抽取的業(yè)務(wù),基本上就要破壞Nutch的框架,把Nutch改的面目全非。
Nutch依賴hadoop運(yùn)行,hadoop本身會消耗很多的時間。如果集群機(jī)器數(shù)量較少,爬取速度反而不如單機(jī)爬蟲。
Nutch雖然有一套插件機(jī)制,而且作為亮點宣傳??梢钥吹揭恍╅_源的Nutch插件,提供精抽取的功能。但是開發(fā)過Nutch插件的人都知道,Nutch的插件系統(tǒng)有多蹩腳。利用反射的機(jī)制來加載和調(diào)用插件,使得程序的編寫和調(diào)試都變得異常困難,更別說在上面開發(fā)一套復(fù)雜的精抽取系統(tǒng)了。
Nutch并沒有為精抽取提供相應(yīng)的插件掛載點。Nutch的插件有只有五六個掛載點,而這五六個掛載點都是為了搜索引擎服務(wù)的,并沒有為精抽取提供掛載點。大多數(shù)Nutch的精抽取插件,都是掛載在“頁面解析”(parser)這個掛載點的,這個掛載點其實是為了解析鏈接(為后續(xù)爬取提供URL),以及為搜索引擎提供一些易抽取的網(wǎng)頁信息(網(wǎng)頁的meta信息、text)
用Nutch進(jìn)行爬蟲的二次開發(fā),爬蟲的編寫和調(diào)試所需的時間,往往是單機(jī)爬蟲所需的十倍時間不止。了解Nutch源碼的學(xué)習(xí)成本很高,何況是要讓一個團(tuán)隊的人都讀懂Nutch源碼。調(diào)試過程中會出現(xiàn)除程序本身之外的各種問題(hadoop的問題、hbase的問題)。
Nutch2的版本目前并不適合開發(fā)。官方現(xiàn)在穩(wěn)定的Nutch版本是nutch2.2.1,但是這個版本綁定了gora-0.3。Nutch2.3之前、Nutch2.2.1之后的一個版本,這個版本在官方的SVN中不斷更新。而且非常不穩(wěn)定(一直在修改)。
第二類:JAVA單機(jī)爬蟲
優(yōu)點:
支持多線程。
支持代理。
能過濾重復(fù)URL的。
負(fù)責(zé)遍歷網(wǎng)站和下載頁面。爬js生成的信息和網(wǎng)頁信息抽取模塊有關(guān),往往需要通過模擬瀏覽器(htmlunit,selenium)來完成。
缺點:
設(shè)計模式對軟件開發(fā)沒有指導(dǎo)性作用。用設(shè)計模式來設(shè)計爬蟲,只會使得爬蟲的設(shè)計更加臃腫。
第三類:非JAVA單機(jī)爬蟲
優(yōu)點:
先說python爬蟲,python可以用30行代碼,完成JAVA
50行代碼干的任務(wù)。python寫代碼的確快,但是在調(diào)試代碼的階段,python代碼的調(diào)試往往會耗費(fèi)遠(yuǎn)遠(yuǎn)多于編碼階段省下的時間。
使用python開發(fā),要保證程序的正確性和穩(wěn)定性,就需要寫更多的測試模塊。當(dāng)然如果爬取規(guī)模不大、爬取業(yè)務(wù)不復(fù)雜,使用scrapy這種爬蟲也是蠻不錯的,可以輕松完成爬取任務(wù)。
缺點:
bug較多,不穩(wěn)定。
爬蟲可以爬取ajax信息么?
網(wǎng)頁上有一些異步加載的數(shù)據(jù),爬取這些數(shù)據(jù)有兩種方法:使用模擬瀏覽器(問題1中描述過了),或者分析ajax的http請求,自己生成ajax請求的url,獲取返回的數(shù)據(jù)。如果是自己生成ajax請求,使用開源爬蟲的意義在哪里?其實是要用開源爬蟲的線程池和URL管理功能(比如斷點爬?。?。
如果我已經(jīng)可以生成我所需要的ajax請求(列表),如何用這些爬蟲來對這些請求進(jìn)行爬??? ? ? ?
爬蟲往往都是設(shè)計成廣度遍歷或者深度遍歷的模式,去遍歷靜態(tài)或者動態(tài)頁面。爬取ajax信息屬于deepweb(深網(wǎng))的范疇,雖然大多數(shù)爬蟲都不直接支持。但是也可以通過一些方法來完成。比如WebCollector使用廣度遍歷來遍歷網(wǎng)站。爬蟲的第一輪爬取就是爬取種子集合(seeds)中的所有url。簡單來說,就是將生成的ajax請求作為種子,放入爬蟲。用爬蟲對這些種子,進(jìn)行深度為1的廣度遍歷(默認(rèn)就是廣度遍歷)。
爬蟲怎么爬取要登陸的網(wǎng)站?
這些開源爬蟲都支持在爬取時指定cookies,模擬登陸主要是靠cookies。至于cookies怎么獲取,不是爬蟲管的事情。你可以手動獲取、用http請求模擬登陸或者用模擬瀏覽器自動登陸獲取cookie。
爬蟲怎么抽取網(wǎng)頁的信息?
開源爬蟲一般都會集成網(wǎng)頁抽取工具。主要支持兩種規(guī)范:CSSSELECTOR和XPATH。
網(wǎng)頁可以調(diào)用爬蟲么?
爬蟲的調(diào)用是在Web的服務(wù)端調(diào)用的,平時怎么用就怎么用,這些爬蟲都可以使用。
爬蟲速度怎么樣?
單機(jī)開源爬蟲的速度,基本都可以講本機(jī)的網(wǎng)速用到極限。爬蟲的速度慢,往往是因為用戶把線程數(shù)開少了、網(wǎng)速慢,或者在數(shù)據(jù)持久化時,和數(shù)據(jù)庫的交互速度慢。而這些東西,往往都是用戶的機(jī)器和二次開發(fā)的代碼決定的。這些開源爬蟲的速度,都很可以。
手把手帶你分析LeanCancary源碼
LeakCancary 是一個實時監(jiān)控內(nèi)存泄漏的開源框架,當(dāng)檢測到有內(nèi)存泄漏時,會以通知的方式提示開發(fā)者當(dāng)前發(fā)生了內(nèi)存泄漏
監(jiān)聽activity的生命周期,在Activity的onDestory方法中,開始監(jiān)聽activity對象, 通過將Activity包裝到WeakReference中,被WeakReference包裝過的Activity對象如果被回收,該WeakReference引用會被放到ReferenceQueue中,通過監(jiān)測ReferenceQueue里面的內(nèi)容就能檢查到Activity是否能夠被回收。其中最重要的兩個對象為
SetString retainedKeys: 存放所有監(jiān)控的Activity的key(值為通過uuid,唯一標(biāo)識Activity)
ReferenceQueueObject queue:所有被回收的activity對象會存放到這個引用隊列里面, 如果想要知道一個activity有沒有內(nèi)存泄漏,則只需要判斷該activity在
1.在build.gradle中添加依賴
至此,LeakCancary 的接入工作就完成了,是不是超簡單?
我們從入口函數(shù)開始分析
首先判斷當(dāng)前運(yùn)行的進(jìn)程是否是屬于HeapAnalyzerService進(jìn)程,如果是 則return調(diào),防止應(yīng)用本身Application的onCreate方法多次初始化。這里需要這么做的原因是:LeakCancary本身是運(yùn)行在另外一個進(jìn)程中的,這點我們可以從LeakCancary的AndroidManifaset.xml中可以看出是有單獨設(shè)置process Named的。
接下來執(zhí)行 LeakCanary.install
LeakCanary.refWatcher()
通過builder模式構(gòu)建了AndroidRefWatcherBuilder對象,然后通過AndroidRefWatcherBuilder對象設(shè)置了listenerServiceClass()用于綁定DisplayLeakService服務(wù),該服務(wù)用來分析和顯示內(nèi)存泄漏信息的通知
AndroidRefWatchBuilder.buildAndInstall
先調(diào)用AndroidRefWatchBuilder.buid() 構(gòu)建一個RefWatcher對象
構(gòu)建RefWatcher的參數(shù)有
解析來是
LeakCancaryInternal.java
啟動DisplayLeakActivity并顯示應(yīng)用圖標(biāo),這個圖標(biāo)是LeakCancary這個應(yīng)用的圖標(biāo)
接下來是執(zhí)行 :
ActivityRefWatcher.install(context, refWatcher);
在Activity的onDestroy方法中執(zhí)行RefWatcher.watch(activity)
RefWatcher.java
這里需要注意幾個變量:
這里有一個知識點:弱引用和引用隊列配合時,當(dāng)弱引用持有的對象被垃圾回收,java虛擬機(jī)會把這個弱引用加入到與之關(guān)聯(lián)的引用隊列中。也就是說當(dāng)activity被回收時,activity對象的引用就會被添加到ReferenceQueue這個引用隊列中。
接下來是具體的內(nèi)存泄漏判斷過程
efWatcher.ensureGoneAsync
這里的watchExecutor 實現(xiàn)類是AndroidWatchExecutor
AndroidWatchExecutor.execute()
這里是切換到主線程,當(dāng)消息隊列空閑時執(zhí)行run方法, run方法實際執(zhí)行的是RefWatcher中的ensureGone()
RefWatcher.ensureGone();
遍歷ReferenceQueue列表中的對象(這些對象已經(jīng)被回收), 判斷對象是否存在當(dāng)前activity的弱引用,存在則刪除retainedKeys中的activity的key 值; 如果activity沒有被回收,則不會添加到ReferenceQueue,也就不會從retainedKeys中移除
2.通過gone(reference)來判斷當(dāng)前弱引用對應(yīng)的Activity是否存在于retainedKeys?如果不存在,則說明通過第一步的操作,已經(jīng)移除了該引用的key值,直接返回即可。
3.如果第二部沒有返回,說明retainedKeys還存在當(dāng)前activity的引用(也就是改activity沒有被添加到ReferenceQueue,沒有被回收),則調(diào)用GcTigger.runGc方法運(yùn)行GC.
AndroidHeapDumper.dumpHeap()
調(diào)用 File heapDumpFile = leakDirectoryProvider.newHeapDumpFile(); 新建hprof文件,然后調(diào)用Debug.dumpHprofData() 方法 dump 當(dāng)前堆內(nèi)存并寫入剛才創(chuàng)建的文件。
然后調(diào)用heapdumpListener.analyze(heapDump)分析剛剛生成的heapDumpwen文件
這里的heapdumpListener 是ServiceHeapDumpListener
調(diào)用HeapAnalyzerService開始啟動HeapAnalyzerService 這個前臺服務(wù)執(zhí)行分析
HeapAnalyzerService.java
調(diào)用heapAnalyzer.checkForLeak 獲取結(jié)果后,調(diào)用AbstractAnalysisResultService.sendResultToListener展示分析結(jié)果。具體是通過DisplayLeakService 來展示的。
最后會執(zhí)行afterDefaultHandling方法,在這里我們可以自定義一些操作,例如上報泄漏信息給服務(wù)器
LeakCancary主要是利用了弱引用 WeakReference 和 引用隊列 ReferenceQueue的知識,當(dāng)WeakReference中引用的對象被回收時,該引用會被添加到ReferenceQueue中,如果沒有被回收,則不會添加到ReferenceQueue中。 所以可以通過檢測ReferenceQueue是否存在activity的引用來判斷activity是否存在泄漏導(dǎo)致沒有回收。
LeakCanacary 監(jiān)控內(nèi)存泄漏主要流程如下:
參考
半年java經(jīng)驗,二次開發(fā)不懂,正常嗎?
你這種情況屬于沒掌握二次開發(fā)方法,很正常的,慢慢鍛煉把。不清楚你做二次開發(fā)是怎么弄的,我的個人想法以及我的做法是:首先了解該開源框架的架構(gòu)、所使用技術(shù)。然后根據(jù)項目需求,找到牽扯到該功能所牽扯到的模塊。如果只是修改ui界面,這個應(yīng)該比較容易,其實就是jsp或者模版技術(shù)的功底。如果是牽扯修改原本功能的話,那么你要明白這個模塊調(diào)用過程,能大概的把一個類調(diào)用另一個類的關(guān)系畫出來。慢慢來吧,雖然代碼有200M多,你不用全部看,但你最好要了解這個項目的架構(gòu),如果你以后要發(fā)展,那么開源項目的架構(gòu)設(shè)計是你需要借鑒的。
CMS二次開發(fā)概念
DedeCMS系統(tǒng)的模板是非固定的,用戶可以在新建欄目時可以自行選擇欄目模板,官方僅提供最基本的默認(rèn)模板,即是內(nèi)置系統(tǒng)模型的各個模板,由于DedeCMS支持自定義頻道模型,用戶自定義新頻道模型后,還需要按該模型的字段設(shè)計一套新的模板,此外,DedeCMS也支持使用風(fēng)格的形式使用模板,默認(rèn)風(fēng)格是 default,它表示系統(tǒng)默認(rèn)使用 {cmspath}/templets/default 這個文件夾的模板。
一、概念
1、板塊(封面)模板:
指網(wǎng)站主頁或比較重要的欄目封面頻道使用的模板,一般用“index_識別ID.htm”命名,此外,用戶單獨定義的單個頁面或自定義標(biāo)記,也可選是否支持板塊模板標(biāo)記,如果支持,系統(tǒng)會用板塊模板標(biāo)記引擎去解析后才輸出內(nèi)容或生成特定的文件。
2、列表模板:
指網(wǎng)站某個欄目的所有文章列表的模板,一般用 “l(fā)ist_識別ID.htm” 命名。
3、檔案模板:
表示文檔查看頁的模板,如文章模板,一般用 “article_識別ID.htm” 命名。
4、其它模板:
一般系統(tǒng)常規(guī)包含的模板有:主頁模板、搜索模板、RSS、JS編譯功能模板等,此外用戶也可以自定義一個模板創(chuàng)建為任意文件。
二、 命名,DedeCMS模板默認(rèn)命名規(guī)則如下
1、模板保存位置:
模板目錄:{cmspath} /templets/樣式名稱(英文,默認(rèn)為default,其中system為系統(tǒng)底層模板,plus為插件使用的模板)/具體功能模板文件} 。
2、 模板文件命名規(guī)范:
(1)index_識別ID.htm: 表示板塊(欄目封面)模板;
(2)list_識別ID.htm: 表示欄目列表模板;
(3)article_識別ID.htm: 表示內(nèi)容查看頁(文檔模板,包括專題查看頁);
(4)search.htm: 搜索結(jié)果列表模板;
(5)index.htm: 主頁模板;
四、二次開發(fā)
在V5.3中已經(jīng)將標(biāo)簽開發(fā)分離出來,可以通過后臺[模板]-[標(biāo)簽代碼管理],點擊“新增加一個新的標(biāo)簽”來創(chuàng)建一個自己的標(biāo)簽,標(biāo)簽文件名為:標(biāo)簽名.lib.php 。
怎么自己做網(wǎng)站
自己做網(wǎng)站的步驟如下:
1、域名注冊。網(wǎng)站建設(shè)首先你需要一個屬于你自己的網(wǎng)址,也就是域名。
2、網(wǎng)站空間注冊。網(wǎng)站空間是用來放網(wǎng)站程序的。網(wǎng)站空間分為ASP、PHP、NET,三種類型。
3、網(wǎng)站備案
國內(nèi)的網(wǎng)站空間都需要備案,沒有備案的網(wǎng)站不允許上線。
4、上傳網(wǎng)站程序
網(wǎng)上有很多免費(fèi)網(wǎng)站程序,論壇(discuz)、博客(Emlog、WordPress、Z-blog)、綜合站(PageAdminCMS系統(tǒng))等,根據(jù)自己的網(wǎng)站來選擇程序。
5、添加網(wǎng)站內(nèi)容。我們可以在備案期間來完成網(wǎng)站內(nèi)容添加,添加網(wǎng)站內(nèi)容也是比較簡單。進(jìn)入網(wǎng)站后臺新建網(wǎng)站欄目,自己需要幾個欄目就建幾個。
6、解析域名和綁定域名。備案號后通過我就可以把域名解析到空間IP上了,域名解析完成后,再在空間的管理面板上把解析好的域名綁定。在地址欄輸入你的域名。就可以訪問到你的網(wǎng)站。
關(guān)于二次解析源碼開源和簡單二次解析源碼的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
掃描二維碼推送至手機(jī)訪問。
版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請注明出處。