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
用PHP和ACCESS写聊天室(七)
Oct 09 PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
Apr 20 PHP
PHP安全配置详细说明
Sep 26 PHP
教你如何使用php session
Oct 28 PHP
php中socket的用法详解
Oct 24 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
屏蔽PHP默认设置中的Notice警告的方法
May 20 PHP
详解PHP中foreach的用法和实例
Oct 25 PHP
php图片合成方法(多张图片合成一张)
Nov 25 PHP
Laravel框架Eloquent ORM修改数据操作示例
Dec 03 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
Sep 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
web目录下不应该存在多余的程序(安全考虑)
2012/05/09 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
php生成RSS订阅的方法
2015/02/13 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
JavaScript替换当前页面的方法
2015/04/03 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
vue组件中的数据传递方法
2018/05/14 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
Vue如何基于es6导入外部js文件
2020/05/15 Javascript
jQuery实时统计输入框字数及限制
2020/06/24 jQuery
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
python结合API实现即时天气信息
2016/01/19 Python
Python中进程和线程的区别详解
2017/10/29 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
django数据模型中null和blank的区别说明
2020/09/02 Python
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
2015年项目工作总结
2015/04/29 职场文书
会计入职心得体会
2016/01/22 职场文书
2021年最新用于图像处理的Python库总结
2021/06/15 Python
js不常见操作运算符总结
2021/11/20 Javascript
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS