您的位置:首页 > 运维架构 > 网站架构

爬虫代码实现二:抽取网站规则模板,优化解析代码(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以及正则表达式变量,方便后期维护,最后成功的解析了我们想要的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