`

抓取网站的畅销商品,一个页面20个商品,抓取100个等的实例

阅读更多

1、解析器

package com.yihaodian.pis.crawler;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
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.Bullet;
import org.htmlparser.tags.BulletList;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.ImageTag;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.ScriptTag;
import org.htmlparser.tags.Span;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import com.yihaodian.pis.dto.BestSellerDto;

public class SuningPageParser extends PageParser{
	private static final Logger logger = Logger.getLogger(SuningPageParser.class);

	public SuningPageParser(String html, String charset) {
		super(html, charset);
		// TODO Auto-generated constructor stub
	}

	@Override
	public List<BestSellerDto> extractBestSeller(String bestSellerHtml)
			throws ParserException {
		  List<BestSellerDto> sellers = new ArrayList<BestSellerDto>();

	        Parser parser = Parser.createParser(bestSellerHtml, charset);
	        NodeFilter filter = new HasAttributeFilter("class", "product_list02 profix02 clearfix");
	        NodeList nodeList = parser.extractAllNodesThatMatch(filter);

	        if (nodeList == null || nodeList.size() == 0) {
	            return null;
	        }

	        Node div = nodeList.elementAt(0);
	        NodeList divchildren = div.getChildren();
	        BulletList ul = (BulletList)divchildren.elementAt(1);
	        NodeList children = ul.getChildren();

	        BestSellerDto bestSeller = null;
	        for (int i = 0; i < children.size(); i++) {
	            bestSeller = new BestSellerDto();

	            Node child = children.elementAt(i);

	            if (child instanceof Bullet) {
	                Bullet li = (Bullet) child;
	                
	                Span nameDiv = (Span) findTagByClassName(li, "pro_intro");
	                //寻找tagName是 LinkTag 的那个 
	                LinkTag link = (LinkTag)findTagByName(nameDiv,"LinkTag");               
	                bestSeller.setName(link.getLinkText());
	                bestSeller.setUrl("http://www.suning.cn"+link.getLink());

	                Span pricespan = (Span) findTagByClassName(li, "pro_price");
	                String priceteString =pricespan.getChildrenHTML().replace("<em>", "").replace("</em>", "").replace("¥", "");
	                bestSeller.setPrice(priceteString);
	                logger.info("畅销单品:" + bestSeller);
	                sellers.add(bestSeller);
	            } else {
	                continue;
	            }
	        }

	        return sellers;
	}

	@Override
	public String extractNextPageUrlPattern(String bestSellerHtml)
			throws ParserException {
		String nextPageUrl="";
		Parser parser = Parser.createParser(bestSellerHtml, "utf-8");
		NodeFilter filter = new HasAttributeFilter("type", "text/javascript");;
        NodeList children = parser.extractAllNodesThatMatch(filter);

        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));
			nextPageUrl=putInCart2+putInCart1;
		}
        }
       // parser = Parser.createParser(bestSellerHtml, "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();
//			}
//		}
        nextPageUrl+="&ip_sortBy=salevolumn0&sortType=4&currentPage=";// + currentPage;
        logger.info("畅销榜下一页URL模式:" + nextPageUrl);

        return nextPageUrl;
	}

	@Override
	public String getNextPageUrl(String nextPageUrlPattern, int pageNum) {
		    StringBuilder sb = new StringBuilder();
	        sb.append("http://www.suning.cn/webapp/wcs/stores/servlet/");
	        sb.append(nextPageUrlPattern+(pageNum-1));

	        String nextPageUrl = sb.toString();

	        return nextPageUrl;
	}

	@Override
	public String extractName(Map<String, String> params)
			throws ParserException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String extractPrice(Map<String, String> params)
			throws ParserException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String extractBrand(Map<String, String> params)
			throws ParserException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public String extractImageUrl(Map<String, String> params)
			throws ParserException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean hasProduct(Map<String, String> params)
			throws ParserException {
		// TODO Auto-generated method stub
		return false;
	}

}

 2、主程序DAO

 

 public List<BestSellerDto> fetchBestSeller(Integer id, int amount) {
        List<BestSellerDto> bestSellers = new ArrayList<BestSellerDto>();

        if (amount <= 0) {
            logger.warn("畅销品数目不能为负数!");
            return null;
        }
        SiteCategoryDto siteCategory = getSiteCategoryById(id);

        // 抓取参数
        Map<String, String> params;

        // 组织抓取参数与页面参数
        params = pageParamItemDao.getPageConfigBySite(siteCategory.getSiteId());
        params.putAll(crawlerParamItemDao.getCrawlConfigBySite(siteCategory.
                getSiteId()));

        // 构建抓取对象
        String charset = params.get(PageParamNames.CONTENT_ENCODING);
        int pageSize = Integer.parseInt(params.get(PageParamNames.BS_PAGE_SIZE));
        int pages = amount / pageSize + 1;

         logger.info("畅销榜页数:" + pages);

        Crawler crawler = new Crawler(charset);
        String bestSellerHtml = null;
        PageParser pageParser = null;

        try {
            String categoryUrl = siteCategory.getCategoryUrl();
            if (categoryUrl == null || categoryUrl.equals("")) {
                logger.info("此分类不支持畅销榜!");
                return null;
            }

            bestSellerHtml = crawler.crawl(siteCategory.getCategoryUrl());
            pageParser = PageParserFactory.createPageParser(null, charset,
                    params);
            String nextPageUrlPattern=pageParser.extractNextPageUrlPattern(bestSellerHtml);
            if (siteCategory.getCategoryUrl().indexOf("suning")>0) {
            	String nextPageUrl0 = pageParser.getNextPageUrl(
                        nextPageUrlPattern, 1);
                bestSellerHtml = crawler.crawl(nextPageUrl0);
			}
            bestSellers = pageParser.extractBestSeller(bestSellerHtml);
            //if(amount<=bestSellers.size()) return bestSellers;
            
            if (nextPageUrlPattern != null) {
                for (int pageNum = 2; pageNum <= pages; pageNum++) {
                    logger.info("抓取畅销榜第 " + pageNum + " 页");

                    String nextPageUrl = pageParser.getNextPageUrl(
                            nextPageUrlPattern, pageNum);
                    bestSellerHtml = crawler.crawl(nextPageUrl);
                    List<BestSellerDto> moreBestSellers = pageParser.
                            extractBestSeller(bestSellerHtml);
                    if (moreBestSellers == null || moreBestSellers.isEmpty()) {
                        break;
                    }
                    if (bestSellers.get(bestSellers.size() - 1).getUrl().equals(
                            moreBestSellers.get(moreBestSellers.size() - 1).
                            getUrl())) {
                        break;
                    }
                    if (moreBestSellers != null && !moreBestSellers.isEmpty()) {
                        bestSellers.addAll(moreBestSellers);
                    }
                }
            }
        } catch (IOException e) {
            logger.error("抓取 " + siteCategory.getCategoryName() + " 畅销榜时出现异常!"
                    + "URL为:" + siteCategory.getCategoryUrl(), e);
        } catch (ParserException e) {
            logger.error("解析畅销榜页面时出现异常!" + "URL为:"
                    + siteCategory.getCategoryUrl(), e);
        }

        logger.info("++++++++++++++++++++++++++++++++++");
        logger.info("畅销集合大小:" + (bestSellers == null ? 0 : bestSellers.size()));
        if (bestSellers != null) {
            if (bestSellers.size() <= amount) {
                return bestSellers;
            }

            List<BestSellerDto> subList = bestSellers.subList(0, amount);
            logger.info("----------------------------------");
            logger.info("畅销集合大小:" + subList.size());

            return subList;
        } else {
            return new ArrayList<BestSellerDto>();
        }
    }

 不懂的联系QQ526151410

分享到:
评论

相关推荐

    抓取网站实例配置(一)

    【标题】"抓取网站实例配置(一)"主要探讨的是如何通过编程技术抓取网站数据,这在IT领域中通常被称为网络爬虫或Web scraping。网络爬虫是一种自动化技术,用于从互联网上提取大量信息,它能遍历网页,解析HTML或其他...

    casperjs抓取简单实例

    "casperjs抓取简单实例" 指的是使用CasperJS库进行网页抓取的一个基础应用示例。CasperJS是一个基于PhantomJS或SlimerJS的高级脚本接口,用于导航、测试和截图网页。在这个实例中,它被用来抓取特定输入内容(可能是...

    静态页面抓取工具

    Teleport Pro支持多种抓取模式,包括按目录结构抓取、仅抓取新内容等,而且它还能检测登录和表单,对于需要登录才能访问的网站,提供了更全面的抓取能力。此外,Teleport Pro还提供了内置的搜索功能,方便用户在抓取...

    淘宝商品抓取工具 - 通过页面抓取淘宝网的商品

    淘宝商品抓取工具是一款专为数据分析师、电商从业者或研究人员设计的应用程序,它允许用户从淘宝网的商品搜索页面中高效地获取大量商品信息。这款工具的主要功能是通过自动化的方式抓取网页上的商品数据,以便进行...

    python爬虫实例 requests+beautifulsoup4解析 HTML 页面一个简单的网页上抓取标题和链接

    python爬虫实例 requests+beautifulsoup4解析 HTML 页面一个简单的网页上抓取标题和链接 Python 爬虫是一种自动化程序,用于从网站上抓取数据。这里我将提供一个简单的 Python 爬虫实例,使用 requests 库来发送 ...

    抓取淘宝商品的价格,物品名,销量等信息

    标题中的“抓取淘宝商品的价格,物品名,销量等信息”指的是通过网络爬虫技术从淘宝网站上获取商品的相关数据,这些数据主要包括商品的名称、价格和销售量。这是一个非常实用的技术,尤其对于数据分析、市场研究或者...

    python抓取淘宝天猫网页商品详情Demo

    这个Demo提供了一个基础的框架,帮助初学者快速上手商品详情的抓取。在实际操作中,可能需要根据目标网页的结构进行调整,也可能需要应对各种反爬策略。通过实践和学习,你可以进一步提升抓取的效率和稳定性。

    京东商品数据抓取

    在IT行业中,数据抓取是一项重要的技能,尤其...总之,“京东商品数据抓取”项目涉及到了网络爬虫、API接口利用、数据解析存储、异常处理等多个IT领域的知识点,对于提升开发者的数据获取和分析能力具有很高的价值。

    网站静态页面抓取器

    智联招聘作为一个大型招聘平台,包含大量职位页面,每个页面可能有职位名称、公司信息、薪资待遇等关键数据。通过静态页面抓取器,我们可以收集这些信息进行分析,比如研究不同行业的招聘趋势,或者建立自己的职位...

    java爬虫webmagic抓取静态页面demo

    Java爬虫WebMagic是开发者常用来抓取网页数据的一个强大工具,尤其对于处理静态页面,它的易用性和灵活性使得在Java开发环境中非常受欢迎。WebMagic的设计理念是模块化,这使得我们可以灵活地组合各个组件来实现不同...

    asp.net网站采集与抓取实例

    1. 创建一个HttpClient实例,设置请求头和超时等参数。 2. 使用HttpGet方法向目标URL发送请求。 3. 接收响应,并确保状态码表示成功(如200)。 4. 解析响应内容,通常是HTML字符串。 HTML解析是网站抓取的关键部分...

    C#抓包_数据包抓取实例

    C#抓包程序实例,学习如何抓取数据包、抓取的数据包集合等,并使用了皮肤控件对窗口进行美化处理,初始化窗体皮肤实例,抓包时可以多个网卡同时抓取,循环抓取每个网卡的数据包,为每个网卡IP配置一个抓取实例,产生...

    精华志 蜘蛛爬虫,递归抓取页面的URL 抓取页面URL

    本资源“精华志 蜘蛛爬虫,递归抓取页面的URL 抓取页面URL”显然是一个关于如何使用编程语言实现递归爬虫的教程,特别关注了C#、ASP.NET、SQL和DBA技术,并可能包含源码供学习和参考。 1. **C#**:C#是微软开发的一...

    网站链接抓取器(自动抓取).zip

    网站链接抓取器是一款实用工具,它主要用于自动化地抓取指定域名下的所有链接,并将这些链接整理成一个名为“sitemap.txt”的网站地图文件。这个过程对于网站优化,特别是搜索引擎优化(SEO)工作至关重要。 首先,...

    抓取网站神器工具

    2. **深度抓取**:通过设置抓取深度,Teleport Pro 可以追踪链接到的页面,不仅限于首页,而是深入到网站的各个层级,确保抓取到所有相关的内容。 3. **定制抓取规则**:用户可以根据需要设定过滤规则,比如只抓取...

    抓取淘宝页面数据

    例如,商品销量等信息可能在页面加载后由JavaScript生成,这就需要这些工具来抓取。 在抓取淘宝数据时,还需要关注的一个关键点是反爬策略。淘宝作为大型电商平台,有严格的反爬机制,如IP限制、User-Agent检查、...

    tp5 利用QueryList + PhantomJS实现抓取淘宝京东天猫商品数据

    3. **PhantomJS**:这是一个无头浏览器,可以在没有图形用户界面的情况下运行JavaScript,这对于网页抓取尤其有用,因为它能够执行页面上的JavaScript,加载动态内容,并模拟真实浏览器的行为。 下面是如何实现这一...

    页面数据抓取

    在IT行业中,页面数据抓取是一项重要的技能,它允许我们从网页上自动化地获取大量信息。这项技术广泛应用于数据分析、搜索引擎...希望这篇文章能为你提供一个关于页面抓取的全面视角,助你在这一领域中取得更大的进步。

Global site tag (gtag.js) - Google Analytics