结构化网页内容抽取方法

为了从几个网站抽取内容,聚合到一起。我于2012年写了一个程序,从多个网站通过结构化方法抽取内容。然后写入数据库,形成一个网站。

(1)正则表达式抽取

首先,从数据库中读取内容抽取规则:

ArrayList<RuleBean> rbList = ruleDao.QueryAllRule();

 表结构如下:

 配置的抽取规则如下:

其次,读取网页内容,并通过起始标签抽取出内容,然后通过正则表达式读取出网址URL、标题和发表时间。

直接上代码如下:

private static void doCrawl(RuleBean rb) {     

        String urlContent = getUrlContent(rb.getCrawlUrl(),rb.getEncode());

        if("error".equalsIgnoreCase(urlContent)){

            return;

        }

        String contentArea = getContentArea(urlContent, rb.getAreaBegin(),

                rb.getAreaEnd());

 

        Pattern pt = Pattern.compile(rb.getRegex());

        Matcher mt = pt.matcher(contentArea);

            

        TitleAndUrlBean tuBean;

        while (mt.find()) {

            tuBean = new TitleAndUrlBean();

            tuBean.setAppName(rb.getAppName());

            tuBean.setInfoArea(rb.getInfoArea());

            String rowContent = mt.group();

            rowContent = rowContent.replaceAll(rb.getRemoveRegex(), "");

            // 获取标题

            Matcher title = Pattern.compile(rb.getTitleRegex()).matcher(

                    rowContent);

            while (title.find()) {

                String s = title.group().replaceAll("<u>|</u>|>|</a>|\\[.*?\\]|</l>","");

                if(s ==null || s.trim().length()<=0){

                    s = "error";

                }

                tuBean.setTitle(s);

                

            }

            // 获取网址

            Matcher myurl = Pattern.compile(rb.getUrlRegex()).matcher(

                    rowContent);

            while (myurl.find()) {

                String u = myurl.group().replaceAll(

                        "href=|\"|>|target=|_blank|title", "");

                u = u.replaceAll("\‘|\\\\", "");

                

                if(u!=null && (u.indexOf("http://")==-1)){

                    tuBean.setUrl(rb.getPrefix() + u);

                }else{

                    tuBean.setUrl(u);

                }            

            }

            if(tuBean.getUrl() ==null){

                tuBean.setUrl("error");

            }

            // 获取时间

            Matcher d = Pattern.compile(rb.getDateRegex()).matcher(rowContent);

            while (d.find()) {

                tuBean.setDeliveryDate(d.group());

            }

            boolean r = TitleAndUrlDAO.Add(tuBean);

            

            if (r){

                log.info("crawl add " + tuBean.getAppName() + "_"

                        + tuBean.getInfoArea()+"_"+tuBean.getTitle());

            

                if(tuBean.getAppName().contains("jww")){

                    Cache cTeach = CacheManager.getCacheInfo("index_teach");

                    if(cTeach!=null){

                        teachList  = (List<TitleAndUrlBean>) cTeach.getValue();

                    }

                    

                    teachList.add(tuBean);

                    if(teachList.size()>5){

                        teachList.remove(0);    

                    }

                    cTeach.setValue(teachList);

                    cTeach.setTimeOut(-1);

                    CacheManager.putCache("index_teach", cTeach);

                } 

            }

        }

        System.out.println("end crawl "+rb.getCrawlUrl());

    }

 

(2) dwr返回内容的抽取

在当时dwr是比较流行的技术,为了抽取dwr的内容,着实花了一番功夫。

首先通过httpClient获取内容

