美文网首页@IT·互联网程序员
JavaWeb小项目之综合搜索工具(二):爬虫篇

JavaWeb小项目之综合搜索工具(二):爬虫篇

作者: 竹杖芒鞋轻胜码 | 来源:发表于2017-04-16 10:48 被阅读0次

    JavaWeb小项目之综合搜索工具(一):前端篇
    JavaWeb小项目之综合搜索工具(二):爬虫篇
    JavaWeb小项目之综合搜索工具(三):创建RESTful服务篇

    关于此项目的后台搜索核心部分就是爬虫了,因为之前没有接触过Java爬虫的编写,因此上网找了一些相关Demo来学习,下边这个博主写的demo很实在也够基础,起码扩展性是非常强的。

    http://blog.csdn.net/lmj623565791/article/details/23272657

    因为此demo只是设置了链接、关键字、和请求类型,但对于爬到的数据没有进行清洗。所以,根据需要,为自己想要的信息使用Jsoup,进行筛选。

    Jsoup-API文档:http://www.open-open.com/jsoup/

    边学边用也就大致清楚了,有用过Python的话,其实用法跟BeautifulSoup差不多。

    思路大概如下:

    1.找到目标的标签位置

    如何快速定位目标位置 ?
    Tips:
    在Chrome中,右键单击目标位置->审查元素->右键选中位置->Copy->Copy selector
    上图


    快速定位目标位置.png

    2.发起数据请求

    先分析使用搜索时,对哪个地址发起请求,请求类型是什么(GET / POST) ,使用Chrome的NetWork 工具进行分析(在搜索结果页面开着Network重新刷新页面便能记录下来),(已划重点)

    数据请求的信息.png

    这里可以看出,是向 http://www.baikemy.com/search/searchlist发送了POST请求,而且还带着两个参数,title & dataClass。
    那么规则类可以这样写

     Rule Baikemy_rule = new Rule(
                "http://www.baikemy.com/search/searchlist",  
                new String[] { "title","dataClass" }, 
                new String[] { "羟基","http://search.baikemy.com/home"},  
                "div.ssjgye_nav > div.ssjgye_left ", 
                Rule.SELECTION, 
                Rule.POST
    );  
    

    3.数据的清洗

    以Baikemy_rule发起请求,将获得Response的Document进行数据的筛选与输出。

        public static  void SelectData_Baikemy(Element item, List<LinkTypeData> datas){
    
            try {
                //疾病百科下的第一个a标签就是疾病的目标链接
                Element link = item.getElementsByTag("a").get(0);
                String link_href = "http://www.baikemy.com" + link.attr("href");
                String link_text = link.text();
    
                //疾病百科下的第二个p标签就是描述疾病详情的内容
                Element details = item.getElementsByTag("p").get(1);
                String details_text = details.text();
    
                LinkTypeData data = new LinkTypeData();
                data.setLinkHref(link_href);
                data.setLinkText(link_text);
                data.setSummary(details_text);
    
                //添加该元素到List集合中
                datas.add(data);
            }catch (RuntimeException e){
                e.printStackTrace();
                System.out.println("没有找到搜索结果");
            }
        }
    

    4.封装成一个对象输出

    此处把得到的数据以一个对象的形式输出,也方便后面把此对象封装成一个JSON结构。

                for (Element result : results){
    
                    Elements targets_jbkx=result.getElementsByClass("ssjgye_jbkx");
                    Elements targets_yyjs=result.getElementsByClass("ssjgye_yyjs");
                    Elements targets_lsjl=result.getElementsByClass("ssjgye_lsjl");
    
                    //疾病百科
                    for (Element target_jbkx : targets_jbkx){
                        SelectData_Baikemy(target_jbkx,baike_datas);
                    }
    
                    //医患问答
                    for (Element target_yyjs:targets_yyjs){
                        SelectData_Baikemy(target_yyjs,wenda_datas);
                    }
    
                    //科普
                    for (Element target_lsjl:targets_lsjl){
                        SelectData_Baikemy(target_lsjl,kepu_datas);
                    }
                }
                //三个List汇总为一个对象
                Summary_datas=new Link_Items(baike_datas,wenda_datas,kepu_datas);
    
    

    相关文章

      网友评论

        本文标题:JavaWeb小项目之综合搜索工具(二):爬虫篇

        本文链接:https://www.haomeiwen.com/subject/obwdattx.html