- 浏览: 168968 次
- 性别:
- 来自: 武汉
文章分类
最新评论
package com.yihaodian.pricehisotry; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.tree.TreeNode; import org.apache.log4j.Logger; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.HasAttributeFilter; import org.htmlparser.tags.LinkTag; import org.htmlparser.util.NodeList; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.yihaodian.pis.dto.SiteCategoryDto; import com.yihaodian.pis.timer.DailyIterator; import com.yihaodian.pis.timer.Scheduler; import com.yihaodian.pis.timer.SchedulerTask; import com.yihaodian.pricehisotry.dao.SiteCategoryDao; public class ExecuteTimerTask { private static final Logger logger = Logger.getRootLogger(); private final Scheduler scheduler = new Scheduler(); private final SimpleDateFormat dateFormat = new SimpleDateFormat( "dd MMM yyyy HH:mm:ss.SSS"); private int dayOfMonth = 0; private int hourOfDay = 0; private int minute = 0; private int second = 0; private static ApplicationContext context = null; static{ context = new ClassPathXmlApplicationContext( new String[] { "/spring-bean.xml", "/spring-dao.xml", }); logger.info("------> init program ....."); } public ExecuteTimerTask(int dayOfWeek,int hourOfDay, int minute, int second) { this.dayOfMonth = dayOfWeek; this.hourOfDay = hourOfDay; this.minute = minute; this.second = second; } public void start() { scheduler.schedule(new SchedulerTask() { public void run() { // Start a new thread to sound an alarm... try { excuteTimerTask(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void excuteTimerTask() { logger.info("Wake up! " + "It"s " + dateFormat.format(new Date())); //每天把当前的商品价格加入到库中 try { TreeNode[] treeNodes; String url1="http://www.suning.cn/"; String anResult=""; String finalReString=""; String d =""; try { URL b=new URL(url1); BufferedReader in = new BufferedReader(new InputStreamReader(b.openStream())); String rString =in.readLine(); while (rString!=null) { anResult+=rString; rString=in.readLine(); } anResult=anResult.trim(); } catch (Exception e) { // TODO: handle exception } Parser parser = Parser.createParser(anResult, "utf-8"); NodeFilter filter = new HasAttributeFilter("id", "SNmenuNav");; NodeList children = parser.extractAllNodesThatMatch(filter); NodeList dlList = children.elementAt(0).getChildren(); int count =0; for (int i = 0; i < 3; i++) { Node node = dlList.elementAt(i); if (node.getText().equals("dl")) { getallLink(node,i);//传递一级目录的 } } System.out.println("test成功。。。。。。。--------"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); logger.info(e.getMessage()); } } }, new DailyIterator(dayOfMonth,hourOfDay, minute, second)); } int nextid=0;//标志二级目录ID int firstid=0;//标志一级目录ID public TreeNode getallLink(Node d,int n){ SiteCategoryDao siteCategoryDao = (SiteCategoryDao)(context.getBean("siteCategoryDao")); if (d.getText().indexOf("dl")>=0) { //System.out.println("1"); }else if (d.getText().indexOf("dt")>=0) { getallLink(d.getChildren().elementAt(0),100); return null; }else if (d.getText().indexOf("dd")>=0) { //System.out.println("12"); }else if (d.getText().indexOf("ul class=\"sideleft\"")>=0) { //System.out.println("121"); }else if (d.getText().indexOf("li")>=0) { if(d.getChildren().size()>1){ SiteCategoryDto siteCategoryDto =new SiteCategoryDto(); siteCategoryDto.setCategoryName(((LinkTag) d).getLinkText()); siteCategoryDto.setSiteId(7); siteCategoryDto.setParentCategoryId(firstid); siteCategoryDto.setCategoryLevel(2); siteCategoryDao.addSiteCategory(siteCategoryDto); nextid = siteCategoryDao.getMaxId(); } //System.out.println("二级目录:"+d.getChildren().elementAt(2).getText());} //System.out.println("1211"); } // else if (d.getText().equals("b")) { // //System.out.println("二级目录:"+d.toHtml()); // return null; // } else if (d.getText().equals("div")) { //System.out.println("12111"); } else if (d.getText().indexOf("a href=")>=0) { SiteCategoryDto siteCategoryDto =new SiteCategoryDto(); siteCategoryDto.setCategoryName(((LinkTag) d).getLinkText()); siteCategoryDto.setSiteId(7); if (n==100) { siteCategoryDto.setParentCategoryId(0); siteCategoryDto.setCategoryLevel(1); siteCategoryDto.setCategoryUrl(((LinkTag) d).getLink()); siteCategoryDao.addSiteCategory(siteCategoryDto); firstid = siteCategoryDao.getMaxId(); //System.out.println("121111"); //System.out.println("链接是:"+((LinkTag) d).getLink()+"一级级目录:"+((LinkTag) d).getLinkText()); } else { //System.out.println("121111"); siteCategoryDto.setParentCategoryId(nextid); siteCategoryDto.setCategoryLevel(3); siteCategoryDto.setCategoryUrl(((LinkTag) d).getLink()); siteCategoryDao.addSiteCategory(siteCategoryDto); //System.out.println("链接是:"+((LinkTag) d).getLink()+"三级目录:"+((LinkTag) d).getLinkText()); } }else{ //System.out.println(d.getText()); return null; } NodeList dlist = d.getChildren(); for (int i = 0; i < dlist.size(); i++) { getallLink(dlist.elementAt(i),n); } return null; } public static void main(String[] args) { logger.info("daily price backup task start !*********** "); //每天凌晨一点半触发 new ExecuteTimerTask(Calendar.HOUR_OF_DAY,1, 30,0); ExecuteTimerTask timerTask = new ExecuteTimerTask(Calendar.HOUR_OF_DAY,1, 30,0); timerTask.start(); } }
在这里是以苏宁的易购网为例子。
顺便贴上一个可直接运行的代码,该代码是本人测试用的
package com.yihaodian.pis.crawler; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.swing.tree.TreeNode; import org.w3c.dom.Element; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.HasAttributeFilter; import org.htmlparser.nodes.TagNode; import org.htmlparser.nodes.TextNode; import org.htmlparser.tags.*; import org.htmlparser.util.SimpleNodeIterator; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.htmlparser.util.NodeList; import com.yihaodian.pis.dto.BestSellerDto; public class SuningParserTest { public static void main(String[] args) throws Exception{ TreeNode[] treeNodes; String url1="http://www.suning.cn/"; String anResult=""; String finalReString=""; String d =""; try { URL b=new URL(url1); BufferedReader in = new BufferedReader(new InputStreamReader(b.openStream())); String rString =in.readLine(); while (rString!=null) { anResult+=rString; rString=in.readLine(); } anResult=anResult.trim(); } catch (Exception e) { // TODO: handle exception } Parser parser = Parser.createParser(anResult, "utf-8"); NodeFilter filter = new HasAttributeFilter("id", "SNmenuNav");; NodeList children = parser.extractAllNodesThatMatch(filter); NodeList dlList = children.elementAt(0).getChildren(); int count =0; for (int i = 0; i < 3; i++) { Node node = dlList.elementAt(i); if (node.getText().equals("dl")) { getallLink(node,i+3); } } //System.out.println(count); // // if (children == null || children.size() == 0) { // System.out.println("没有值"); // }else{ // System.out.println("有值"); // } // for (int i = 0; i < children.size(); i++) { // ScriptTag child = (ScriptTag) children.elementAt(i); // if(child.findPositionOf("¤tPage=")==0){ // String putInCart1 = null; // String putInCart2 = null; // //Pattern pattern2 = Pattern.compile("(?<=currentPage[)] \\{)([^\\}]*?)(?=\\})"); // Pattern pattern2 = // Pattern.compile("(?<=var[ \\s]{0,100}(jumpUrl)[\\s]{0,100}[=][\\s]{0,100}[\"])(.*?)(?=\"\\s{0,100}[+])"); // Pattern pattern1 = Pattern.compile("(?<=var[ \\s]{0,100}dfy\\s{0,100}=\\s{0,100}[\"])(.*?)(?=[\"][\\s]{0,100})"); // Matcher matcher1 = pattern1.matcher(child.getChildrenHTML()); // if (matcher1.find()) { // putInCart1 = matcher1.group(0).trim(); // } // Matcher matcher2 = pattern2.matcher(child.getChildrenHTML()); // if (matcher2.find()) { // putInCart2 = matcher2.group(0).trim(); // } // //System.out.println(putInCart2.substring(15, putInCart2.indexOf(" + dfy")-1)); // finalReString=putInCart2+putInCart1; // System.out.println(finalReString); // } // } // parser = Parser.createParser(anResult, "utf-8"); // //得到当前页currentPage // String currentPage=""; // filter = new HasAttributeFilter("class", "on"); // children = parser.extractAllNodesThatMatch(filter); // //LinkTag dLinkTag = (LinkTag) children.elementAt(0); // //System.out.println(dLinkTag.getLinkText()); // for (int i = 0; i < children.size(); i++) { // Node node =children.elementAt(i); // if (node.getChildren().size()<2) { // LinkTag dLinkTag = (LinkTag)node; // if(dLinkTag.getLink().equals("#")) // currentPage= dLinkTag.getLinkText(); // } // } // finalReString+="&sortType=0¤tPage=" + (Integer.parseInt(currentPage)+1); // System.out.println(finalReString); } public static Object findTagByName(CompositeTag tag,String tagName){ Object obj = null; SimpleNodeIterator simpleNodeIterator = tag.children(); while (simpleNodeIterator.hasMoreNodes()) { Node node = (Node) simpleNodeIterator.nextNode(); if (node.getClass().getName().trim().contains(tagName)) { obj = node; break; } } return obj; } public static Object findTagByClassName(CompositeTag tag,String className){ Object obj = null; SimpleNodeIterator simpleNodeIterator = tag.children(); while (simpleNodeIterator.hasMoreNodes()) { Node node = (Node) (simpleNodeIterator.nextNode()); if (!node.getClass().getName().contains("TextNode")) { if (((TagNode)node).getAttribute("class").equals(className) ){ obj = node; break; } } } return obj; } public static TreeNode getallLink(Node d,int n){ if (d.getText().indexOf("dl")>=0) { //System.out.println("1"); }else if (d.getText().indexOf("dt")>=0) { getallLink(d.getChildren().elementAt(0),12); return null; }else if (d.getText().indexOf("dd")>=0) { //System.out.println("12"); }else if (d.getText().indexOf("ul class=\"sideleft\"")>=0) { //System.out.println("121"); }else if (d.getText().indexOf("li")>=0) { if(d.getChildren().size()>1) System.out.println("二级目录:"+d.getChildren().elementAt(2).getText()); //System.out.println("1211"); } // else if (d.getText().equals("b")) { // //System.out.println("二级目录:"+d.toHtml()); // return null; // } else if (d.getText().equals("div")) { //System.out.println("12111"); } else if (d.getText().indexOf("a href=")>=0) { if (n==12) { //System.out.println("121111"); System.out.println("链接是:"+((LinkTag) d).getLink()+"一级级目录:"+((LinkTag) d).getLinkText()); } else { //System.out.println("121111"); System.out.println("链接是:"+((LinkTag) d).getLink()+"三级目录:"+((LinkTag) d).getLinkText()); } }else{ //System.out.println(d.getText()); return null; } NodeList dlist = d.getChildren(); for (int i = 0; i < dlist.size(); i++) { getallLink(dlist.elementAt(i),n); } return null; } }
有不懂的联系526151410
相关推荐
1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....
### 读取Excel文件将数据存入Map集合 ...总之,通过这个方法可以有效地读取Excel文件并将数据存储到Java中的`Map`集合,便于后续的数据处理和分析。这对于企业级应用来说非常实用,能够极大地提高工作效率。
在MySQL集群到Oracle数据库的数据同步过程中,首先需要配置GoldenGate来抽取MySQL集群的日志事件,这可能涉及到解析MySQL的二进制日志或InnoDB存储引擎的Change Data Capture (CDC)。接着,GoldenGate将转换这些事件...
MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于保证数据的一致性和完整性起着至关重要的作用。本文将深入解析MySQL中的锁机制,帮助读者理解其工作原理,为面试准备或日常数据库管理提供有力支持...
在汇聚整合前端视频和各类数据的基础上, 后端联网共享、存储、以及视频 解析系统、视图综合应用系统主要部署在视频专网和公安信息网, 并进一步整合 涉及到公共安全的视频资源(包括社会面视频资源),同时考虑视频...
在汇聚整合前端视频和各类数据的基础上, 后端联网共享、存储、以及视频 解析系统、视图综合应用系统主要部署在视频专网和公安信息网, 并进一步整合 涉及到公共安全的视频资源(包括社会面视频资源),同时考虑视频...
- QNetworkReply处理响应数据,可以读取下载的文件或解析XML、JSON等格式的数据。 6. 数据库编程: - QSqlDatabase模块允许与各种数据库系统交互,如SQLite、MySQL、PostgreSQL等。 - 使用QSqlQuery和...
它们的位置、形状和属性需要被有效地存储和管理,可能采用数据库系统来存储大量的地理信息。 4. 公交车线路和站点:这部分功能可能涉及公共交通数据的处理,包括公交线路的规划、站点的分布和时刻表的管理。这需要...
TiFlash作为列式存储引擎,专为分析处理设计,能够与行存并存,提供高速的更新和读取能力,并且支持MPP(Massive Parallel Processing)计算,显著提升了BI查询的性能。 TiDB的HTAP架构允许行存和列存资源分离,...
计算机基础问答涵盖了从计算机的基本概念到具体操作的广泛知识,以下是对这些知识点的详细解析: 1. 计算机的特点:计算机拥有高速运算能力、高精度计算、强可靠性、强大的存储功能以及逻辑判断能力。这使得计算机...
在Java中,可以使用`Scanner`或`BufferedReader`来读取CSV文件,将数据解析并存入合适的数据结构。如果是二进制格式,可能需要专门的库如`MaxMind GeoIP2`来解析。在解析过程中,需要注意处理异常,确保数据的完整性...
4. **版本控制**:新旧版本的协议可以并存,且老版本的代码仍能读取新版本的数据。 在实际应用中,Protobuf 常用于构建分布式系统、网络通信、数据库存储等领域。例如,Google 的许多服务就使用了 Protobuf 进行...
计算机二级等级考试主要涵盖计算机基础知识、操作...以上是针对计算机二级考试试题中涉及知识点的详细解析,涵盖了编程、数据库、操作系统等多个方面,对于备考计算机二级考试的考生来说,理解这些知识点是非常重要的。
1. 类加载过程:Java中的类加载分为三个阶段——加载、验证、准备、解析和初始化。ClassLoader主要参与的是加载阶段,它从磁盘、网络或其他数据源读取字节码文件,并将其转换为Class对象。 2. 类加载器层次结构:...
桌面版主要服务于日常办公、游戏和多媒体处理等场景,而服务器版则针对高性能计算、数据库服务和大规模并发访问等高负载环境。 2. **64位优化**:64位版本充分利用现代计算机的大容量内存资源,支持更大内存分配,...
例如,如果你从数据库获取到一个 JSON 字符串,可以这样解析: ```javascript const jsonString = '{"key1": "value1", "key2": "value2"}'; const jsonData = JSON.parse(jsonString); console.log(jsonData....
MyBatis可以通过简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 **2. MyBatis的优点:** - **灵活性高:**由于MyBatis支持编写原生态...