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中使用explode查找某个字符是否存在的方法
Jul 12 PHP
解析用PHP实现var_export的详细介绍
Jun 20 PHP
php中的比较运算符详解
Oct 28 PHP
PHP常用正则表达式集锦
Aug 17 PHP
linux中cd命令使用详解
Jan 08 PHP
详细解读PHP的Yii框架中登陆功能的实现
Aug 21 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHP实现163邮箱自动发送邮件
Mar 29 PHP
PHP实现原生态图片上传封装类方法
Nov 08 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
在Ubuntu 18.04上安装PHP 7.3 7.2和7.0的方法
Apr 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
PHP base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
2021/02/22 PHP
各种效果的jquery ui(接口)介绍
2008/09/17 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
JS常用加密编码与算法实例总结
2016/12/22 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
2017/06/01 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
python中__call__方法示例分析
2014/10/11 Python
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
Python中random模块用法实例分析
2015/05/19 Python
Python装饰器用法实例总结
2018/02/07 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python创造虚拟环境方法总结
2019/03/04 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
python实现用户名密码校验
2020/03/18 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
环境工程毕业生自荐信
2013/11/17 职场文书
校车安全责任书
2014/08/25 职场文书
技术员岗位职责
2015/02/04 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书