本文作者:qiaoqingyi

二次解析源码开源(简单二次解析源码)

qiaoqingyi 2023-04-10 752

本篇文章给大家谈谈二次解析源码开源,以及简单二次解析源码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

开源爬虫框架各有什么优缺点?

首先爬虫框架有三种

分布式爬虫:Nutch

JAVA单机爬虫:Crawler4j,WebMagic,WebCollector

非JAVA单机爬虫:scrapy

第一类:分布式爬虫

优点:

海量URL管理

网速快

缺点:

Nutch是为搜索引擎设计的爬虫,大多数用户是需要一个做精准数据爬取(精抽取)的爬虫。Nutch运行的一套流程里,有三分之二是为了搜索引擎而设计的。对精抽取没有太大的意义。

用Nutch做数据抽取,会浪费很多的时间在不必要的计算上。而且如果你试图通过对Nutch进行二次开发,来使得它适用于精抽取的业务,基本上就要破坏Nutch的框架,把Nutch改的面目全非。

Nutch依赖hadoop运行,hadoop本身会消耗很多的时间。如果集群机器数量较少,爬取速度反而不如单机爬虫。

Nutch虽然有一套插件机制,而且作为亮点宣传。可以看到一些开源的Nutch插件,提供精抽取的功能。但是开发过Nutch插件的人都知道,Nutch的插件系统有多蹩脚。利用反射的机制来加载和调用插件,使得程序的编写和调试都变得异常困难,更别说在上面开发一套复杂的精抽取系统了。

Nutch并没有为精抽取提供相应的插件挂载点。Nutch的插件有只有五六个挂载点,而这五六个挂载点都是为了搜索引擎服务的,并没有为精抽取提供挂载点。大多数Nutch的精抽取插件,都是挂载在“页面解析”(parser)这个挂载点的,这个挂载点其实是为了解析链接(为后续爬取提供URL),以及为搜索引擎提供一些易抽取的网页信息(网页的meta信息、text)

用Nutch进行爬虫的二次开发,爬虫的编写和调试所需的时间,往往是单机爬虫所需的十倍时间不止。了解Nutch源码的学习成本很高,何况是要让一个团队的人都读懂Nutch源码。调试过程中会出现除程序本身之外的各种问题(hadoop的问题、hbase的问题)。

Nutch2的版本目前并不适合开发。官方现在稳定的Nutch版本是nutch2.2.1,但是这个版本绑定了gora-0.3。Nutch2.3之前、Nutch2.2.1之后的一个版本,这个版本在官方的SVN中不断更新。而且非常不稳定(一直在修改)。

第二类:JAVA单机爬虫

优点:

支持多线程。

支持代理。

能过滤重复URL的。

负责遍历网站和下载页面。爬js生成的信息和网页信息抽取模块有关,往往需要通过模拟浏览器(htmlunit,selenium)来完成。

缺点:

设计模式对软件开发没有指导性作用。用设计模式来设计爬虫,只会使得爬虫的设计更加臃肿。

第三类:非JAVA单机爬虫

优点:

先说python爬虫,python可以用30行代码,完成JAVA

50行代码干的任务。python写代码的确快,但是在调试代码的阶段,python代码的调试往往会耗费远远多于编码阶段省下的时间。

使用python开发,要保证程序的正确性和稳定性,就需要写更多的测试模块。当然如果爬取规模不大、爬取业务不复杂,使用scrapy这种爬虫也是蛮不错的,可以轻松完成爬取任务。

缺点:

bug较多,不稳定。

爬虫可以爬取ajax信息么?

网页上有一些异步加载的数据,爬取这些数据有两种方法:使用模拟浏览器(问题1中描述过了),或者分析ajax的http请求,自己生成ajax请求的url,获取返回的数据。如果是自己生成ajax请求,使用开源爬虫的意义在哪里?其实是要用开源爬虫的线程池和URL管理功能(比如断点爬取)。

如果我已经可以生成我所需要的ajax请求(列表),如何用这些爬虫来对这些请求进行爬取?      

爬虫往往都是设计成广度遍历或者深度遍历的模式,去遍历静态或者动态页面。爬取ajax信息属于deepweb(深网)的范畴,虽然大多数爬虫都不直接支持。但是也可以通过一些方法来完成。比如WebCollector使用广度遍历来遍历网站。爬虫的第一轮爬取就是爬取种子集合(seeds)中的所有url。简单来说,就是将生成的ajax请求作为种子,放入爬虫。用爬虫对这些种子,进行深度为1的广度遍历(默认就是广度遍历)。

爬虫怎么爬取要登陆的网站?

