HTML Parser Jsoup - 网页抓取百度百科信息的例子
目标:获取百度百科基本信息、信息列表、人物图片(同名情况暂不考虑)。
重点:调用开源Jar包Jsoup对HTML解析。网页抓取、简单爬虫。
例子(部分类去掉,运行需改改code):
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class BaiduBaikeUtils
{private static Logger logger = LoggerFactory.getLogger(BaiduBaikeUtils.class);final static String BAIKE_SEARCH = "http://baike.baidu.com/search/word?word=";final static String DOUBLE_QUOTE = "\"";final static String NON_WORD_CHAR = "[^\\p{L}\\p{Nd}]+";/** 获取百科Url*/private static String getBaikeSearchUrl(String name){String url = null;url = BAIKE_SEARCH + name;return url;}private static Document getDocument(String url){Document doc = null;try {doc = Jsoup.connect(url).timeout(5000).get();} catch (IOException e) {logger.error("error to connect to Baidu baike" + e.getClass().getName() + ": " + e.getMessage());}return doc;}/** 获取具体信息列表*/private static WeiboPerson parseBaseInfoWrap(Document doc){final String BASE_INFO_WRAP = "baseInfoWrapDom";WeiboPerson weiboPerson = new WeiboPerson();Map<String, String> biTitleMap = setBiTitleMap();if (doc == null) return null;if (null != doc.getElementById(BASE_INFO_WRAP)) {Elements elements = doc.getElementById(BASE_INFO_WRAP).getElementsByClass("biItemInner");if (null != elements && elements.size() > 0) {for (Element element : elements) {setWeiboPerson(weiboPerson, element, biTitleMap);}}}return weiboPerson;}private static Map<String, String> setBiTitleMap(){final Map<String, String> biTitleMap = new HashMap<String, String>();biTitleMap.put("中文名", "Name");biTitleMap.put("本名", "Name");biTitleMap.put("外文名", "En_name");biTitleMap.put("性别", "Gender");biTitleMap.put("国籍", "Country");biTitleMap.put("民族", "Nation");biTitleMap.put("毕业院校", "Institution");biTitleMap.put("别名", "Alias");biTitleMap.put("身高", "Height");biTitleMap.put("体重", "Weight");biTitleMap.put("出生地", "BirthPlace");biTitleMap.put("出生日期", "Birthday");biTitleMap.put("出生时间", "Birthday");biTitleMap.put("逝世日期", "Passaway");biTitleMap.put("去世时间", "Passaway");biTitleMap.put("职业", "Career");biTitleMap.put("最高职务", "Career");biTitleMap.put("信仰", "Faith");biTitleMap.put("主要成就", "Achievement");biTitleMap.put("代表作品", "Opus");biTitleMap.put("所属政党", "Party");biTitleMap.put("血型", "BloodType");biTitleMap.put("妻子", "Spouse");biTitleMap.put("丈夫", "Spouse");biTitleMap.put("学位", "Degree");biTitleMap.put("籍贯", "NativePlace");biTitleMap.put("星座", "Constellation");return biTitleMap;}private static void setWeiboPerson(WeiboPerson weiboPerson, Element element, Map<String, String> biTitleMap){final String BI_TITLE = "biTitle";final String BI_CONTENT = "biContent";for (String biTitleMapKey : biTitleMap.keySet()) {if (null != element.getElementsByClass(BI_TITLE) && element.getElementsByClass(BI_TITLE).size() > 0) {String key = element.getElementsByClass(BI_TITLE).get(0).text().replaceAll(NON_WORD_CHAR, "");// 处理多行信息String textHtml = element.getElementsByClass(BI_CONTENT).get(0).toString().replaceAll("<br />",",");String text = Jsoup.parse(textHtml).text();// 设置具体信息if (biTitleMapKey.equals(key)) {try {Class clazz = weiboPerson.getClass(); Method method;method = clazz.getMethod("set" + biTitleMap.get(biTitleMapKey), String.class);method.invoke(weiboPerson, new Object[]{text});} catch (SecurityException e) {logger.error(e.getMessage(), e);} catch (NoSuchMethodException e) {logger.error(e.getMessage(), e);} catch (IllegalArgumentException e) {logger.error(e.getMessage(), e);} catch (IllegalAccessException e) {logger.error(e.getMessage(), e);} catch (InvocationTargetException e) {logger.error(e.getMessage(), e);}}}}}/** 获取基本信息*/private static String parseBaseInfo(Document doc){final String LINE_SEPARATOR = "\r\n";String baseInfoStr = "";if (doc == null) return null;Elements elements = null;// 概况if (doc.getElementsByClass("card-summary-content").size() != 0) {elements = doc.getElementsByClass("card-summary-content").get(0).getElementsByClass("para");if (null != elements && elements.size() > 0) {for (Element element : elements) {baseInfoStr += element.text() + LINE_SEPARATOR;}return baseInfoStr;}}// 基本信息if (null != doc.getElementById("lemmaContent-0")) {elements = doc.getElementById("lemmaContent-0").getAllElements();if (null != elements && elements.size() > 0) {for (Element element : elements) {if ("headline-1".equals(element.className())) {if (null != element.getElementsByTag("a")) {// 标题为基本信息if ("baseinfo".equals(element.getElementsByTag("a").attr("name"))) continue;}// 其他标题break;}if ("para".equals(element.className())) {baseInfoStr += element.text() + LINE_SEPARATOR;}}return baseInfoStr;}}return null;}/** 获取人物图片*/private static String parseRolePicUrl(Document doc, String name){Elements elements = null;String picSrc = null;// 侧边图片if (null != doc.getElementById("side")) {elements = doc.getElementById("side").getElementsByTag("img");picSrc = getPicSrc(elements, name);}// 其他位置图片if (!StringUtils.isEmptyString(picSrc)) return picSrc;elements = doc.getElementsByTag("img");picSrc = getPicSrc(elements, name);return picSrc;}private static String getPicSrc(Elements elements, String name){if (null != elements && elements.size() > 0) {for (Element element : elements) {if (name.equals(element.attr("alt"))) {if (!StringUtils.isEmptyString(element.attr("src"))) return element.attr("src");else return element.attr("data-src");}}}return null;}/** 获取当前title*/private static String getTitle(Document doc){Elements elements = doc.getElementsByClass("polysemeTitle");if (null != elements && elements.size() > 0) {return elements.get(0).text();}return null;}/** 获取百度百科信息*/public static WeiboPerson getBaiduBaikeInfo(String name){String url = getBaikeSearchUrl(name);Document doc = getDocument(url);WeiboPerson weiboPerson = new WeiboPerson();weiboPerson = parseBaseInfoWrap(doc);String baseInfoStr = parseBaseInfo(doc);String rolePicUrl = parseRolePicUrl(doc, name);
// String title = getTitle(doc);weiboPerson.setDescription(baseInfoStr);weiboPerson.setImageUrl(rolePicUrl);
// weiboPerson.setTitle(title);return weiboPerson;}/** 获取年份*/public static int getYear(Date date){Calendar calendar = Calendar.getInstance();calendar.setTime(date);return calendar.get(Calendar.YEAR);}/** 测试*/public static void main(String[] args) {String name = "李敏镐"; // 李敏镐,张超,李刚,张灵甫,曹操,孔明,obama,马云,迈克尔·乔丹,李明// 测试:连接
// String url = getBaikeSearchUrl(name);
// System.out.println("url:" + url);
// Document doc = getDocument(url);// 测试:具体信息列表
// WeiboPerson weiboPerson = parseBaseInfoWrap(doc);
// System.out.println("Name:" + weiboPerson.getName());// 测试:基本信息
// String baseInfoStr = parseBaseInfo(doc);
// System.out.println("baseInfoStr:" + baseInfoStr);// 测试:人物图片
// String rolePicUrl = parseRolePicUrl(doc, name);
// System.out.println("rolePicUrl:" + rolePicUrl);// getTitle(doc);// 总测试
// WeiboPerson weiboPerson = getBaiduBaikeInfo(name);
// System.out.println("Name:" + weiboPerson.getName());
// System.out.println("Country:" + weiboPerson.getCountry());
// System.out.println("Career:" + weiboPerson.getCareer());
// System.out.println("baseInfoStr:" + weiboPerson.getDescription());
// System.out.println("rolePicUrl:" + weiboPerson.getImageUrl());}
}
补充:
基于已有HTML源文件分析。
private static Document getDocument(String filePath){Document doc = null;try {File file = new File(filePath);doc = Jsoup.parse(file,"GBK","http://www.mk.org/");} catch (Exception e) {System.out.println("error to parse" + e.getClass().getName() + ": " + e.getMessage());}return doc;}
public static void main(String[] args) {String searchNo = "";String filePath = "";if (args.length >= 1)searchNo = args[0];if (args.length >= 2)filePath = args[1];elsefilePath = "src/bankResource/trans.html";if (searchNo == null || searchNo == "") {System.out.println("Search No is required.");} else {// get documentDocument doc = getDocument(filePath);
...
HTML Parser Jsoup - 网页抓取百度百科信息的例子相关推荐
- python类百度百科_Python抓取百度百科数据
抓取策略 确定目标:确定抓取哪个网站的哪些页面的哪部分数据.本实例抓取百度百科python词条页面以及python相关词条页面的标题和简介. 分析目标:分析要抓取的url的格式,限定抓取范围.分析要抓 ...
- 使用CURL构建爬虫,抓取百度百科内容
实现这个功能的步骤: 首先打开百度百科,在搜索框输入"php"关键词,得到搜索列表,一般都是10条: 然后使用火狐的Firebug分析百度列表的内容组成,主要是html标签,发现去 ...
- python爬取百度百科表格_第一个python爬虫(python3爬取百度百科1000个页面)
以下内容参考自:http://www.imooc.com/learn/563 一.爬虫简介 爬虫:一段自动抓取互联网信息的程序 爬虫可以从一个url出发,访问其所关联的所有的url.并从每个url指向 ...
- 玩转Java网页抓取
- 使用Java进行网页抓取 - 用于网页抓取的流行语言有Python.JavaScript和Node.js.PHP.Java.C#等.因为有很多选择,想要确定哪种语言最合适并不容易.每种语言都有其优 ...
- 代理服务器ip地址如何获得_详细教程:如何使用代理服务器进行网页抓取?
全文共2136字,预计学习时长7分钟 图源:Unsplash 万维网是数据的宝库.大数据的易得性.数据分析软件的迅猛发展以及日益廉价的计算能力进一步提高了数据驱动战略对竞争差异化的重要性. 据Forr ...
- 详细教程:如何使用代理服务器进行网页抓取?
全文共2136字,预计学习时长7分钟 图源:Unsplash 万维网是数据的宝库.大数据的易得性.数据分析软件的迅猛发展以及日益廉价的计算能力进一步提高了数据驱动战略对竞争差异化的重要性. 据Forr ...
- Python抓取百度贴吧网页信息以及代码下载
代码是抓取百度贴吧帖子的回复内容的.包括帖子标题.帖子回复数量,帖子页码,回复楼层.回复时间,也可以只查看楼主的回复信息.最后将获取到的帖子信息记录到记事本中. 具体结果看图: 上面的图片打印的是帖子 ...
- 实现织梦dedecms百度主动推送(实时)网页抓取
做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种. 如何选择链接提交方式 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保 ...
- 关于网页抓取信息 Jsoup 和 HttpUnit 的使用
之前看了看 洪祥的csdn app 制作,里面有从网页抓取数据的. 之前对这块操作没有接触过,所以网上差了一些资料,现在整理下相关的内容. 首先是关于Jsoup , Jsoup 是网页抓取的首选.但是 ...
最新文章
- day1-数据库基础
- linux命令查看cpu架构,Linux下如何查看CPU信息
- scrapy提取数据
- 大型web系统数据缓存设计-l转载
- Oracle优化05-执行计划
- java agent_GitHub - dingjs/javaagent: 基于javaagent开发的APM工具,收集方法的执行次数和执行时间,定时输出成json格式的日志。...
- energy计算机电脑,energy management
- 顽皮狗 多线程分享_谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!...
- spark restful_Spark入门:也可以用Java创建轻量级的RESTful应用程序
- 现在做Android开发有前途吗?社招面试心得
- 怎么去除表中的系统导出的字符_EXCEL非常有用的字符函数LEN、LENB,财务工作者的必备利器...
- 【数字逻辑设计】Logisim构建抢答环节电路
- kmeans聚类算法matlab代码,K-Means算法实现(Matlab)
- # 异运算_一年级数学:3000道20内纯进、退位口算题,每天100道日新又月异
- Windows server 2003 ××× 配置实例(Site to Site)
- 学习笔记--数据结构与算法基础(青岛大学-王卓)--第八章排序
- 简述 matlab 命令窗的主要作用,matlab复习
- MATLAB频数表-tabulate/hist
- 区块链技术在创造共享经济方面胜过互联网
- 利用C#2005为你的软件制作小精灵