`

抓取口碑网店铺资料

阅读更多

   呵呵,只为自己玩,哈哈。

   技术难度:

   1)快速高效的抓取记录,并去重,和以后的增量抓取。

   2)因为口碑网的联系方式是图片的,如何批量的完成OCR的转换

 

   本文只是一个实验,不建议使用在项目当中,如下是部分代码。

 

   涉及的开源代码:

   crawler4j

   AspriseOCR

 

   资源包,把crawler4j所有jar包放在你的应用目录中。

 

  如上的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&amp;w=96&amp;h=10&amp;bc=255,255,255&amp;fc=0,0,0&amp;fs=10&amp;fn=arial&amp;phone=MTI5NDU5ODg0Mw%3D%3D%23OQ532L8m6okoAzY6".replaceAll("&amp;", "&"));

	}

	/**
	 * 
	 * 解析指定网络地址的图片信息 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!

 

 

 

 

 

 

分享到:
评论
2 楼 忙两夜 2013-09-09  
你好,能发一下源代码吗
1 楼 changyuxin 2011-09-08  
能把完整的代码发出来学习一下吗?

相关推荐

    网店推广几种简单且行之有效的方法

    这包括对商品分类、页面布局、产品描述等进行细致的规划和设计,确保顾客能够快速找到所需商品,同时提高搜索引擎的抓取效率。此外,良好的用户体验也是不可忽视的一环,如简洁明了的购物流程、清晰的商品图片以及...

    淘宝网店运营技巧(一).docx

    - **店铺名称**:店铺名称应包含重要关键字,以利于搜索引擎抓取。名称不宜过于简洁,应充分利用30个字符空间,放置与商品相关的热门搜索词。 - **店铺分类**:店铺分类也应包含关键字,尤其是前两个分类,这同样...

    网络营销执行方案-通用.pptx

    社区营销是利用社交媒体平台,如论坛、百度知道、微博和SNS社区(如开心网和人人网)来与消费者建立互动关系。近期目标是提高品牌正面信息的曝光度,中期目标是扩大品牌知名度,长期目标是建立良好的网络口碑并提升...

    seo 电商 网络推广 思维导图集合

    2. **店铺装修**:设计吸引人的店铺界面,提高用户停留时间和转化率。 3. **商品详情页优化**:清晰的产品图片、详尽的描述、合理的定价策略,都是影响购买决策的重要因素。 4. **库存管理**:实时更新库存信息,...

    定向推广优化技巧-白菜.pptx

    - **选品策略**:每个宝贝的市场接受度不同,选择潜力好、易于推广的宝贝可以降低推广成本,快速提升销量,同时通过口碑效应带动店铺其他产品的销售。 - **测试与选择**:可以同时推广同一细分类目的多个宝贝,...

    ShopNC【B2B2C】

    在ShopNC系统中,B2B2C模式允许供应商(B)在平台上开设店铺,零售商(另一B)可以在这些店铺采购商品,同时消费者(C)可以直接在平台上购买商品,实现了供应链、批发与零售的融合。 2. **WAP与微商城**:WAP版是...

    shopex显示评论挂件-可显示商品图片

    挂件在获取评论数据时,会同时抓取关联的商品信息,将图片与评论一起展示出来。因此,数据库的结构和数据完整性对于这一功能的正常运行至关重要。 在实际操作中,可能会遇到一些常见问题,比如图片加载慢、图片不...

    洋淘优购(海淘网站)B2C推广方案.docx

    1. 资料收集与统计: - 市场需求分析:研究市场动态,确定目标群体的需求。 - 用户结构分析:理解用户特性,包括年龄、性别、兴趣等。 - 市场竞争分析:对比竞品,识别自身优势和劣势。 - 购买行为分析:研究...

    速度达 系统充值 压缩包

    4. **增强竞争力**:快速、准确的充值服务是提升店铺口碑和竞争力的关键因素之一。 综上所述,"速度达自动充值系统 V2.45"作为一个官方、无毒且经过验证可用的工具,对于电商或网店运营者来说,是一个提高效率、...

    跨境电商综合实训平台大数据分析子系统大仪论证报告试验室管理处.docx

    - 数据爬虫:自动化抓取网络上的数据。 - 机器学习:用于数据分析模型构建。 - 物料与供应链关联分析 - 数据服务中心:提供数据分析服务。 - 店铺中心、评价中心、供应商中心等 - **应用场景**: - 精准营销 ...

    SEO编辑基本知识-SEO网站优化教程

    4. **本地SEO**:对于有实体店铺的企业,优化Google My Business等本地列表,提高在地理位置相关的搜索中的可见性。 此外,SEO从业人员还需要关注搜索引擎算法的更新,例如Google的Panda、Penguin和Hummingbird等,...

    牛仔裤网络营销策划方案.docx

    - **C2C平台上的大卖家**:如个体店铺,依赖口碑和价格优势,需要关注社交媒体营销和客户关系管理。 3. **SWOT分析**:Strengths(优势)、Weaknesses(劣势)、Opportunities(机会)、Threats(威胁)。通过...

Global site tag (gtag.js) - Google Analytics