这篇文章主要介绍了php如何爬取天猫和淘宝商品数据,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
一、思路
最近做了一个网站用到了从网址爬取天猫和淘宝的商品信息,首先看了下手机端的网页发现用的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, '/tupian/20230522/sib.htm
$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='/tupian/20230522/initItemDetail.htm
//价格库存信息
$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端链接,另外正则写的不规范,所以可以自己重写正则来匹配数据。
封装后的接口名称:item_get
名称 | 类型 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
item | item[] | 1 | 宝贝详情数据 | |
num_iid | Bigint | 1 | 520813250866 | 宝贝ID |
title | String | 1 | 三刃木折叠刀过安检创意迷你钥匙扣钥匙刀军刀随身多功能小刀包邮 | 宝贝标题 |
desc_short | String | 0 | 商品简介 | |
promotion_price | Int | 0 | 优惠价 | |
price | Float | 1 | 25.8 | 价格 |
total_price | Float | 0 | 0 | |
suggestive_price | Float | 0 | 0 | |
orginal_price | String | 0 | 25.80 | 原价 |
nick | String | 0 | 欢乐购客栈 | 掌柜昵称 |
num | Int | 0 | 3836 | 库存 |
min_num | Int | 0 | 0 | 最小购买数 |
detail_url | String | 0 | http://item.taobao.com/item.htm?id=520813250866 | 宝贝链接 |
pic_url | String | 1 | //gd2.alicdn.com/imgextra/i4/2596264565/TB2p30elFXXXXXQXpXXXXXXXXXX_!!2596264565.jpg | 宝贝图片 |
brand | String | 0 | 三刃木 | 品牌名称 |
brandId | Int | 0 | 8879363 | 品牌ID |
rootCatId | Int | 0 | 50013886 | 顶级分类ID |
cid | Int | 1 | 50014822 | |
crumbs | Mix | 0 | [] | 导航菜单 |
created_time | String | 0 | ||
modified_time | String | 0 | ||
delist_time | String | 0 | ||
desc | String | 0 | 商品详情 | |
desc_img | Mix | 0 | [] | 商品详情图片 |
item_imgs | Mix | 0 | item_imgs[] | 商品图片 |
item_weight | String | 0 | ||
item_size | String | 0 | ||
location | String | 0 | 发货地 | |
express_fee | Float | 0 | 0.00 | 快递费用 |
ems_fee | Float | 0 | EMS费用 | |
post_fee | Float | 0 | 物流费用 | |
shipping_to | String | 0 | 发货至 | |
has_discount | Boolean | 0 | false | 是否有优惠 |
video | video[] | 0 | 商品视频 | |
is_virtual | String | 0 | ||
is_promotion | Boolean | 0 | false | 是否促销 |
props_name | String | 0 | 1627207:1347647754:颜色分类:长方形带开瓶器+送工具刀卡+链子;1627207:1347647753:颜色分类:椭圆形带开瓶器+送工具刀卡+链子; | 商品属性名。格式为pid1:vid1:name1:value1;pid1:vid2:name2:value2。 |
prop_imgs | prop_imgs[] | 0 | 商品属性图片列表 | |
property_alias | String | 0 | 20509:9974422:36;1627207:28326:红色;20509:9975710:38;1627207:28326:红色;20509:9981357:40;1627207:28326:红色 | 销售属性值别名。格式为pid1:vid1:alias1;pid1:vid2:alia2。 |
props | Mix | 0 | [{ "name": "产地","value": "中国" }] | 商品属性 |
total_sold | Int | 0 | ||
skus | skus[] | 0 | 商品规格信息列表 | |
seller_id | Int | 0 | 2844096782 | 卖家ID |
sales | Int | 0 | 138 | 销量 |
shop_id | Int | 0 | 151372205 | 店铺ID |
props_list | Mix | 0 | {20509:9974422: 尺码:36} | 商品属性 |
seller_info | seller_info[] | 1 | 卖家信息 | |
tmall | Boolean | 0 | false | 是否天猫 |
error | String | 0 | 错误信息 | |
warning | String | 0 | 警告信息 | |
url_log | Mix | 0 | [] | |
favcount | Int | 0 | 0 | |
fanscount | Int | 0 | 0 | |
method | String | 0 | item_tmall:pget_item | |
promo_type | String | 0 | ||
props_img | Mix | 0 | 1627207:28326": "//img.alicdn.com/imgextra/i2/2844096782/O1CN01VrjpXt1zyCc9DvERE_!!2844096782.jpg | 属性图片 |
shop_item | Mix | 0 | [] | |
relate_items | Mix | 0 | [] |