php爬取天猫和淘宝商品数据


Posted in PHP onFebruary 23, 2018

一、思路

最近做了一个网站用到了从网址爬取天猫和淘宝的商品信息,首先看了下手机端的网页发现用的react,不太了解没法搞,所以就考虑从PC入口爬取数据,但是当爬取URL获取数据时并没有获取价格,库存等的信息,仔细研究了下发现是异步请求了另一个接口,但是接口要使用refer才能获取数据,于是就通过以下方式写了一个简单的爬虫,用于爬取商品预览图和商品的第一个分类的价格、库存等。

二、实现

代码如下:

function crawlUrl($url){
import('PhpQuery.Curl');
 $curl=new \Curl();
 $result = $curl->read($url);
 $content = mb_convert_encoding( $result['content'], 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' );
 $myres=array();
 if(strrpos($url,'taobao.com')!=false) {
  //匹配是否下架
  if(strpos($content,'此宝贝已下架')!==false){
   return false;
  }
  preg_match("|itemId   : '(.*)'|isU", $content, $match);
  $item_id=$match[1];
  preg_match("|sellerId   : '(.*)'|isU", $content, $match);
  $sellet_id=$match[1];
  preg_match("|<title>(.*)</title>|isU",$content,$match);
  $title=$match[1];
  //价格库存信息
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, 'https://detailskip.taobao.com/service/getData/1/p1/item/detail/sib.htm?itemId='.$item_id.'&sellerId='.$sellet_id.'&modules=dynStock,qrcode,viewer,price,duty,xmpPromotion,delivery,upp,activity,fqg,zjys,amountRestriction,couponActivity,soldQuantity,originalPrice,tradeContract&callback=onSibRequestSuccess');
  $opt[CURLOPT_HEADER]=false;
  $opt[CURLOPT_CONNECTTIMEOUT]=15;
  $opt[CURLOPT_TIMEOUT]=300;
  $opt[CURLOPT_AUTOREFERER]=true;
  $opt[CURLOPT_USERAGENT]='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
  curl_setopt_array($ch,$opt);
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch,CURLOPT_REFERER,$url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  $out_put=curl_exec ($ch);
  curl_close ($ch);
  $res=str_replace('onSibRequestSuccess(',"",$out_put);
  $res=rtrim($res,');1');
  $result=json_decode($res,true);
  //查询出图片信息
  preg_match('|<ul id="J_UlThumb" class="tb-thumb tb-clearfix">(.*)</ul>|isU', $content, $match);
  preg_match_all('/<img data-src="(.*?)" \//', $match[1], $images);

  $myres['title']=str_replace('-淘宝网','',$title);

  $myres['price']=current($result['data']['originalPrice']);

  $myres['act_price']=current($result['data']['promotion']['promoData']);

  $myres['stock']=$result['data']['dynStock']['stock'];

  $myres['banners']=$images[1];
 }else{
  //匹配是否下架
  if(strpos($content,'此宝贝已下架')!==false){
   return false;
  }
  $start=strpos($url,'&id=');
  $item_id=substr($url,$start+4,12);
  if(!is_numeric($item_id)){
   $start=strpos($url,'?id=');
   $end=strpos($url,'&spm');
   $item_id=substr($url,$start+4,$end-$start-4);
  }
  preg_match("|<title>(.*)</title>|isU",$content,$match);
  $title=$match[1];
  $myurl='https://mdskip.taobao.com/core/initItemDetail.htm?cachedTimestamp=1500562177777&queryMemberRight=true&cartEnable=true&offlineShop=false&addressLevel=2&itemId='.$item_id.'&tryBeforeBuy=false&isAreaSell=false&tmallBuySupport=true&isPurchaseMallPage=false&household=false&isForbidBuyItem=false&service3C=false&isRegionLevel=false&showShopProm=false&isSecKill=false&sellerPreview=false&isUseInventoryCenter=false&isApparel=true&callback=setMdskip×tamp=1500562172109&isg=AiUlDZFWmP/sMgVurQSILU3Ytet/Zdis&isg2=Ajk51JIhRFqKzxmiNPP6dkYxSKXT7iySkzSTeVtu9WDf4ll0o5Y9yKdyEtHu';
  //价格库存信息
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, $myurl);
  $opt[CURLOPT_HEADER]=false;
  $opt[CURLOPT_CONNECTTIMEOUT]=15;
  $opt[CURLOPT_TIMEOUT]=300;
  $opt[CURLOPT_AUTOREFERER]=true;
  $opt[CURLOPT_USERAGENT]='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11';
  curl_setopt_array($ch,$opt);
  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt ($ch,CURLOPT_REFERER,$url);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  $out_put=curl_exec ($ch);
  curl_close ($ch);
  $res = mb_convert_encoding( $out_put, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5' );
  $res=str_replace('setMdskip',"",$res);
  $res=str_replace('(',"",$res);
  $res=str_replace(')',"",$res);
  $result=json_decode($res,true);
  $nowk="";
  $nowstore="";
  foreach($result['defaultModel']['inventoryDO']['skuQuantity'] as $k=>$val){
   $nowk=$k;
   $nowstore=$val;
   break;
  }

  $myres['title']=str_replace('-tmall.com天猫','',$title);

  $myres['price']=$result['defaultModel']['itemPriceResultDO']['priceInfo'][$nowk]['price'];

  $myres['act_price']=isset($result['defaultModel']['itemPriceResultDO']['priceInfo'][$nowk]['suggestivePromotionList'])?$result['defaultModel']['itemPriceResultDO']['priceInfo'][$nowk]['suggestivePromotionList']:$result['defaultModel']['itemPriceResultDO']['priceInfo'][$nowk];

  $myres['stock']=$result['defaultModel']['inventoryDO']['totalQuantity']?$result['defaultModel']['inventoryDO']['totalQuantity']:$nowstore['quantity'];
  //查询出图片信息
  preg_match('|<ul id="J_UlThumb" class="tb-thumb tm-clear">(.*)</ul>|isU',$content, $match);
  preg_match_all('/<img src="(.*?)" \//',$match[1],$images);
  $myres['banners']=$images[1];
 }
 return $myres;
}

