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中路径问题的解决方案
Oct 09 PHP
打造计数器DIY三步曲(中)
Oct 09 PHP
数据库的日期格式转换
Oct 09 PHP
php计算十二星座的函数代码
Aug 21 PHP
php统计时间和内存使用情况示例分享
Mar 13 PHP
CI框架开发新浪微博登录接口源码完整版
May 28 PHP
php多任务程序实例解析
Jul 19 PHP
destoon切换城市后实现logo旁边显示地区名称的方法
Aug 21 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
WordPress中用于检索模版的相关PHP函数使用解析
Dec 15 PHP
php设计模式之装饰模式应用案例详解
Jun 17 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
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
Yii中render和renderPartial的区别
2014/09/03 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
laravel数据库查询结果自动转数组修改实例
2021/02/27 PHP
javascript实现上传图片前的预览(TX的面试题)
2007/08/20 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(上:事件篇)
2010/03/24 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
详解关于vue2.0工程发布上线操作步骤
2018/09/27 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
python获取文件扩展名的方法
2015/07/06 Python
python 写的一个爬虫程序源码
2016/02/28 Python
python 利用栈和队列模拟递归的过程
2018/05/29 Python
Python实现查找二叉搜索树第k大的节点功能示例
2019/01/24 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
python3.6编写的单元测试示例
2019/08/17 Python
常用的10个Python实用小技巧
2020/08/10 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
机电一体化毕业生求职信
2013/11/02 职场文书
餐厅采购员岗位职责
2014/03/06 职场文书
二年级小学生评语
2014/04/21 职场文书
本科毕业生自荐信
2014/05/26 职场文书
电话营销开场白
2015/05/29 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis