java数据采集内容设计

wad12302 发布于 2014/06/05 09:43
阅读 1K+
收藏 2

java数据采集内容设计

打算通过正则表达式 进行过滤和赛选,正则可以通过配置修改,

现在疑问是,如果正则表达式已经改变了,那么程序是否也需要改动

特别是正则内容结构改变了,那么程序内是否需要改变。

比如原先是获取到内容是 是 评论 一条一条的,如果现在不是一条一条的,如果匹配的内容结构修改了,代码是否需要修改

加载中
0
Ryan-瑞恩
Ryan-瑞恩

有成品的爬虫。。。。。

解析的话,有HTML解析的jar包。。。很方便提取数据!!!

0
len
len

不需要改,不仅仅是正则那么简单,大致需要html解析,主要的流程包括

  1. 定位要解析的DOM
  2. 解析数据,可能内容中还有广告,这时需要过滤或者替换
  3. 如果是递归解析,还需要配置url规则
  4. 有的网站把一篇文章分成几篇,所以可能还需要下一页规则。

下面发一个我之前做过的采集模块参你参考下。

{
    "site": {
        "domain": "http://www.hdz8.cn",
        "encoding": "gb2312",
        "startUrl": "http://www.hdz8.cn",
        "interval": 6000,
        "urlfilter": [
            {
                "role": "contains",
                "text": "www.hdz8.cn/html"
            },
            {
                "role": "except",
                "text": "javascript"
            },
            {
                "role": "except",
                "text": "css"
            },
            {
                "role": "except",
                "text": "_"
            },
            {
                "role": "except",
                "text": "image"
            }
        ],
        "titlefilter": [
            {
                "role": "cutLFRF",
                "start": "",
                "end": "-"
            }
        ],
        "sortfilter": {
            "attr": "class",
            "identify": "dh",
            "idx": "0",
            "orderby": "desc",
            "rule": [
                {
                    "role": "remove",
                    "key": "<div*zhaiyao*/div>"
                },
                {
                    "role": "remove",
                    "key": "<*script*</script>"
                },
                {
                    "role": "remove",
                    "key": "<div*float:right*</div>"
                },
                {
                    "role": "replace",
                    "key": "<a.*?>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "</a>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "<div>  </div>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "<div>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "</div>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<[p|P].*?>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"</[p|P].*?>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<[/]?font.*?>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"<[br|BR|br/|BR/]>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<(.*?)>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"\r\n\r\n",
                    "value":"\r\n"
                }
            ]
        },
        "contentfilter": {
            "attr": "id",
            "identify": "content",
            "rule": [
                {
                    "role": "cutLFRF",
                    "start": "",
                    "end": "<div id=\"page"
                },
                {
                    "role": "remove",
                    "key": "<div*zhaiyao*/div>"
                },
                {
                    "role": "remove",
                    "key": "<*script*</script>"
                },
                {
                    "role": "remove",
                    "key": "<div*float:right*</div>"
                },
                {
                    "role": "remove",
                    "key": "<*strong*strong>"
                },
                {
                    "role": "remove",
                    "key": "<div*page*</div>"
                },
                {
                    "role": "remove",
                    "key": "<a*hdz*</a>"
                },
                {
                    "role": "replace",
                    "key": "<a.*?>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "www.hdz8.cn",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "</a>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "<div>  </div>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "<div>",
                    "value": ""
                },
                {
                    "role": "replace",
                    "key": "</div>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<[p|P].*?>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"</[p|P].*?>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<[/]?font.*?>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"<[br|BR|br/|BR/]>",
                    "value":"\r\n"
                },
                {
                    "role":"replace",
                    "key":"<(.*?)>",
                    "value":""
                },
                {
                    "role":"replace",
                    "key":"\r\n\r\n",
                    "value":"\r\n"
                }
            ]
        },
        "pagesfilter":{
            "attr": "id",
            "identify": "page",
            "rule": [
                {
                    "role": "remove",
                    "key": "<a*下一页*a>"
                }
            ]
        }
    }
}



wad12302
wad12302
回复 @len : 请看下面图示的问题,谢谢
len
len
回复 @wad12302 : 那你就用集合返回就行了,对方的结构变了,你需要改的就是上面那个配置文件。就把它当成一个新的网站来处理就行了。我的设计目的是为了针对我想采集的各个网站配置不同的解析规则。当网站变了就改变解析规则。
wad12302
wad12302
还有能不能把你的例子给一个 怎么使用这些filter 有没有用例
wad12302
wad12302
不需要改,不仅仅是正则那么简单,大致需要html解析,主要的流程包括 这个不明白,解析html 如果开始解析的是返回多条记录,而后对方界面结构改变了,我们需要修改正在,解析html的方法需要修改源码吗?还是只修改正则就行?
0
wad12302
wad12302