上述代码用到phpquery的库,但是其实没啥用,直接用Curl就行,具体爬取的数据可以穿参查看结果,方法不区分淘宝和天猫链接,但是前提是必须是PC端链接,另外正则写的不规范,所以可以自己重写正则来匹配数据。

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
php 数组二分法查找函数代码
Feb 16 PHP
简单的php写入数据库类代码分享
Jul 26 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
PHP curl 并发最佳实践代码分享
Sep 05 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php使用get_class_methods()函数获取分类的方法
Jul 20 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
通过PHP实现获取访问用户IP
May 09 PHP
Laravel如何使用Redis共享Session
Feb 23 #PHP
Laravel 实现密码重置功能
Feb 23 #PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
Feb 23 #PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 #PHP
php 广告点击统计代码(php+mysql)
Feb 21 #PHP
详细解读php的命名空间(二)
Feb 21 #PHP
详细解读php的命名空间(一)
Feb 21 #PHP
You might like
漫威DC御用漫画家去世 他的表情包曾走红网络
2020/04/09 欧美动漫
PHP cron中的批处理
2008/09/16 PHP
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
ThinkPHP中自定义目录结构的设置方法
2014/08/15 PHP
纯php生成随机密码
2015/10/30 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
关于php开启错误提示的总结
2019/09/24 PHP
基于jquery的点击链接插入链接内容的代码
2012/07/31 Javascript
js判断当页面无法回退时关闭网页否则就history.go(-1)
2014/08/07 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
自定义vue组件发布到npm的方法
2018/05/09 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
解决layer.open后laydate失效的问题
2019/09/06 Javascript
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
python-序列解包(对可迭代元素的快速取值方法)
2019/08/24 Python
Python之——生成动态路由轨迹图的实例
2019/11/22 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
一个入门级python爬虫教程详解
2021/01/27 Python
利用Python批量识别电子账单数据的方法
2021/02/08 Python
DBA数据库管理员JAVA程序员架构师必看
2016/02/07 面试题
会计与审计毕业生自荐信范文
2013/12/30 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
玄武湖导游词
2015/02/05 职场文书
英语辞职信怎么写
2015/02/28 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
新年寄语2016
2015/08/17 职场文书
JVM钩子函数的使用场景详解
2021/08/23 Java/Android
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis