爬虫代码实现二:抽取网站规则模板,优化解析代码(2)
2017-01-13 18:21
706 查看
仔细研究 爬虫代码实现二:抽取网站规则模板,优化解析代码(1)中YOUKUProcessService的代码,发现变量很多,而且在后期开发过程中,会有越来越多的变量需要定义,因此,这里我们使用配置文件对这些规则进行保存:
打开项目目录,发现没有resources文件夹,所以,找到项目路径,手动添加一个resources文件夹
再刷新项目,发现仍然没有出现resources文件夹
解决方式:
这样,点击OK后,项目路径会自动刷新:
再在这个resources文件夹下新建
youku.properties文件:
文件内容为:
allnumberRegex=(?<=\u603B\u64AD\u653E\u6570\uFF1A)[\\d,]+
commentnumberRegex=(?<=\u8BC4\u8BBA\uFF1A)[\\d,]+
supportnumberRegex=(?<=\u9876\uFF1A)[\\d,]+
parseAllNumber=//div[@class=\"p-base\"]/ul/li[11]
parseCommentNumber=//div[@class=\"p-base\"]/ul/li[12]
parseSupportNumber=//div[@class=\"p-base\"]/ul/li[13]
要特别注意,后面不要有空格,否则读取失败,获取不到对应的文本信息。
既然有了这个配置文件,因此,我们也需要写一个加载配置文件的工具类,这个工具类可以实现通过key找到value。
package com.dajiangtai.djt_spider.util;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* 读取配置文件属性工具类
* @author Administrator
*
*/
public class LoadPropertyUtil {
//读取优酷配置文件
public static String getYOUKY(String key){
String value = "";
Locale locale = Locale.getDefault();
try{
ResourceBundle localResource = ResourceBundle.getBundle("youku",locale);
value = localResource.getString(key);
}catch(Exception e){
value="";
e.printStackTrace();
}
return value;
}
public static void main(String[] args) {
System.out.println(getYOUKY("allnumberRegex"));
}
}
控制台输出:
(?<=总播放数:)[\d,]+
然后,将原来的String allnumber = HtmlUtil.getFieldByRegex(rootNode, parseAllNumber, allnumberRegex);改为
String allnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseAllNumber"), LoadPropertyUtil.getYOUKY("allnumberRegex"));
所以,最后,YOUKUProcessService代码为:
package com.dajiangtai.djt_spider.service.impl;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IProcessService;
import com.dajiangtai.djt_spider.util.HtmlUtil;
import com.dajiangtai.djt_spider.util.LoadPropertyUtil;
import com.dajiangtai.djt_spider.util.RegexUtil;
public class YOUKUProcessService implements IProcessService {
//这里解析得到的是 : 总播放数:16,931,628,832,因此采用正则表达式获取数字
// private String allnumberRegex = "(?<=总播放数:)[\\d,]+";
// private String commentnumberRegex = "(?<=评论:)[\\d,]+";
// private String supportnumberRegex = "(?<=顶:)[\\d,]+";
//
// private String parseAllNumber = "/body/div/div/div/div/div/ul/li[11]";
// private String parseCommentNumber = "//div[@class=\"p-base\"]/ul/li[12]";
// private String parseSupportNumber = "//div[@class=\"p-base\"]/ul/li[13]";
public void process(Page page) {
String content = page.getContent();
HtmlCleaner htmlCleaner = new HtmlCleaner();
//利用htmlCleaner对网页进行解析,得到根节点
TagNode rootNode = htmlCleaner.clean(content);
try {
// /html/body/div[4]/div/div[1]/div[2]/div[2]/ul/li[11]
//对XPath做相应的调整,使其有效,如果不该写,则使用debug模式,会发现evaluateXPath为[]
//总播放数
// String allnumber = HtmlUtil.getFieldByRegex(rootNode, parseAllNumber, allnumberRegex);
String allnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseAllNumber"), LoadPropertyUtil.getYOUKY("allnumberRegex"));
System.out.println("总播放数数量为:"+allnumber);
//总播放数
String commentnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseCommentNumber"), LoadPropertyUtil.getYOUKY("commentnumberRegex"));
System.out.println("总评论数量为:"+commentnumber);
//总播放数
String supportnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseSupportNumber"), LoadPropertyUtil.getYOUKY("supportnumberRegex"));
System.out.println("总评论数量为:"+supportnumber);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试,运行StartDSJCount的main方法,输出:
总播放数量为:17,010,382,449
总评论数量为:1,256,073
总赞数量为:13,830,002
到此为止,我们采用配置文件存储xpath以及正则表达式变量,方便后期维护,最后成功的解析了我们想要的数据。
打开项目目录,发现没有resources文件夹,所以,找到项目路径,手动添加一个resources文件夹
再刷新项目,发现仍然没有出现resources文件夹
解决方式:
这样,点击OK后,项目路径会自动刷新:
再在这个resources文件夹下新建
youku.properties文件:
文件内容为:
allnumberRegex=(?<=\u603B\u64AD\u653E\u6570\uFF1A)[\\d,]+
commentnumberRegex=(?<=\u8BC4\u8BBA\uFF1A)[\\d,]+
supportnumberRegex=(?<=\u9876\uFF1A)[\\d,]+
parseAllNumber=//div[@class=\"p-base\"]/ul/li[11]
parseCommentNumber=//div[@class=\"p-base\"]/ul/li[12]
parseSupportNumber=//div[@class=\"p-base\"]/ul/li[13]
要特别注意,后面不要有空格,否则读取失败,获取不到对应的文本信息。
既然有了这个配置文件,因此,我们也需要写一个加载配置文件的工具类,这个工具类可以实现通过key找到value。
package com.dajiangtai.djt_spider.util;
import java.util.Locale;
import java.util.ResourceBundle;
/**
* 读取配置文件属性工具类
* @author Administrator
*
*/
public class LoadPropertyUtil {
//读取优酷配置文件
public static String getYOUKY(String key){
String value = "";
Locale locale = Locale.getDefault();
try{
ResourceBundle localResource = ResourceBundle.getBundle("youku",locale);
value = localResource.getString(key);
}catch(Exception e){
value="";
e.printStackTrace();
}
return value;
}
public static void main(String[] args) {
System.out.println(getYOUKY("allnumberRegex"));
}
}
控制台输出:
(?<=总播放数:)[\d,]+
然后,将原来的String allnumber = HtmlUtil.getFieldByRegex(rootNode, parseAllNumber, allnumberRegex);改为
String allnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseAllNumber"), LoadPropertyUtil.getYOUKY("allnumberRegex"));
所以,最后,YOUKUProcessService代码为:
package com.dajiangtai.djt_spider.service.impl;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import com.dajiangtai.djt_spider.entity.Page;
import com.dajiangtai.djt_spider.service.IProcessService;
import com.dajiangtai.djt_spider.util.HtmlUtil;
import com.dajiangtai.djt_spider.util.LoadPropertyUtil;
import com.dajiangtai.djt_spider.util.RegexUtil;
public class YOUKUProcessService implements IProcessService {
//这里解析得到的是 : 总播放数:16,931,628,832,因此采用正则表达式获取数字
// private String allnumberRegex = "(?<=总播放数:)[\\d,]+";
// private String commentnumberRegex = "(?<=评论:)[\\d,]+";
// private String supportnumberRegex = "(?<=顶:)[\\d,]+";
//
// private String parseAllNumber = "/body/div/div/div/div/div/ul/li[11]";
// private String parseCommentNumber = "//div[@class=\"p-base\"]/ul/li[12]";
// private String parseSupportNumber = "//div[@class=\"p-base\"]/ul/li[13]";
public void process(Page page) {
String content = page.getContent();
HtmlCleaner htmlCleaner = new HtmlCleaner();
//利用htmlCleaner对网页进行解析,得到根节点
TagNode rootNode = htmlCleaner.clean(content);
try {
// /html/body/div[4]/div/div[1]/div[2]/div[2]/ul/li[11]
//对XPath做相应的调整,使其有效,如果不该写,则使用debug模式,会发现evaluateXPath为[]
//总播放数
// String allnumber = HtmlUtil.getFieldByRegex(rootNode, parseAllNumber, allnumberRegex);
String allnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseAllNumber"), LoadPropertyUtil.getYOUKY("allnumberRegex"));
System.out.println("总播放数数量为:"+allnumber);
//总播放数
String commentnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseCommentNumber"), LoadPropertyUtil.getYOUKY("commentnumberRegex"));
System.out.println("总评论数量为:"+commentnumber);
//总播放数
String supportnumber = HtmlUtil.getFieldByRegex(rootNode, LoadPropertyUtil.getYOUKY("parseSupportNumber"), LoadPropertyUtil.getYOUKY("supportnumberRegex"));
System.out.println("总评论数量为:"+supportnumber);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试,运行StartDSJCount的main方法,输出:
总播放数量为:17,010,382,449
总评论数量为:1,256,073
总赞数量为:13,830,002
到此为止,我们采用配置文件存储xpath以及正则表达式变量,方便后期维护,最后成功的解析了我们想要的数据。
相关文章推荐
- 爬虫代码实现二:抽取网站规则模板,优化解析代码(1)
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)补充知识点:htmlcleaner使用案例
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)补充知识点:怎样获取XPath
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)补充: Java正则表达式Matcher.group(int group)相关类解析
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(1)
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(3)补充知识点:XPath无效怎么办?
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(4)补充正则:java Pattern和Matcher详解
- 爬虫代码实现五:解析所有分页url并优化解析实现类
- 优酷电视剧爬虫代码实现一:下载解析视频网站页面(2)
- JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
- 爬虫代码实现三:打通爬虫项目的下载、解析、存储流程
- 引擎自然排名规则和网站优化技巧-最模板为例
- JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
- JS+CSS实现电子商务网站导航模板效果代码
- 《理财市场情绪监测系统》代码实现【2】之爬虫数据解析
- 使用css sprites来优化你的网站在Retina屏幕下显示实现原理与代码
- 配置实现-自创html生成模板搭配xml获取数据无需写代码实现静态网站
- JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)