首页 > 编程语言 >使用Java调用百度搜索

使用Java调用百度搜索

时间:2023-03-20 20:02:18浏览次数:51  
标签:info 调用 Java LOG webpage summaryCssQuery div 百度 String


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

标签:info,调用,Java,LOG,webpage,summaryCssQuery,div,百度,String
From: https://blog.51cto.com/u_3871599/6138553

相关文章

  • 三种javascript数组搜索的效率对比
    [b][color=red][size=x-large]结论:内置方法是最快的.[/size][/color][/b]//构造一个数组vararr=[];for(vari=0;i<=1000000;i++){arr.push('abcdefghigk'+i);}varv=......
  • JavaMelody监控web服务器
    JavaMelody监控web服务器JavaMelody监控java项目摘要JavaMelody的是一款监控Java或JavaEE应用服务器在质量保证和生产环境。它不是一个工具来模拟......
  • JAVA -- try catch
    try{}catch(exception){}finally, nxtstatement  ||throw给用户操作,或提示执行顺序:try遇到exception时就停止了有匹配的exception就运行catch ......
  • Java常见面视题型:选择题、简答题、问答题、编码题
    Java常见面视题型:选择题、简答题、问答题、编码题简答题、问答题:1.JDK、JRE、JVM的区别:1JDK:JAVA开发工具包,是java语言的核心,包含JRE+开发运行等命令工具2)JRE:JAVA运......
  • java常用的工具类之Collectors.toMap
    java.util.stream.Collectors一.Collectors.toMap1.构造ListList<Student>list=newArrayList<>();for(inti=1;i<4;i++){list.add(newStudent(i+"","......
  • 我可以帮你理解Java方法的传递方式
    你好,这是Bing。我可以帮你理解Java方法的传递方式。......
  • Angular 使用window.requestAnimationFrame循环调用导致,异常ERROR TypeError: Cannot
    异常:   调用方法当使用requestAnimationFrame调用animate()时出现异常原因requestAnimationFrame调用时this是就不指当前对象了,this指向的就是requestAnimationF......
  • Java HashMap为什么线程不安全
    一、学习目标1、HashMap线程不安全原因:原因:JDK1.7中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁......
  • Java敏捷开发框架 高效搭建数据报表
    随着数字化转型在企业中不断深入推动,对企业的财务领域的转型也带来巨大的冲击。外部市场环境的快速变化,使企业经营者的决策时间从原来的几年和几个月缩短到几周甚至几天,组......
  • java常用的工具类之CollectionUtils
    org.apache.commons.collections4.CollectionUtils1.判断集合是否为空或者不为空//为空CollectionUtils.isEmpty(null):trueCollectionUtils.isEmpty(newArrayList(......