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