public static void startCrawl() throws Exception{

        DefaultHttpClient httpclient = new DefaultHttpClient();

        HttpResponse response = null;

        HttpEntity entity = null;

        httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,

                CookiePolicy.BROWSER_COMPATIBILITY);

        HttpPost httpost = new HttpPost(

                "http://XXXXXXXXXX/Tzgg.getMhggllList.dwr");

        

        List<NameValuePair> nvps = new ArrayList<NameValuePair>();

        

        nvps.add(new BasicNameValuePair("callCount", "1"));

        nvps.add(new BasicNameValuePair("page", "/oa/tzggbmh.do"));

        nvps.add(new BasicNameValuePair("c0-scriptName", "Tzgg"));

        nvps.add(new BasicNameValuePair("c0-methodName", "getMhggllList"));

        nvps.add(new BasicNameValuePair("c0-id", "0"));

        nvps.add(new BasicNameValuePair("c0-e1", "string:0"));

        nvps.add(new BasicNameValuePair("c0-e2", "string:0"));

        

        nvps.add(new BasicNameValuePair("c0-e4", "string:%20%20"));

        nvps.add(new BasicNameValuePair("c0-e5", "string:rsTable"));

        nvps.add(new BasicNameValuePair(

                "c0-param0",

                "Array:[reference:c0-e1,reference:c0-e2,reference:c0-e3,reference:c0-e4,reference:c0-e5]"));

        nvps.add(new BasicNameValuePair("c0-e6", "number:20"));

        nvps.add(new BasicNameValuePair("c0-e7", "number:1"));

        nvps.add(new BasicNameValuePair("c0-param1",

                "Object_Object:{pageSize:reference:c0-e6, currentPage:reference:c0-e7}"));

        nvps.add(new BasicNameValuePair("batchId", "0"));

        int infoArea = 1;

        while(infoArea <4){

            nvps.add(new BasicNameValuePair("c0-e3", "string:0"+infoArea));

            httpost.setEntity(new UrlEncodedFormEntity(nvps));

            response = httpclient.execute(httpost);

            entity = response.getEntity();

            try {

                String responseString = null;

                if (response.getEntity() != null) {

                    responseString = EntityUtils.toString(response.getEntity());

                    if(1 == infoArea){

                        extractData(responseString,"事务通知");

                        infoArea = 3;

                    }else if(infoArea == 3){

                        extractData(responseString,"公告公示");

                        infoArea = 100;

                    }

                }

            } finally {

                

            }   

        }

        httpclient.getConnectionManager().shutdown();

    }

然后通过正则表达式抽取

private static void extractData(String content,String infoArea) throws Exception{

        TitleAndUrlDAO tuDao = new TitleAndUrlDAO();

        TitleAndUrlBean tuBean;

        Pattern pt = Pattern.compile("llcs.*?a>");

        Matcher mt = pt.matcher(content);

        Cache c = new Cache();

        while (mt.find()) {

            tuBean = new TitleAndUrlBean();

            tuBean.setAppName("info_xb");

            tuBean.setInfoArea(infoArea);

            String s2 = mt.group();

            // 获取标题

            Matcher title = Pattern.compile("title.*?>").matcher(s2);

            while (title.find()) {

                String s = title.group().replaceAll("title=|>", "");

                

                tuBean.setTitle(unicodeToString(s));

            }

            // 获取网址

            // Matcher myurl = Pattern.compile("href=.*?>").matcher(mt.group());

            Matcher myurl = Pattern.compile("ID=.*?;").matcher(s2);

            while (myurl.find()) {

                String prefix = "http://XXXXXXXXX/tzggbmh.do?theAction=view&parameter.id=";

                tuBean.setUrl(prefix + myurl.group().replaceAll("ID=|;|\"", ""));

            }

            // 获取时间

            Matcher d = Pattern.compile("[0-9]{4}-[0-9]{2}-[0-9]{1,2}")

                    .matcher(s2);

            while (d.find()) {

                tuBean.setDeliveryDate(d.group());

            }

            boolean r = tuDao.Add(tuBean);

           

            if (r){

                log.info("crawl add " + tuBean.getAppName() + "_"

                        + tuBean.getInfoArea()+"_"+tuBean.getTitle());

                    

                Cache cNotice = CacheManager.getCacheInfo("index_notice");

                if(cNotice!=null){

                xb_noticeList = (List<TitleAndUrlBean>) cNotice.getValue();

                }

                

                xb_noticeList.add(tuBean);

                if(xb_noticeList.size()>5){

                    xb_noticeList.remove(0);

                }

                c.setValue(xb_noticeList);

                c.setTimeOut(-1);

                CacheManager.putCache("index_notice", c);                       

            }

        }

    }

本文使用的抽取方法代码,写于2012年,每次网站结构变化的时候需要重新配置规则。

不知道这么多年过来,是否有智能的方法获取网站这种半结构化数据。

如果有,请留言告知,谢谢!

原文地址:https://www.cnblogs.com/siweihz/p/12146167.html

时间: 2024-10-10 10:34:58

结构化网页内容抽取方法的相关文章

结构化与面向对象方法的比较

计算机软件在现代科学技术中有着十分重要地位和作用,已成为信息社会高技术竞争的关键领域之一.我在这篇文章中针对计算机软件两大开发方法:结构化方法与面向对象方法进行了梳理.对比,剖析了结构化方法和面向对象方法这两种软件开发方法具体的分析设计过程,讨论了各自在不同软件开发中的应用及局限性,并在最后提出了一点自己的看法. 1结构化方法 结构化方法(Structured Methodology)是编程领域的一种典型的系统开发方法. 它采用了系统科学的思想方法,从层次的角度,自顶向下地分析和设计系统. 结构

