`

读取解析购物网站的目录,链接和文字,并存到数据库

阅读更多
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&quots " + 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("&currentPage=")==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&currentPage=" + (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

分享到:
评论

相关推荐

    java解析Excel文件并把数据存入数据库和导出数据为excel文件SpringBoot代码示例

    1、java解析读取excel文件中的数据,并写入数据库。 2、java读取数据库数据,并导出为excel文件。 3、README.md中有详细的操作步骤示例。 使用说明: 1. 先使用postman导入:other/excel相关.postman_collection....

    读取Excel文件将数据存入map集合

    ### 读取Excel文件将数据存入Map集合 ...总之,通过这个方法可以有效地读取Excel文件并将数据存储到Java中的`Map`集合,便于后续的数据处理和分析。这对于企业级应用来说非常实用,能够极大地提高工作效率。

    MySQL集群到Oracle数据库的数据同步方法.pdf

    在MySQL集群到Oracle数据库的数据同步过程中,首先需要配置GoldenGate来抽取MySQL集群的日志事件,这可能涉及到解析MySQL的二进制日志或InnoDB存储引擎的Change Data Capture (CDC)。接着,GoldenGate将转换这些事件...

    MySQL的锁机制解析

    MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于保证数据的一致性和完整性起着至关重要的作用。本文将深入解析MySQL中的锁机制,帮助读者理解其工作原理,为面试准备或日常数据库管理提供有力支持...

    智慧公安智能防控系统建设方案(53页).pptx

    在汇聚整合前端视频和各类数据的基础上, 后端联网共享、存储、以及视频 解析系统、视图综合应用系统主要部署在视频专网和公安信息网, 并进一步整合 涉及到公共安全的视频资源(包括社会面视频资源),同时考虑视频...

    智慧公安总体建设方案(53页).pptx

    在汇聚整合前端视频和各类数据的基础上, 后端联网共享、存储、以及视频 解析系统、视图综合应用系统主要部署在视频专网和公安信息网, 并进一步整合 涉及到公共安全的视频资源(包括社会面视频资源),同时考虑视频...

    QT程序设计步步高PDF

    - QNetworkReply处理响应数据,可以读取下载的文件或解析XML、JSON等格式的数据。 6. 数据库编程: - QSqlDatabase模块允许与各种数据库系统交互,如SQLite、MySQL、PostgreSQL等。 - 使用QSqlQuery和...

    VC++交通电子地图源代码

    它们的位置、形状和属性需要被有效地存储和管理,可能采用数据库系统来存储大量的地理信息。 4. 公交车线路和站点:这部分功能可能涉及公共交通数据的处理,包括公交线路的规划、站点的分布和时刻表的管理。这需要...

    1-4.用+TiDB+构建实时应用.pdf

    TiFlash作为列式存储引擎,专为分析处理设计,能够与行存并存,提供高速的更新和读取能力,并且支持MPP(Massive Parallel Processing)计算,显著提升了BI查询的性能。 TiDB的HTAP架构允许行存和列存资源分离,...

    计算机基础问答题.pdf

    计算机基础问答涵盖了从计算机的基本概念到具体操作的广泛知识,以下是对这些知识点的详细解析: 1. 计算机的特点:计算机拥有高速运算能力、高精度计算、强可靠性、强大的存储功能以及逻辑判断能力。这使得计算机...

    ip库信息免费查询

    在Java中,可以使用`Scanner`或`BufferedReader`来读取CSV文件,将数据解析并存入合适的数据结构。如果是二进制格式,可能需要专门的库如`MaxMind GeoIP2`来解析。在解析过程中,需要注意处理异常,确保数据的完整性...

    开源项目-google-protobuf.zip

    4. **版本控制**:新旧版本的协议可以并存,且老版本的代码仍能读取新版本的数据。 在实际应用中,Protobuf 常用于构建分布式系统、网络通信、数据库存储等领域。例如,Google 的许多服务就使用了 Protobuf 进行...

    2021-2022计算机二级等级考试试题及答案No.14260.docx

    计算机二级等级考试主要涵盖计算机基础知识、操作...以上是针对计算机二级考试试题中涉及知识点的详细解析,涵盖了编程、数据库、操作系统等多个方面,对于备考计算机二级考试的考生来说,理解这些知识点是非常重要的。

    Java ClassLoader Tutorial.zip

    1. 类加载过程:Java中的类加载分为三个阶段——加载、验证、准备、解析和初始化。ClassLoader主要参与的是加载阶段,它从磁盘、网络或其他数据源读取字节码文件,并将其转换为Class对象。 2. 类加载器层次结构:...

    SuperSpeedRamDiskPlus115390desk&ser64bit;.zip

    桌面版主要服务于日常办公、游戏和多媒体处理等场景,而服务器版则针对高性能计算、数据库服务和大规模并发访问等高负载环境。 2. **64位优化**:64位版本充分利用现代计算机的大容量内存资源,支持更大内存分配,...

    hstore_to_json:hstore 到 json 和 json 到 hstore

    例如,如果你从数据库获取到一个 JSON 字符串,可以这样解析: ```javascript const jsonString = '{"key1": "value1", "key2": "value2"}'; const jsonData = JSON.parse(jsonString); console.log(jsonData....

    1000道 互联网Java工程师面试题 485页_PDF密码解除.pdf

    MyBatis可以通过简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。 **2. MyBatis的优点:** - **灵活性高:**由于MyBatis支持编写原生态...

Global site tag (gtag.js) - Google Analytics