这些开源爬虫都支持在爬取时指定cookies,模拟登陆主要是靠cookies。至于cookies怎么获取,不是爬虫管的事情。你可以手动获取、用http请求模拟登陆或者用模拟浏览器自动登陆获取cookie。

爬虫怎么抽取网页的信息?

开源爬虫一般都会集成网页抽取工具。主要支持两种规范:CSSSELECTOR和XPATH。

网页可以调用爬虫么?

爬虫的调用是在Web的服务端调用的,平时怎么用就怎么用,这些爬虫都可以使用。

爬虫速度怎么样?

单机开源爬虫的速度,基本都可以讲本机的网速用到极限。爬虫的速度慢,往往是因为用户把线程数开少了、网速慢,或者在数据持久化时,和数据库的交互速度慢。而这些东西,往往都是用户的机器和二次开发的代码决定的。这些开源爬虫的速度,都很可以。

手把手带你分析LeanCancary源码

LeakCancary 是一个实时监控内存泄漏的开源框架,当检测到有内存泄漏时,会以通知的方式提示开发者当前发生了内存泄漏

监听activity的生命周期,在Activity的onDestory方法中,开始监听activity对象, 通过将Activity包装到WeakReference中,被WeakReference包装过的Activity对象如果被回收,该WeakReference引用会被放到ReferenceQueue中,通过监测ReferenceQueue里面的内容就能检查到Activity是否能够被回收。其中最重要的两个对象为

SetString retainedKeys: 存放所有监控的Activity的key(值为通过uuid,唯一标识Activity)

ReferenceQueueObject queue:所有被回收的activity对象会存放到这个引用队列里面, 如果想要知道一个activity有没有内存泄漏,则只需要判断该activity在

1.在build.gradle中添加依赖

至此,LeakCancary 的接入工作就完成了,是不是超简单?

我们从入口函数开始分析

首先判断当前运行的进程是否是属于HeapAnalyzerService进程,如果是 则return调,防止应用本身Application的onCreate方法多次初始化。这里需要这么做的原因是:LeakCancary本身是运行在另外一个进程中的,这点我们可以从LeakCancary的AndroidManifaset.xml中可以看出是有单独设置process Named的。

接下来执行 LeakCanary.install

LeakCanary.refWatcher()

通过builder模式构建了AndroidRefWatcherBuilder对象,然后通过AndroidRefWatcherBuilder对象设置了listenerServiceClass()用于绑定DisplayLeakService服务,该服务用来分析和显示内存泄漏信息的通知

AndroidRefWatchBuilder.buildAndInstall

先调用AndroidRefWatchBuilder.buid() 构建一个RefWatcher对象

构建RefWatcher的参数有

解析来是

LeakCancaryInternal.java

启动DisplayLeakActivity并显示应用图标,这个图标是LeakCancary这个应用的图标

接下来是执行 :

ActivityRefWatcher.install(context, refWatcher);

在Activity的onDestroy方法中执行RefWatcher.watch(activity)

RefWatcher.java

这里需要注意几个变量:

这里有一个知识点:弱引用和引用队列配合时,当弱引用持有的对象被垃圾回收,java虚拟机会把这个弱引用加入到与之关联的引用队列中。也就是说当activity被回收时,activity对象的引用就会被添加到ReferenceQueue这个引用队列中。

接下来是具体的内存泄漏判断过程

efWatcher.ensureGoneAsync

这里的watchExecutor 实现类是AndroidWatchExecutor

AndroidWatchExecutor.execute()

这里是切换到主线程,当消息队列空闲时执行run方法, run方法实际执行的是RefWatcher中的ensureGone()

RefWatcher.ensureGone();

遍历ReferenceQueue列表中的对象(这些对象已经被回收), 判断对象是否存在当前activity的弱引用,存在则删除retainedKeys中的activity的key 值; 如果activity没有被回收,则不会添加到ReferenceQueue,也就不会从retainedKeys中移除

2.通过gone(reference)来判断当前弱引用对应的Activity是否存在于retainedKeys?如果不存在,则说明通过第一步的操作,已经移除了该引用的key值,直接返回即可。

3.如果第二部没有返回,说明retainedKeys还存在当前activity的引用(也就是改activity没有被添加到ReferenceQueue,没有被回收),则调用GcTigger.runGc方法运行GC.

AndroidHeapDumper.dumpHeap()

调用 File heapDumpFile = leakDirectoryProvider.newHeapDumpFile(); 新建hprof文件,然后调用Debug.dumpHprofData() 方法 dump 当前堆内存并写入刚才创建的文件。

然后调用heapdumpListener.analyze(heapDump)分析刚刚生成的heapDumpwen文件

这里的heapdumpListener 是ServiceHeapDumpListener

