- 浏览: 168965 次
- 性别:
- 来自: 武汉
文章分类
最新评论
抓取网站的畅销商品,一个页面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("¤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)); 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¤tPage=";// + 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是一个基于PhantomJS或SlimerJS的高级脚本接口,用于导航、测试和截图网页。在这个实例中,它被用来抓取特定输入内容(可能是...
Teleport Pro支持多种抓取模式,包括按目录结构抓取、仅抓取新内容等,而且它还能检测登录和表单,对于需要登录才能访问的网站,提供了更全面的抓取能力。此外,Teleport Pro还提供了内置的搜索功能,方便用户在抓取...
淘宝商品抓取工具是一款专为数据分析师、电商从业者或研究人员设计的应用程序,它允许用户从淘宝网的商品搜索页面中高效地获取大量商品信息。这款工具的主要功能是通过自动化的方式抓取网页上的商品数据,以便进行...
python爬虫实例 requests+beautifulsoup4解析 HTML 页面一个简单的网页上抓取标题和链接 Python 爬虫是一种自动化程序,用于从网站上抓取数据。这里我将提供一个简单的 Python 爬虫实例,使用 requests 库来发送 ...
标题中的“抓取淘宝商品的价格,物品名,销量等信息”指的是通过网络爬虫技术从淘宝网站上获取商品的相关数据,这些数据主要包括商品的名称、价格和销售量。这是一个非常实用的技术,尤其对于数据分析、市场研究或者...
这个Demo提供了一个基础的框架,帮助初学者快速上手商品详情的抓取。在实际操作中,可能需要根据目标网页的结构进行调整,也可能需要应对各种反爬策略。通过实践和学习,你可以进一步提升抓取的效率和稳定性。
在IT行业中,数据抓取是一项重要的技能,尤其...总之,“京东商品数据抓取”项目涉及到了网络爬虫、API接口利用、数据解析存储、异常处理等多个IT领域的知识点,对于提升开发者的数据获取和分析能力具有很高的价值。
智联招聘作为一个大型招聘平台,包含大量职位页面,每个页面可能有职位名称、公司信息、薪资待遇等关键数据。通过静态页面抓取器,我们可以收集这些信息进行分析,比如研究不同行业的招聘趋势,或者建立自己的职位...
Java爬虫WebMagic是开发者常用来抓取网页数据的一个强大工具,尤其对于处理静态页面,它的易用性和灵活性使得在Java开发环境中非常受欢迎。WebMagic的设计理念是模块化,这使得我们可以灵活地组合各个组件来实现不同...
1. 创建一个HttpClient实例,设置请求头和超时等参数。 2. 使用HttpGet方法向目标URL发送请求。 3. 接收响应,并确保状态码表示成功(如200)。 4. 解析响应内容,通常是HTML字符串。 HTML解析是网站抓取的关键部分...
C#抓包程序实例,学习如何抓取数据包、抓取的数据包集合等,并使用了皮肤控件对窗口进行美化处理,初始化窗体皮肤实例,抓包时可以多个网卡同时抓取,循环抓取每个网卡的数据包,为每个网卡IP配置一个抓取实例,产生...
本资源“精华志 蜘蛛爬虫,递归抓取页面的URL 抓取页面URL”显然是一个关于如何使用编程语言实现递归爬虫的教程,特别关注了C#、ASP.NET、SQL和DBA技术,并可能包含源码供学习和参考。 1. **C#**:C#是微软开发的一...
网站链接抓取器是一款实用工具,它主要用于自动化地抓取指定域名下的所有链接,并将这些链接整理成一个名为“sitemap.txt”的网站地图文件。这个过程对于网站优化,特别是搜索引擎优化(SEO)工作至关重要。 首先,...
2. **深度抓取**:通过设置抓取深度,Teleport Pro 可以追踪链接到的页面,不仅限于首页,而是深入到网站的各个层级,确保抓取到所有相关的内容。 3. **定制抓取规则**:用户可以根据需要设定过滤规则,比如只抓取...
例如,商品销量等信息可能在页面加载后由JavaScript生成,这就需要这些工具来抓取。 在抓取淘宝数据时,还需要关注的一个关键点是反爬策略。淘宝作为大型电商平台,有严格的反爬机制,如IP限制、User-Agent检查、...
3. **PhantomJS**:这是一个无头浏览器,可以在没有图形用户界面的情况下运行JavaScript,这对于网页抓取尤其有用,因为它能够执行页面上的JavaScript,加载动态内容,并模拟真实浏览器的行为。 下面是如何实现这一...
在IT行业中,页面数据抓取是一项重要的技能,它允许我们从网页上自动化地获取大量信息。这项技术广泛应用于数据分析、搜索引擎...希望这篇文章能为你提供一个关于页面抓取的全面视角,助你在这一领域中取得更大的进步。