PHP-电商网站的价格都是图片,如何获得真实价格?

PHP-电商网站的价格都是图片,如何获得真实价格?

虐人心 发布于 2017-09-22 字数 539 浏览 1281 回复 5

目前在做一个购物比价系统,碰到一系列问题,希望看看大家的建议。

在处理电商的页面的时候有个问题,他的价格都是图片,比如
http://www.360buy.com/product/306412.html

价格是
请输入图片描述

  1. 如果不通过这个图片,如何获得商品的真实价格?有的title里有,但是不是所有的都有。
  2. 如果识别图片,有什么比较高效准确的方法?最好php的。

如果你对这篇文章有疑问,欢迎到本站 社区 发帖提问或使用手Q扫描下方二维码加群参与讨论,获取更多帮助。

扫码加入群聊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清晨说ぺ晚安 2017-10-28 5 楼

可以直接调用Google的OCR软件 http://code.google.com/p/tesseract-ocr/

清晨说ぺ晚安 2017-10-22 4 楼

感谢邀请。 其实没有什么技巧,最好的做法就是OCR。

价格图片做OCR很简单,数字的长宽都是固定的,就可以将数字分割开。

然后准备0-9的数字样本,一个一个用像素比较,就可以得出实际的数字了

浮生未歇 2017-10-16 3 楼

当然是切割图片了,很简单的,超级容易,只要事先做好字模,比如说你给的这个图片,第一个是货币符号,长度占据了10PX(假设)切掉,剩下的就是数字,每个数字占据的长度都是10PX,按这个切割成7块,和字模对比,对比更简单了,用二进制的异或运算就搞定。
具体的算法和语言无关,可参考此文http://aiyooyoo.com/index.php/archives/366/
顺便说一句,如果想偷懒的话,网上很多开源的团购导航程序都实现了这个功能,直接抄过来就行。再多的就不说了。

偏爱自由 2017-10-09 2 楼

如果和电商网站有合作关系,他们会提供一套api供使用。比如etao.com的比价就是基于合作的api做的。

至于抓取的形式,不是很方便,而且电商网站本身可能不太情愿你这么做,所以会不定期的修改页面标签,让你的抓取程序失效。

泛泛之交 2017-10-07 1 楼

之前做过一个识别电话号码图片的程序,供参考。

<?php
/**
* 电话号码识别.
* @author by zsc for 2010.03.24
*/
class gjPhone{
protected $imgPath;//图片路径
protected $imgSize;//图片大小
protected $hecData;//分离后数组
protected $horData;//横向整理的数据
protected $verData;//纵向整理的数据
function __construct($path){
$this->imgPath = $path;
}
/**
* 颜色分离转换…
*
* @param unknown_type $path
* @return unknown
*/
public function getHec()
{
$size = getimagesize($this->imgPath);
$res = imagecreatefrompng($this->imgPath);
for($i=0; $i < $size[1]; ++$i)
{
for($j=0; $j < $size[0]; ++$j)
{
$rgb = imagecolorat($res,$j,$i);
$rgbarray = imagecolorsforindex($res, $rgb);
if($rgbarray['red'] < 125 || $rgbarray['green']<125
|| $rgbarray['blue'] < 125)
{
$data[$i][$j]=1;
}else{
$data[$i][$j]=0;
}
}
}
$this->imgSize = $size;
$this->hecData = $data;
}
/**
* 颜色分离后的数据横向整理…
*
* @return unknown
*/
public function magHorData()
{
$data = $this->hecData;
$size = $this->imgSize;
$z = 0;
for($i=0; $i<$size[1]; ++$i)
{
if(in_array(’1′,$data[$i])){
$z++;
for($j=0; $j<$size[0]; ++$j)
{
if($data[$i][$j] == ’1′){
$newdata[$z][$j] = 1;
}else{
$newdata[$z][$j] = 0;
}
}
}
}
return $this->horData = $newdata;
}
/**
* 整理纵向数据…
*
* @return unknown
*/
public function magVerData($newdata){
for ($i=0;$i<132;++$i){
for($j=1;$j<13;++$j){
$ndata[$i][$j] = $newdata[$j][$i];
}
}
$sum = count($ndata);
$c = 0;
for ($a=0;$a<$sum;$a++){
$value = $ndata[$a];
if(in_array(1,$value)){
$ndatas[$c] = $value;
$c++;
}elseif(is_array($ndatas)){
$b = $c-1;
if(in_array(1,$ndatas[$b])){
$ndatas[$c] = $value;
$c++;
}
}
}
return $this->verData = $ndatas;
}
/**
* 显示电话号码…
*
* @return unknown
*/
public function showPhone($ndatas){
$phone = null;
$d = 0;
foreach ($ndatas as $key => $val){
if(in_array(1,$val)){
foreach ($val as $k => $v){
$ndArr[$d].=$v;
}
}
if(!in_array(1,$val)){
$d++;
}
}
foreach ($ndArr as $key01 =>$val01){
$phone .= $this->initData($val01);
}
return $phone;
}
/**
* 分离显示…
*
* @param unknown_type $dataArr
*/
function drawWH($dataArr){
if(is_array($dataArr)){
foreach ($dataArr as $key => $val){
foreach ($val as $k => $v){
if($v == 0){
$c .= “<font color=’#FFFFFF’>”.$v.”</font>”;
}else{
$c .= $v;
}
}
$c .= “<br/>”;
}
}
echo $c;
}
/**
* 初始数据…
*
* @param unknown_type $numStr
* @return unknown
*/
public function initData($numStr){
$result = null;
$data = array(
0=>’000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000′,
1=>’011000000000011000000000111111111111111111111111′,
2=>’001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001′,
3=>’001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100′,
4=>’000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100′,
5=>’111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100′,
6=>’000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100′,
7=>’110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000′,
8=>’000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110′,
9=>’001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000′,
);
foreach ($data as $key => $val){
similar_text($numStr,$val,$pre);
if($pre>95){//相似度95%以上
$result = $key;
break;
}
}
return $result;
}
}
$imgPath = “http://bj.ganji.com/tel/5463013757650d6c5e31093e563c51315b6c5c6c5237.png”;
$gjPhone = new gjPhone($imgPath);
//进行颜色分离
$gjPhone->getHec();
//画出横向数据
$horData = $gjPhone->magHorData();
echo “===============横向数据==============<br/><br/><br/>”;
$gjPhone->drawWH($horData);
// 画出纵向数据
$verData = $gjPhone->magVerData($horData);
echo “<br/><br/><br/>===============纵向数据==============< br/><br/><br/>”;
$gjPhone->drawWH($verData);
// 输出电话
$phone = $gjPhone->showPhone($verData);
echo “<br/><br/><br/>===============电话==============<br /><br/><br/>”.$phone;
?>