调用HeapAnalyzerService开始启动HeapAnalyzerService 这个前台服务执行分析

HeapAnalyzerService.java

调用heapAnalyzer.checkForLeak 获取结果后,调用AbstractAnalysisResultService.sendResultToListener展示分析结果。具体是通过DisplayLeakService 来展示的。

最后会执行afterDefaultHandling方法,在这里我们可以自定义一些操作,例如上报泄漏信息给服务器

LeakCancary主要是利用了弱引用 WeakReference 和 引用队列 ReferenceQueue的知识,当WeakReference中引用的对象被回收时,该引用会被添加到ReferenceQueue中,如果没有被回收,则不会添加到ReferenceQueue中。 所以可以通过检测ReferenceQueue是否存在activity的引用来判断activity是否存在泄漏导致没有回收。

LeakCanacary 监控内存泄漏主要流程如下:

参考

二次解析源码开源(简单二次解析源码)

半年java经验,二次开发不懂,正常吗?

你这种情况属于没掌握二次开发方法,很正常的,慢慢锻炼把。不清楚你做二次开发是怎么弄的,我的个人想法以及我的做法是:首先了解该开源框架的架构、所使用技术。然后根据项目需求,找到牵扯到该功能所牵扯到的模块。如果只是修改ui界面,这个应该比较容易,其实就是jsp或者模版技术的功底。如果是牵扯修改原本功能的话,那么你要明白这个模块调用过程,能大概的把一个类调用另一个类的关系画出来。慢慢来吧,虽然代码有200M多,你不用全部看,但你最好要了解这个项目的架构,如果你以后要发展,那么开源项目的架构设计是你需要借鉴的。

CMS二次开发概念

DedeCMS系统的模板是非固定的,用户可以在新建栏目时可以自行选择栏目模板,官方仅提供最基本的默认模板,即是内置系统模型的各个模板,由于DedeCMS支持自定义频道模型,用户自定义新频道模型后,还需要按该模型的字段设计一套新的模板,此外,DedeCMS也支持使用风格的形式使用模板,默认风格是 default,它表示系统默认使用 {cmspath}/templets/default 这个文件夹的模板。

一、概念

1、板块(封面)模板:

指网站主页或比较重要的栏目封面频道使用的模板,一般用“index_识别ID.htm”命名,此外,用户单独定义的单个页面或自定义标记,也可选是否支持板块模板标记,如果支持,系统会用板块模板标记引擎去解析后才输出内容或生成特定的文件。

2、列表模板:

指网站某个栏目的所有文章列表的模板,一般用 “list_识别ID.htm” 命名。

3、档案模板:

表示文档查看页的模板,如文章模板,一般用 “article_识别ID.htm” 命名。

4、其它模板:

一般系统常规包含的模板有:主页模板、搜索模板、RSS、JS编译功能模板等,此外用户也可以自定义一个模板创建为任意文件。

二、 命名,DedeCMS模板默认命名规则如下

1、模板保存位置:

模板目录:{cmspath} /templets/样式名称(英文,默认为default,其中system为系统底层模板,plus为插件使用的模板)/具体功能模板文件} 。

2、 模板文件命名规范:

(1)index_识别ID.htm: 表示板块(栏目封面)模板;

(2)list_识别ID.htm: 表示栏目列表模板;

(3)article_识别ID.htm: 表示内容查看页(文档模板,包括专题查看页);

(4)search.htm: 搜索结果列表模板;

(5)index.htm: 主页模板;

四、二次开发

在V5.3中已经将标签开发分离出来,可以通过后台[模板]-[标签代码管理],点击“新增加一个新的标签”来创建一个自己的标签,标签文件名为:标签名.lib.php 。

怎么自己做网站

自己做网站的步骤如下:

1、域名注册。网站建设首先你需要一个属于你自己的网址,也就是域名。

2、网站空间注册。网站空间是用来放网站程序的。网站空间分为ASP、PHP、NET,三种类型。

3、网站备案

国内的网站空间都需要备案,没有备案的网站不允许上线。

4、上传网站程序

网上有很多免费网站程序,论坛(discuz)、博客(Emlog、WordPress、Z-blog)、综合站(PageAdminCMS系统)等,根据自己的网站来选择程序。

5、添加网站内容。我们可以在备案期间来完成网站内容添加,添加网站内容也是比较简单。进入网站后台新建网站栏目,自己需要几个栏目就建几个。

6、解析域名和绑定域名。备案号后通过我就可以把域名解析到空间IP上了,域名解析完成后,再在空间的管理面板上把解析好的域名绑定。在地址栏输入你的域名。就可以访问到你的网站。

关于二次解析源码开源和简单二次解析源码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

阅读
分享