打个比方,我要采集火车时刻表,采集每列火车时候 把里面的内容 信息在此采集存入数据库里面;

现在面临的问题是:我第一层可以采集每一行一列火车,可以通过设置正则表达式采集,

但是每列火车时刻信息里面的时候 再次怎么设置正则表达式?每个属性的正则表达式不一样,如果都设置作为一个list 那么怎么知道 什么时候该取那个正则,同时 每个正则采集到的都是list 不能把列车信息匹配错误,

正则表达式的结构怎么编排?树形结构还是直接都是一个等级别的存储?

0
wad12302
wad12302
现在系统要采集一些网络资料,准备做一个数据采集抓取的功能,然后存入数据库表信息
把功能作为可配置的,即 通过配置正则表达式 抓取不同网站的数据信息。
如图:如果采集火车时刻表,采集第一层 没什么问题,即 就是采集没列火车,可以通过配置一个正则表达式


但是如果要继续解析每列火车里面的详细信息的时候同时也需要为每个属性 如 起始点,结束地,开车时间,到达时间 这些设置 不同的正则表达式


这就涉及正则表达式 的排列层次问题,个人觉得不应该和第一层表达式在一个水平线,即并排的,


如果 需要采集的信息是:


T1 第一层{第二层[第三层(第四层)]} 
T2 第一层{第二层[第三层(第四层)]} 
T3 第一层{第二层[第三层(第四层)]} 
T4 第一层{第二层[第三层(第四层)]} 


这样的数据结构的时候,这个正则表达式怎么设计排序问题
已经正则表达式怎么 调用,而不造成数据错乱
0
len
len
我看了去哪网的页面结构,去哪是采用ajax处理的,那么从上面你的截图看第一步是采集出每列火车的信息,第二步是循环拼URL:http://train.qunar.com/search/s2sMore.jsp?callback=jQuery17207272595283575356_1402064447363&format=js&from=%E5%8C%97%E4%BA%AC%E5%8D%97&to=%E4%B8%8A%E6%B5%B7&date=20140609&checi=D311&trainDateVersion=20140609&ex_track=&ver=1402064583294&_=1402064583297 采集到这些列车的时刻信息。每一个列车就是一个对象,时刻列表信息就是这个对象中的一个属性,循环采集一个就解析到当前这个对象中就行了。
wad12302
wad12302
像你说的: 采集出每列火车的信息,第二步是循环拼URL: 如果对于其他的业务来说,这样的流程可能就不适用了,就可能需要额外去开发另一个业务的service逻辑,不能复用很多啊
wad12302
wad12302
是的,现在问题是,如果采用固定的对象,那么我要用采集器去采集其他数据的时候,不是火车时刻的信息,那么是否要修改代码?从新开发,我想要的效果是,程序后台代码就基于一套,以后需要抓取其他的数据结构,可以复用后台代码,不用而外去开发程序了
0
len
len
你这个不太可能,比如你抓取去哪和抓取腾讯阅读能使用一套逻辑么,应该是不能的。
0
len
len
我开发那个的目的是解析各内文章网站,如果用来解析这样的带数据结构的也是不行的。
wad12302
wad12302
如果不用一套逻辑,这种情况就先不考虑了, 就说刚才的火车的 第一步,和第二步, 2个步骤都是用正则表达式,那么是否必须在业务代码里面控制好 先执行那个正则,后执行那个正则,就是这个顺序只能固定好的?还是可以灵活控制
0
len
len
不考虑去哪这种Ajax取值的,如果是一次回来,数据都在HTML里,一般如果我做的话我会先考虑尽量先用这个正则将这个数据分段,最好的结果是分成的一个块中就包含当前的列车信息+自己的时刻信息,后面再循环处理就行了。如果分不成这样的,那也分成对等的(两类数据数组长度一至,一般我在采集双语对照翻译的时候遇到过)这样保持数组索引对应也行。
wad12302
wad12302
就是说,对与列车具体的信息的拆分和组装都是在代码里面写好逻辑,如果逻辑变了,也只能修改少量代码了?是否可以这样理解
0
wad12302
wad12302

,后面再循环处理就行了。”

这个循环处理 是否可以设置成固定的,而不用经常变动?

0
len
len
我建议你先封装好你所需要数据的结构体,这个应该是不会变的,毕竟是你系统的根本,而采集本来就是要根据第三方的改变而改变的,所以有一个抽象的解析器,针对不同的第三方实现不同的解析器。这样来说是最好的方案,实际上改代码也是很快的事。前期还是不要考虑太多通用的逻辑,后期可以慢慢来优化。
返回顶部
顶部