`

使用Java调用百度搜索

    博客分类:
  • java
阅读更多

search托管于github

 

如何利用Java来调用百度搜索,更多细节请到github上查看search

 

自己没搜索引擎,又想要大规模的数据源,怎么办?可以对百度搜索善加利用,以小搏大,站在巨人的肩膀上。有很多的应用场景可以很巧妙地借助百度搜索来实现,比如网站的新闻采集,比如技术、品牌的新闻跟踪,比如知识库的收集,比如人机问答系统等,我之前做的一个准确率达百分之九十几的人机问答系统的数据源,其中一部分就是充分利用了百度搜索。我们可以很容易地扩展到其他的搜索引擎,使用JSoup+CSSPath技术,轻松获取页面的自定义的内容。

 

package org.apdplat.search;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class JSoupBaiduSearcher extends AbstractBaiduSearcher{
    private static final Logger LOG = LoggerFactory.getLogger(JSoupBaiduSearcher.class);

    @Override
    public SearchResult search(String keyword) {
        return search(keyword, 1);
    }
    @Override
    public SearchResult search(String keyword, int page) {
        int pageSize = 10;
        //百度搜索结果每页大小为10,pn参数代表的不是页数,而是返回结果的开始数
        //如获取第一页则pn=0,第二页则pn=10,第三页则pn=20,以此类推,抽象出模式:(page-1)*pageSize
        String url = "http://www.baidu.com/s?pn="+(page-1)*pageSize+"&wd="+keyword;
        
        SearchResult searchResult = new SearchResult();
        searchResult.setPage(page);
        List<Webpage> webpages = new ArrayList<>();
        try {
            Document document = Jsoup.connect(url).get();
            
            //获取搜索结果数目
            int total = getBaiduSearchResultCount(document);
            searchResult.setTotal(total);
            int len = 10;
            if (total < 1) {
                return null;
            }
            //如果搜索到的结果不足一页
            if (total < 10) {
                len = total;
            }
            for (int i = 0; i < len; i++) {
                String titleCssQuery = "html body div div div div#content_left div#" + (i + 1 + (page-1)*pageSize) + ".result.c-container h3.t a";
                String summaryCssQuery = "html body div div div div#content_left div#" + (i + 1 + (page-1)*pageSize) + ".result.c-container div.c-abstract";
                LOG.debug("titleCssQuery:" + titleCssQuery);
                LOG.debug("summaryCssQuery:" + summaryCssQuery);
                Element titleElement = document.select(titleCssQuery).first();
                String href = "";
                String titleText = "";
                if(titleElement != null){
                    titleText = titleElement.text();
                    href = titleElement.attr("href");
                }else{
                    //处理百度百科
                    titleCssQuery = "html body div#out div#in div#wrapper div#container div#content_left div#1.result-op h3.t a";
                    summaryCssQuery = "html body div#out div#in div#wrapper div#container div#content_left div#1.result-op div p";
                    LOG.debug("处理百度百科 titleCssQuery:" + titleCssQuery);
                    LOG.debug("处理百度百科 summaryCssQuery:" + summaryCssQuery);
                    titleElement = document.select(titleCssQuery).first();
                    if(titleElement != null){
                        titleText = titleElement.text();
                        href = titleElement.attr("href");
                    }
                }
                LOG.debug(titleText);
                Element summaryElement = document.select(summaryCssQuery).first();
                //处理百度知道
                if(summaryElement == null){
                    summaryCssQuery = summaryCssQuery.replace("div.c-abstract","font");
                    LOG.debug("处理百度知道 summaryCssQuery:" + summaryCssQuery);
                    summaryElement = document.select(summaryCssQuery).first();
                }
                String summaryText = "";
                if(summaryElement != null){
                    summaryText = summaryElement.text(); 
                }
                LOG.debug(summaryText);                
                
                if (titleText != null && !"".equals(titleText.trim()) && summaryText != null && !"".equals(summaryText.trim())) {
                    Webpage webpage = new Webpage();
                    webpage.setTitle(titleText);
                    webpage.setUrl(href);
                    webpage.setSummary(summaryText);
                    if (href != null) {
                        String content = Tools.getHTMLContent(href);
                        webpage.setContent(content);
                    } else {
                        LOG.info("页面正确提取失败");
                    }
                    webpages.add(webpage);
                } else {
                    LOG.error("获取搜索结果列表项出错:" + titleText + " - " + summaryText);
                }
            }
            
            
        } catch (IOException ex) {
            LOG.error("搜索出错",ex);
        }
        searchResult.setWebpages(webpages);;
        return searchResult;
    }
    /**
     * 获取百度搜索结果数
     * 获取如下文本并解析数字:
     * 百度为您找到相关结果约13,200个
     * @param document 文档
     * @return 结果数
     */
    private int getBaiduSearchResultCount(Document document){
        String cssQuery = "html body div div div div.nums";
        LOG.debug("total cssQuery: " + cssQuery);
        Element totalElement = document.select(cssQuery).first();
        String totalText = totalElement.text(); 
        LOG.info("搜索结果文本:" + totalText);
        
        String regEx="[^0-9]";   
        Pattern pattern = Pattern.compile(regEx);      
        Matcher matcher = pattern.matcher(totalText);
        totalText = matcher.replaceAll("");
        int total = Integer.parseInt(totalText);
        LOG.info("搜索结果数:" + total);
        return total;
    }

    public static void main(String[] args) {        
        Searcher searcher = new JSoupBaiduSearcher();
        SearchResult searchResult = searcher.search("杨尚川",1);
        List<Webpage> webpages = searchResult.getWebpages();
        if (webpages != null) {
            int i = 1;
            LOG.info("搜索结果 当前第 " + searchResult.getPage() + " 页,页面大小为:" + searchResult.getPageSize() + " 共有结果数:" + searchResult.getTotal());
            for (Webpage webpage : webpages) {
                LOG.info("搜索结果 " + (i++) + " :");
                LOG.info("标题:" + webpage.getTitle());
                LOG.info("URL:" + webpage.getUrl());
                LOG.info("摘要:" + webpage.getSummary());
                LOG.info("正文:" + webpage.getContent());
                LOG.info("");
            }
        } else {
            LOG.error("没有搜索到结果");
        }
    }
}

 

 

 

 

 

 

 

7
1
分享到:
评论
10 楼 yangshangchuan 2015-04-29  
zbsxlsf 写道
好像只能最多只能去一页8条记录啊

有一些特殊的,比如什么百度文库、百度百科、人人网人名搜索结果这类的,这些都需要特殊处理
9 楼 zbsxlsf 2015-04-28  
好像只能最多只能去一页8条记录啊
8 楼 cf2huihui 2014-08-25  
yangshangchuan 写道
cf2huihui 写道
你好,我用你的titleCssQuery和summaryCssQuery内容解析不出来数据,会报空指针异常,我用自己写的
 String unqiueTitleCssQuery = "div.c-container > .t";
可以解析到数据,可是只能解析标题,其他内容无法在循环块内一起取出来,导致webpage这个类只能有title值,其他都没有。求指教方法,谢谢


百度的页面结构变了,你看我这个项目的提取方法吧:https://github.com/ysc/rank/blob/master/src/main/java/org/seo/rank/impl/BaiduRanker.java

好的,我把项目下载下来研究下,谢谢分享
7 楼 cf2huihui 2014-08-25  
yangshangchuan 写道
cf2huihui 写道
经过我的努力,终于获取到数据了,只需要将每个列表获取出来,然后分析每个列表内的html代码,获取标题和链接就可以了。很高兴,同时,谢谢你的源码


不客气,我还有个SEO优化的工具,用于查询搜索引擎的收录排名,其中就有获取百度搜索结果的代码,你看看,是最近几天搞的:https://github.com/ysc/rank

好的,谢谢,我这就去学习下
6 楼 yangshangchuan 2014-08-22  
cf2huihui 写道
你好,我用你的titleCssQuery和summaryCssQuery内容解析不出来数据,会报空指针异常,我用自己写的
 String unqiueTitleCssQuery = "div.c-container > .t";
可以解析到数据,可是只能解析标题,其他内容无法在循环块内一起取出来,导致webpage这个类只能有title值,其他都没有。求指教方法,谢谢


百度的页面结构变了,你看我这个项目的提取方法吧:https://github.com/ysc/rank/blob/master/src/main/java/org/seo/rank/impl/BaiduRanker.java
5 楼 yangshangchuan 2014-08-22  
cf2huihui 写道
经过我的努力,终于获取到数据了,只需要将每个列表获取出来,然后分析每个列表内的html代码,获取标题和链接就可以了。很高兴,同时,谢谢你的源码


不客气,我还有个SEO优化的工具,用于查询搜索引擎的收录排名,其中就有获取百度搜索结果的代码,你看看,是最近几天搞的:https://github.com/ysc/rank
4 楼 cf2huihui 2014-08-20  
经过我的努力,终于获取到数据了,只需要将每个列表获取出来,然后分析每个列表内的html代码,获取标题和链接就可以了。很高兴,同时,谢谢你的源码
3 楼 cf2huihui 2014-08-18  
你好,我用你的titleCssQuery和summaryCssQuery内容解析不出来数据,会报空指针异常,我用自己写的
 String unqiueTitleCssQuery = "div.c-container > .t";
可以解析到数据,可是只能解析标题,其他内容无法在循环块内一起取出来,导致webpage这个类只能有title值,其他都没有。求指教方法,谢谢
2 楼 yangshangchuan 2014-05-31  
东海龙宫 写道
请问下你用的那些jar包啊,程序下载后jar包没有一直运行不了呢,感谢 1124008750@qq.com


看完整的项目:https://github.com/ysc/search-demo
1 楼 东海龙宫 2014-05-27  
请问下你用的那些jar包啊,程序下载后jar包没有一直运行不了呢,感谢 1124008750@qq.com

相关推荐

    百度搜索接口java后台

    在IT行业中,与“百度搜索接口java后台”相关的知识点涵盖了搜索引擎接口的使用、Java编程语言以及后台服务开发。本文将详细解析这些关键概念,并提供如何使用Java后台来对接百度搜索接口的方法。 首先,我们需要...

    利用java实现从百度网站上获取搜索数据

    3. **百度搜索API**:虽然没有直接提及,但获取百度搜索数据可能需要使用百度的公开API。例如,百度开放搜索API或者百度统计API,但请注意,这些服务可能需要申请API密钥,并且有使用限制和费用。 4. **SO-PMI算法*...

    JAVA___jQuery+AJAX_仿百度搜索功能

    在这个项目中,用户输入关键词时,将通过AJAX异步请求发送到服务器,服务器端使用Java进行处理,然后返回相关的搜索结果,这一切都在不刷新页面的情况下完成,与百度搜索类似。 【描述解析】 "JAVA___jQuery+AJAX_...

    java se平台的百度地图定位与搜索

    这些代码可以帮助我们理解如何在Java SE环境下有效地使用百度地图API。 在实际应用中,定位功能可能涉及权限管理,如请求用户的地理位置访问许可。搜索功能则可能包括地点、路线等多种类型,可以通过关键词搜索,也...

    java百度搜索(jquery ajax java)

    在这个"java百度搜索(jquery ajax java)"的项目中,我们可以探讨这些技术如何协同工作。 首先,jQuery是一个流行的JavaScript库,它简化了DOM操作、事件处理、动画以及Ajax交互等任务。jQuery的使用可以极大地提高...

    java使用HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url

    本人原创测试了百度,搜狗,360搜索都可以获取重定向后的真实地址,直接运行就可以,也可以根据自己项目具体修改功能。java使用HttpURLConnection获取百度搜狗360搜索链接重定向真实目标链接地址url。

    仿百度搜索功能附带数据库 java+jsp

    在IT领域,构建一个搜索引擎是复杂且技术性强的...总的来说,"仿百度搜索功能附带数据库 java+jsp"项目是一个结合了前端交互、后端处理和数据库操作的综合实践,可以帮助开发者提升对Java Web应用开发的理解和技能。

    【Java毕业设计】代毕业设计,java调用百度地图API实现西安旅游景点搜索、路线规划导航.zip

    本项目是一个基于Java的毕业设计,其主要目的是利用百度地图API来实现西安旅游景点的搜索功能以及路线规划导航。在实际应用中,这样的系统能够帮助用户便捷地查找西安的旅游景点,并提供从一个地点到另一个地点的...

    java爬虫爬取百度图片

    Java爬虫爬取百度图片是一项常见的网络数据抓取任务...总之,Java爬虫爬取百度图片是一个涉及网络请求、HTML解析、图片下载等多个技术环节的综合实践,需要理解并掌握相关库的使用,以及良好的异常处理和效率优化策略。

    Java_百度地图_搜索附近美食

    在Java编程领域,结合百度地图API来搜索附近的美食是一项实用且常见的任务,尤其适用于开发本地生活服务类的应用程序。这个项目或教程可能涉及到以下几个关键知识点: 1. **百度地图API**:百度地图提供了丰富的Web...

    JAVA搜索引擎之模仿百度蜘蛛

    百度蜘蛛是百度搜索引擎的重要组成部分,它的主要任务是遍历互联网上的网页,抓取网页内容并建立索引。这个过程通常分为以下几个步骤: 1. **种子URL获取**:搜索引擎首先需要一个或多个起始URL(种子URL),这些...

    仿百度搜索-java源码

    【标题】"仿百度搜索-java源码"是一个项目,它实现了与百度搜索类似的用户体验,特别是输入关键词时的自动匹配功能。这个项目的核心是利用Java语言编写后端逻辑,并结合前端技术如Bootstrap、jQuery以及autocomplete...

    Java EE调用百度API,进行人脸识别登陆

    在本项目中,我们将使用百度提供的API来实现这一功能。 **百度API**:百度提供了多种开放API,其中包括人脸识别服务。这些API通常需要开发者注册并获取API密钥,然后在代码中调用以访问其服务。 **人脸注册**:这...

    dwr应用(模仿百度搜索引擎)java版

    在本项目中,开发人员利用DWR框架模拟了百度搜索引擎的工作流程,用户可以在前端输入关键词,然后通过DWR调用后台Java服务进行搜索,返回结果并在页面上动态展示。这种方式极大地提高了用户体验,使得搜索操作更加...

    java 百度搜索补全特效

    【标题】:“java 百度搜索补全特效” 在Java编程领域中,实现类似百度搜索的自动补全功能是一项常见的需求,特别是在构建Web应用程序时。这个小例子旨在演示如何运用Java技术栈来创建一个功能丰富的搜索补全效果,...

    Java抓取百度图片

    **百度图片** 是百度搜索引擎的一部分,用户可以通过它搜索和浏览大量的图片资源。为了抓取这些图片,我们需要理解网络爬虫的基本原理。 **网络爬虫** 是一种自动浏览互联网的程序,它可以遍历网页并收集信息。在...

    java 实现百度搜索框自动补全

    Java 实现百度搜索框自动补全是一个常见的前端与后端交互功能,主要用于提高用户体验,它在用户输入关键字时提供相关的建议列表。这个源码演示了如何利用Ajax技术结合MySQL数据库来实现这一功能。 首先,我们要理解...

    使用jsonp调用百度的js实现搜索关键字的智能提

    在这个项目中,我们将讨论如何使用JSONP调用百度的API来实现搜索关键字的智能提示,就像百度搜索框那样。 标题中的“使用jsonp调用百度的js实现搜索关键字的智能提示”指的是通过JSONP技术与百度的API接口进行交互...

    java 元搜索 调用百度 doc 文件示例

    利用元搜索下在百度 doc 文件。示例 利用httpclient 模拟像百度发请求

    java桌面应用程序(读取百度热搜关键词)

    标题中的“java桌面应用程序(读取百度热搜关键词)”表明这是一个使用Java编程语言开发的桌面应用,其主要功能是获取并展示百度新闻的热搜关键词。这个程序可能利用网络请求技术来抓取百度新闻的实时热点数据,特别...

Global site tag (gtag.js) - Google Analytics