PHP實現(xiàn)采集抓取淘寶網(wǎng)單個商品信息,本文是一種實現(xiàn)思路,使用file_get_contents函數(shù)實現(xiàn),并給出了采集正則,需要的朋友可以參考下
成都創(chuàng)新互聯(lián)服務項目包括霞浦網(wǎng)站建設、霞浦網(wǎng)站制作、霞浦網(wǎng)頁制作以及霞浦網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,霞浦網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到霞浦省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
調(diào)用淘寶的數(shù)據(jù)可以使用淘寶提供的api,如果只需調(diào)用淘寶商品圖片名稱等公開信息在自己網(wǎng)站上,使用php中的 file_get_contents 函數(shù)實現(xiàn)即可。
思路:
file_get_contents(url) 該函數(shù)根據(jù) url 如 將該網(wǎng)頁內(nèi)容(源碼)以字符串形式輸出(一個整字符串),然后配合preg_match,preg_replace等這些正則表達式操作就可以實現(xiàn)獲取該url特定div,img等信息了。當然前題是淘寶在單個商品頁面的結(jié)構(gòu)是固定的,如500圖的img中id就是J_ImgBooth!
具體實現(xiàn)方法:(獲取500圖,名稱,價格,屬性及商品描述)
復制代碼 代碼如下:
$text=file_get_contents(""); //將url地址上頁面內(nèi)容保存進$text
A.獲取500圖:
復制代碼 代碼如下:
preg_match('/img[^]*id="J_ImgBooth"[^r]*rc=\"([^"]*)\"[^]*/', $text, $img);
//運用正則抓取img標簽中id為J_ImgBooth的img,$img[0]為該500圖img標簽,$img[1]為500圖的圖片地址;
B. 獲取名稱:
復制代碼 代碼如下:
preg_match('/title([^]*)\/title/', $text, $title);
//因為正文中的商品名稱標簽沒有特殊class或id正則不好抓取,就抓title標簽中的內(nèi)容了,一般來說title中內(nèi)容就是商品名稱了(實際有些出入),$title[0]整個title標簽 $title[1]標簽中內(nèi)容;
$title=iconv('GBK','UTF-8',$title);
//如果你的網(wǎng)站是utf8編碼,那么需要進行一下轉(zhuǎn)碼(淘寶是gbk編碼)
C.獲取價格:
復制代碼 代碼如下:
preg_match('/([a-z]+)[^i]*id=\"J_StrPrice\"[^]*([^]*)\/\\1/is', $text, $price);
//同理獲取id為J_StrPrice的標簽內(nèi)容$price[2], $price[0]是整個標簽, $price[1]為strong標簽名;
$price=floatval($price);//放入數(shù)據(jù)庫估計還有轉(zhuǎn)一下變量類型
D.獲取屬性:
這之前獲取的內(nèi)容都是在單標簽中相對只需一個正則就可搞定,然而如果要獲取如
復制代碼 代碼如下:
…
div id=”xxx”
…
ul
…
/ul
div…
div…
/div
/div
/div
…
這樣特定div中有未知n個標簽,獲取該特定div將會非常的困難,搜了下網(wǎng)上,最接近的也只是”/([a-z]+)[^]*([^]|(?R))*\/\\1/”這樣使用遞歸抓取標簽對,但是他不能抓特定標簽,所以想要輕松抓取class=”attributes”的div我是沒法辦到了。但是淘寶網(wǎng)頁有其特殊性,就是它的各個標簽結(jié)構(gòu)基本是固定的…div…/div標簽后面不是/divdiv id=”description”就是/divdiv,所以我們可以采用變通法達到獲取屬性標簽內(nèi)容的目的。
復制代碼 代碼如下:
preg_match('/(div)[^c]*class=\"attributes\"[^]*.*\/\\1/is', $text, $text0);
//這個正則會抓取div開始到整個頁面最后一個/div標簽,當然我們屬性標簽就在這個的前面部分。
$text1=preg_replace("/\/div[^]*(div)[^c]*id=\"description\"[^]*.*\/\\1/is","",$text0);
//匹配到/div div id=”description”至最后/div然后用””代替(就是把匹配的刪除了),所以如果attributes的div后面緊跟的是description那么我們已經(jīng)達到目的了。
$attributes=preg_replace("/\/div[^]*(div)[^c]*class=\"box J_TBox\"[^]*.*\/\\1/is","",$text1);
//如果attributes后面緊跟box J_Tbox標簽,那么我們還需要使用以上這步來剔除box J_Tbox標簽,當然如果attributes的div后面緊跟的是description,這一步將不會匹配到任何即什么都不會做。
E.獲取描述:
通過上面方法你肯定覺得淘寶頁面上任何標簽都可以很簡單獲取了吧(我之前也是這么想的),但是使用這個方法獲取描述時得到的內(nèi)容將會是“描述加載中”,是的,這個描述內(nèi)容不是在源碼中的,它是打開頁面加載進一大堆js后,不知道從淘寶的哪個角落中加載進來的。
好吧,那么我們也可以模仿它放一些js進去。不知道哪些對加載描述有用?沒事,全加載進來肯定沒錯。不知道需要放那些特定div上去有作用?抓一個源碼,刪掉一些div一步步試試看,你會發(fā)現(xiàn)“div id=”detail” /div
復制代碼 代碼如下:
div id="description"
div id="J_DivItemDesc"描述加載中/div
/div
這幾個div是加載描述所必須的,那么下面就是寫代碼了:
復制代碼 代碼如下:
preg_match_all('/script[^]*[^]*\/script/is', $text, $content);//頁面js腳本
$content=$content[0];
$description='div id="detail" /div
div id="description"
div id="J_DivItemDesc"描述加載中/div
/div';
foreach ($content as $v){$description.=iconv('GBK','UTF-8',$v);};
//將這個$description放進頁面,描述就會自動的加載進來了,當然多個商品描述在同一個頁面也會只有一個描述會被加載的。
我只采集過天貓的數(shù)據(jù),估計淘寶也不難吧,簡單的思路就是下載html,正則鏈接,打開鏈接,爬數(shù)據(jù),不過php是單線程的,速度慢。
1、通過淘寶提供的標準api獲取數(shù)據(jù)
2、通過淘寶的開發(fā)者身份創(chuàng)建應用獲取數(shù)據(jù)
3、通過抓取網(wǎng)頁的功能再提取自已需要的數(shù)據(jù)。
//?==UserScript==
//?@name?????????JD
//?@namespace????
//?@version??????0.1
//?@description??try?to?take?over?the?world!
//?@author???????You
//?@match????????*
//?@grant????????none
//?==/UserScript==
/*?jshint?-W097?*/
'use?strict';
//?Your?code?here...
var?divObj=document.createElement("input");?
divObj.type="button";
divObj.value='獲取抓取內(nèi)容';?
divObj.style.marginTop="20px";
divObj.style.marginBottom="20px";
divObj.style.marginLeft="50px";
var?first=document.body.firstChild;
document.body.insertBefore(divObj,first);
var?result={};
divObj.onclick=function(){
//獲取價格
if(document.getElementById("jd-price")){
var?priceDiv=document.getElementById("jd-price");
var?price?=?priceDiv.innerText;
price?=?price.substr(1);
}else?if(document.getElementById("price")){
var?pricePri=document.getElementById("price");
var?priceDiv=pricePri.firstElementChild;
var?price?=?priceDiv.innerText;
}else?if(document.getElementsByClassName("price")[0]){
var?priceClass=document.getElementsByClassName("price");
var?priceDiv=priceClass[0];
var?price?=?priceDiv.innerText;
}
result.price=price;
}
直接用Curl就行,具體爬取的數(shù)據(jù)可以穿參查看結(jié)果,方法不區(qū)分淘寶和天貓鏈接,但是前提是必須是PC端鏈接,另外正則寫的不規(guī)范,所以可以自己重寫正則來匹配數(shù)據(jù)。