- 浏览: 606325 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (263)
- 默认类别 (0)
- STRUTS HIBERNATE (2)
- STRUTS SPRING HIBERNATE (18)
- SOA/WEB service (8)
- PORTAL (3)
- 想法和设计思想 (17)
- SMARTEAM 二次开发 (0)
- ACTIVEBPEL (0)
- ERP (0)
- EAI (0)
- 甲醇汽油 (0)
- webwork freemarker spring hibernate (1)
- 工作流技术研究 (1)
- ROR (5)
- 搜索引擎 (7)
- 3.非技术区 (0)
- 1.网站首页原创Java技术区(对首页文章的要求: 原创、高质量、经过认真思考并精心写作。BlogJava管理团队会对首页的文章进行管理。) (2)
- 2.Java新手区 (2)
- 4.其他技术区 (0)
- ESB (1)
- Petals ESB (6)
- 手机开发 (1)
- docker dedecms (1)
最新评论
-
w630636065:
楼主,期待后续!!!!!!!!
生成文本聚类java实现 (2) -
zilong513:
十分感谢楼主,期待后续。
生成文本聚类java实现 (2) -
qqgoodluck:
可否介绍一下您的选型依据,包括Petal ESB与MULE等E ...
Petals ESB 简介 -
jackiee_cn:
写的比较清楚,学习了
Petals ESB 集群实战 -
忙两夜:
你好,能发一下源代码吗
抓取口碑网店铺资料
呵呵,只为自己玩,哈哈。
技术难度:
1)快速高效的抓取记录,并去重,和以后的增量抓取。
2)因为口碑网的联系方式是图片的,如何批量的完成OCR的转换
本文只是一个实验,不建议使用在项目当中,如下是部分代码。
涉及的开源代码:
AspriseOCR
资源包,把crawler4j所有jar包放在你的应用目录中。
- Berkeley DB Java Edition 4.0.71 or higher
- fastutil 5.1.5
- DSI Utilities 1.0.10 or higher
- Apache HttpClient 4.0.1
- Apache Log4j 1.2.15
- Apache Commons Logging 1.1.1
- Apache Commons Codec 1.4
如上的JAR包都必须包括在你的项目lib当中,否则会出错。
第一步,抓取口碑网店铺信息。
如下是抓取的部分代码:
主程序入口:Controller.java
package com.aragon.crawdata; import org.junit.Test; import edu.uci.ics.crawler4j.crawler.CrawlController; public class Controller { private static String CRAWSITE = "http://beijing.koubei.com/"; @Test public void test(){ CrawlController controller; try { controller = new CrawlController("/data/crawl/root"); controller.addSeed(CRAWSITE); controller.start(MyCrawler.class, 3); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
抓取主程序 MyCrawler.java
package com.aragon.crawdata; import java.util.ArrayList; import java.util.regex.Pattern; import edu.uci.ics.crawler4j.crawler.Page; import edu.uci.ics.crawler4j.crawler.WebCrawler; import edu.uci.ics.crawler4j.url.WebURL; public class MyCrawler extends WebCrawler { private static String CRAWSITE = "http://beijing.koubei.com/store/"; Pattern filters = Pattern.compile(".(detail--storeId-*)$"); SaveInDb savein = new SaveInDb(); public MyCrawler() { } public boolean shouldVisit(WebURL url) { String href = url.getURL().toLowerCase(); if (filters.matcher(href).matches()) { return false; } if (href.startsWith(CRAWSITE)) { return true; } return false; } public void visit(Page page) { int docid = page.getWebURL().getDocid(); String url = page.getWebURL().getURL(); System.out.println("Url:" + url); Template4Koubei koubei = new Template4Koubei(); try { CrawDataModel model = koubei.translationData(page.getHTML()); if (model != null) { //保存在数据库当中。 savein .update("insert into info(type,name,address,tel1,tel2,tel3,otherinfo,othertype,ownername) value ('" + model.getType() + "','" + model.getName() + "','" + model.getAddress() + "','" + model.getTel1() + "','" + model.getTel2() + "','" + model.getTel3() + "','" + model.getOtherInfo() + "','" + model.getOtherType() + "','" + model.getOwnerName() + "')"); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } String text = page.getText(); ArrayList<WebURL> links = page.getURLs(); } }
真正解析口碑网店铺的类Template4Koubei.java
package com.aragon.crawdata; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.HasAttributeFilter; import org.htmlparser.filters.NodeClassFilter; import org.htmlparser.tags.Div; import org.htmlparser.tags.ImageTag; import org.htmlparser.tags.Span; import org.htmlparser.tags.TableColumn; import org.htmlparser.util.NodeList; public class Template4Koubei { private static String NAME_TAG = "title-wrap yk-fix-float";// 名称 private static String TYPE_TAG = "detail-info-item";// 类型 private static String ADDRESS_TAG = "info yk-fix-float";// 地址 private static String TEL_TAG = "detail-info-item";// 电话,图像 private static String MOB_TAG = "detail-info-item"; private static String DETAIL_TAG = "detail-intro"; private static String OTHERINFO_TAG = "detail-info-item"; public CrawDataModel translationData(String webHtml) throws Exception { CrawDataModel model = new CrawDataModel(); Object[] name = findCrawDataByCol(webHtml, NAME_TAG); if (name != null && name[0] != null) { model.setName(StringUtils.deleteWhitespace(name[0].toString())); Object[] type = findCrawDataByCol(webHtml, TYPE_TAG); if (type != null) { model.setType(StringUtils.deleteWhitespace(type[0].toString())); } Object[] tel = findCrawDataByImageFilter(webHtml, TEL_TAG); if (tel != null) { for (int i = 0; i < tel.length; i++) { if (i == 0) { model.setTel1(StringUtils.deleteWhitespace(tel[0] .toString())); } if (i == 1) { model.setTel2(StringUtils.deleteWhitespace(tel[1] .toString())); } if (i == 2) { model.setTel3(StringUtils.deleteWhitespace(tel[2] .toString())); } } } Object[] otherType = findCrawDataByCol(webHtml, OTHERINFO_TAG); String otherTypeString = ""; if (otherType != null) { for (int i = 0; i < otherType.length; i++) { if (i < 3) { otherTypeString += StringUtils .deleteWhitespace(otherType[i].toString()); } } model.setOtherType(otherTypeString); } Object[] address = findCrawDataByCol(webHtml, ADDRESS_TAG); if (address != null) { model.setAddress(StringUtils.deleteWhitespace(address[0] .toString())); } Object[] detail = findCrawDataByCol(webHtml, DETAIL_TAG); if (detail != null) { model.setOtherInfo(StringUtils.deleteWhitespace(detail[0] .toString())); } } else { return null; } // check address if (model.getAddress() != null) { if (model.getAddress().indexOf("电话") > 0) { model.setOtherType(model.getAddress().substring( model.getAddress().indexOf("电话"))); model.setAddress(model.getAddress().substring(0, model.getAddress().indexOf("电话"))); } } return model; } public Object[] findCrawDataByCol(String webHtml, String Tag) throws Exception { String name = ""; List<String> resultTextList = new ArrayList<String>(); Parser parser = new Parser(); parser.setInputHTML(webHtml); NodeFilter filter = new HasAttributeFilter("class", Tag); /* NodeFilter filter 就是要解析的过滤器,实现有好多种,我采用的属性过滤,其他more api */ NodeList nodeList = parser.extractAllNodesThatMatch(filter); /* * extractAllNodesThatAre(class)已经不被推荐使用,在1.6版本中,我感到更加体形了灵活性.更好的适用了自定义的tag */ if (nodeList == null) return null; if (nodeList.size() == 0) return null; // System.out.println("start ============== ,size = " // + nodeList.size()); Node[] nodes = nodeList.toNodeArray(); String line = ""; for (int i = 0; i < nodes.length; i++) { Node node = nodes[i]; /* 得到所以符合的节点,类型化做对应的标签类 */ if (node instanceof Span) { Span spanTag = (Span) node; line = spanTag.toPlainTextString(); } else if (node instanceof TableColumn) { TableColumn tableTag = (TableColumn) node; line = tableTag.toPlainTextString(); } else if (node instanceof Div) { Div divTag = (Div) node; line = divTag.toPlainTextString(); } if (StringUtil.isTrimEmpty(line)) { continue; } else { resultTextList.add(line); } } return resultTextList.toArray(); // return name; } public Object[] findCrawDataByImageFilter(String webHtml, String Tag) throws Exception { List<String> resultTextList = new ArrayList<String>(); Parser parser = new Parser(); parser.setInputHTML(webHtml); NodeFilter filter = new NodeClassFilter(ImageTag.class); /* NodeFilter filter 就是要解析的过滤器,实现有好多种,我采用的属性过滤,其他more api */ NodeList nodeList = parser.extractAllNodesThatMatch(filter); /* * extractAllNodesThatAre(class)已经不被推荐使用,在1.6版本中,我感到更加体形了灵活性.更好的适用了自定义的tag */ if (nodeList == null) return null; if (nodeList.size() == 0) return null; // System.out.println("start ============== ,size = " // + nodeList.size()); Node[] nodes = nodeList.toNodeArray(); String line = ""; for (int i = 0; i < nodes.length; i++) { Node node = nodes[i]; /* 得到所以符合的节点,类型化做对应的标签类 */ if (node.getParent().getText().indexOf(Tag) > 0) { ImageTag imageTag = (ImageTag) node; line = imageTag.getImageURL(); } if (StringUtil.isTrimEmpty(line)) { continue; } else { resultTextList.add(line); } } return resultTextList.toArray(); // return name; } }
Model对象:CrawDataModel.java
package com.aragon.crawdata; import java.io.Serializable; public class CrawDataModel implements Serializable{ private Integer id; private String type; private String name; private String address; private String tel1; private String tel2; private String tel3; private String ownerName; private String otherInfo; private String otherType; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel1() { return tel1; } public void setTel1(String tel1) { this.tel1 = tel1; } public String getTel2() { return tel2; } public void setTel2(String tel2) { this.tel2 = tel2; } public String getTel3() { return tel3; } public void setTel3(String tel3) { this.tel3 = tel3; } public String getOwnerName() { return ownerName; } public void setOwnerName(String ownerName) { this.ownerName = ownerName; } public String getOtherInfo() { return otherInfo; } public void setOtherInfo(String otherInfo) { this.otherInfo = otherInfo; } public String getOtherType() { return otherType; } public void setOtherType(String otherType) { this.otherType = otherType; } }
哈哈,如上的步骤就可以把口碑网的店铺信息抓入你的数据库当中,我在恶劣的2M宽带条件下,一个小时抓了2000多条信息,当然了,没有加入去重的功能。
第二步:把电话,手机信息转换成指定的数字号码
从口碑网抓取的电话,手机信息都是图片信息,如何把他转换成数字号码,我们使用AspriseOCR。网上破解的方法很多。大家可以google一下。
如下是他的TEST实验。因为我的应用代码太多,所以就粘一个Test,从技术上没有问题。
package com.aragon.crawdata; import java.io.File; /** * * 本程序实现功能:给出一个图片的具体网络地址,把该图片的进行解析,解析后把图片内容以字符串形式进行返回 */ public class RecognisePicture { /** * * create date:2009-5-22 author:Administrator * * * * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub recognise("http://count.koubei.com/showphone/showphone.php?f=jpg&w=96&h=10&bc=255,255,255&fc=0,0,0&fs=10&fn=arial&phone=MTI5NDU5ODg0Mw%3D%3D%23OQ532L8m6okoAzY6".replaceAll("&", "&")); } /** * * 解析指定网络地址的图片信息 create date:2009-5-22 author:Administrator * * * * @param fromUrl * * @return */ public static String recognise(String fromUrl) { String result = ""; // 下载图片文件到本地磁盘 File file = DownLoadWithUrl.downLoadFile(fromUrl); if (file != null) { // 解析下载到本地磁盘文件 result = ParseJPEG_withOCR.getRecogniseStr(file); // 删除下载到本地磁盘的文件 DownLoadWithUrl.delFile(file); } System.out.println("输出的电话号码是:"+result); return result; } }
如下是实验结果:
输出的电话号码是:01O 51402688
哈哈,这样一来。是不是能减少很多MM的工作量呀。enjoy it!
发表评论
-
通过commons.httpclient 自动识别网页编码
2012-05-29 16:43 2886在自动化抓取网站的时候,最讨厌的就是不同的网站有多种不 ... -
偷梁换柱:MMSeg4j借用庖丁解牛的词库
2011-05-11 10:41 3354“……他不回答,对柜里说,“温两碗酒,要一碟茴香豆。”便 ... -
随想:迅速取得海量数据之结构化数据
2011-05-11 10:09 1780呵呵,要想瞬间取得需要的数据,比如新闻信息,而且能够分门别 ... -
生成文本聚类java实现 (2)
2011-04-12 10:02 8308呵呵,继续。 本节的学习内容: 4.从剩余的 ... -
solr的索引和查询顺序
2010-12-29 18:52 2501拜读了solr的部分源码,却急于弄明白solr的索引顺序和查 ... -
solr基础知识
2010-12-27 15:43 1896对 solr1.4版本 准备 下载 ...
相关推荐
这包括对商品分类、页面布局、产品描述等进行细致的规划和设计,确保顾客能够快速找到所需商品,同时提高搜索引擎的抓取效率。此外,良好的用户体验也是不可忽视的一环,如简洁明了的购物流程、清晰的商品图片以及...
- **店铺名称**:店铺名称应包含重要关键字,以利于搜索引擎抓取。名称不宜过于简洁,应充分利用30个字符空间,放置与商品相关的热门搜索词。 - **店铺分类**:店铺分类也应包含关键字,尤其是前两个分类,这同样...
社区营销是利用社交媒体平台,如论坛、百度知道、微博和SNS社区(如开心网和人人网)来与消费者建立互动关系。近期目标是提高品牌正面信息的曝光度,中期目标是扩大品牌知名度,长期目标是建立良好的网络口碑并提升...
2. **店铺装修**:设计吸引人的店铺界面,提高用户停留时间和转化率。 3. **商品详情页优化**:清晰的产品图片、详尽的描述、合理的定价策略,都是影响购买决策的重要因素。 4. **库存管理**:实时更新库存信息,...
- **选品策略**:每个宝贝的市场接受度不同,选择潜力好、易于推广的宝贝可以降低推广成本,快速提升销量,同时通过口碑效应带动店铺其他产品的销售。 - **测试与选择**:可以同时推广同一细分类目的多个宝贝,...
在ShopNC系统中,B2B2C模式允许供应商(B)在平台上开设店铺,零售商(另一B)可以在这些店铺采购商品,同时消费者(C)可以直接在平台上购买商品,实现了供应链、批发与零售的融合。 2. **WAP与微商城**:WAP版是...
挂件在获取评论数据时,会同时抓取关联的商品信息,将图片与评论一起展示出来。因此,数据库的结构和数据完整性对于这一功能的正常运行至关重要。 在实际操作中,可能会遇到一些常见问题,比如图片加载慢、图片不...
1. 资料收集与统计: - 市场需求分析:研究市场动态,确定目标群体的需求。 - 用户结构分析:理解用户特性,包括年龄、性别、兴趣等。 - 市场竞争分析:对比竞品,识别自身优势和劣势。 - 购买行为分析:研究...
4. **增强竞争力**:快速、准确的充值服务是提升店铺口碑和竞争力的关键因素之一。 综上所述,"速度达自动充值系统 V2.45"作为一个官方、无毒且经过验证可用的工具,对于电商或网店运营者来说,是一个提高效率、...
- 数据爬虫:自动化抓取网络上的数据。 - 机器学习:用于数据分析模型构建。 - 物料与供应链关联分析 - 数据服务中心:提供数据分析服务。 - 店铺中心、评价中心、供应商中心等 - **应用场景**: - 精准营销 ...
4. **本地SEO**:对于有实体店铺的企业,优化Google My Business等本地列表,提高在地理位置相关的搜索中的可见性。 此外,SEO从业人员还需要关注搜索引擎算法的更新,例如Google的Panda、Penguin和Hummingbird等,...
- **C2C平台上的大卖家**:如个体店铺,依赖口碑和价格优势,需要关注社交媒体营销和客户关系管理。 3. **SWOT分析**:Strengths(优势)、Weaknesses(劣势)、Opportunities(机会)、Threats(威胁)。通过...