面向过程(结构化)分析方法与面向对象分析方法的区别

面向过程是从问题的总体目标开始,抽象底层的细节,先专心构造高层的结构,然后再一层一层地分解合细化. 面向对象则是运用对象.类.继承.封装.聚合.消息传递.多态性等概念来构造系统的方法. 面向过程着重于解决问题的从粗略到详尽的方法,二面向对象则关注点是问题本身.好比渔夫捕鱼,使用什么样的网子用什么样的方式撒网收网即是面向过程,而抓到鱼这件事则是面向对象.二者区别在于侧重点不同.

【第二周作业】面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

书上的一些概念这里不再复述,仅谈谈自己通过阅读教材.上课听讲后自己的一些理解: 面向过程分析方法注重自顶向下,逐层分析,把整个软件系统的功能逐布分解,各个击破.可以用生活中的一个例子来加以理解——去食堂吃饭.到达食堂(比如琴湖食堂)后,要遵从排队——打饭——阿姨打菜——拿筷子——找位子坐好——开吃,整个过程强调顺序性,比如不拿筷子就坐下是不行的,除非拿手抓.面向过程就是将软件系统所需要实现的功能按照以上类似的思路逐步细分,一步一步要做什么都要分析清楚. 面向对象分析方法则注重分析整个系统的逻辑结

面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

结构化分析方法的分析步骤:1 理解和分析当前的现实环境 已获得当前系统的具体模型 2 建立当前系统的逻辑模型 3 建立目标系统的逻辑模型 4 进一步完善目标系统的逻辑模型 面向对象分析方法:根据面向对象的过程模型 面向对象的需求分析从概念上分为问题分析和应用分析两个方面  问题分析:主要收集并确认用户需求 最后将信息链接最终建立关于对象的分析模型 应用分析:主要是动态描述系统中对象的合法状态序列 并用动态模型表达对象的动态行为 对象之间的消息传递和协同工作的动态信息 综上:结构化分析方法是先创建

结构化系统开发和面向对象开发方法

结构化系统开发方法: 系统分析员.软件工程师.程序员以及最终用户按照用户至上的原则,自顶向下分析与设计和自底向上逐步实施的建立计算机信息系统的一个过程,是组织.管理和控制信息系统开发过程的一种基本框架. 三部分:管理策略部分:强调系统开发的规划.进程安排.评估.监控和反馈.开发策略部分:任务分解结构:WBS优先级结构.开发经验.开发标准. 开发过程分为:系统规划阶段.系统分析阶段.系统设计阶段.系统实施阶段.系统运行与维护阶段结构化开发早期的程序开发,如C语言,都是用结构化开发方法. 面向对象开

结构化与面向对象化之应用比较

结构化与面向对象化之应用比较 引言 软件工程中构建工程经常使用两种方法:结构化方法和面对对象方法.结构化方法由艾兹格.迪杰斯特拉在1967年发表<goto陈述有害论>时提出.面向对象方法在80年代起逐步形成.两种方法各有优点,相伴存在至今.下面我们就来分析.探讨结构化程序设计方法与面向对象的方法的区别,以及在现实应用中如何在两种方法中做出选择. 一.结构化方法 1. 基本思想 结构化方法程序设计的基本思想是: a.自顶向下 b.采用模块化技术 c.分而治之 d.逐步求精地将信息系统按功能分解为

Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor

HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取. HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效. 如何使用? HtmlExtractor由2个子项目构成,html-extractor和html-extractor-web.

如何使用HtmlExtractor实现基于模板的网页结构化信息精准抽取?

首先,我们新建一个maven工程,在pom.xml中加入HtmlExtractor依赖,如下所示: <dependency>     <groupId>org.apdplat</groupId>     <artifactId>html-extractor</artifactId>     <version>1.1</version> </dependency> 接着,我们加入日志配置文件,在src/main/

【文智背后的奥秘】系列篇——结构化抽取平台

版权声明:本文由文智原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/91 来源:腾云阁 https://www.qcloud.com/community 随着大数据时代的到来,一个大规模生成.分享.处理以及应用数据的时代正在开启.如果能将互联网上异源异构的非结构化或半结构化数据转换为更易处理的结构化数据,可以极大的降低获取数据的门槛,为信息检索和数据挖掘提供基础,更好的挖掘数据中蕴藏的价值. 单纯考虑网页这种半结构化数据