《為什么采集會(huì)403和301、302失敗?使用php的curl采集2個(gè)重要參數(shù)》要點(diǎn):
本文介紹了為什么采集會(huì)403和301、302失敗?使用php的curl采集2個(gè)重要參數(shù),希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
相關(guān)主題:PHP開(kāi)發(fā)
為什么采集會(huì)失敗?
很多CMS或采集類程序,在使用curl采集時(shí),都忽略了兩個(gè)重要的參數(shù),而這兩個(gè)是否使用,直接決定了您在采集一些大站點(diǎn)時(shí),能不能成功。
主要是圖片采集,一般的網(wǎng)站采集時(shí)是沒(méi)有問(wèn)題的,很容易采到。但大站通常會(huì)有這3種情況:
1、403拒絕:
有些大站,采集它就會(huì)有這種現(xiàn)象。一般是判斷來(lái)源referer值,而普通的來(lái)源地址,照樣被拒絕。解決辦法有兩種場(chǎng)景常見(jiàn):
A、需要使用一些baidu等大站源做referer才能被允許。
這樣就必須設(shè)置CURLOPT_REFERER,備選參數(shù)CURLOPT_USERAGENT最好也一起設(shè)置了。
B、必須使用其頂級(jí)站點(diǎn)做referer:
在一些較大站點(diǎn),圖片可能會(huì)放在獨(dú)立的域名服務(wù)器下,比如 http://img.vephp.com/ 或者很多站點(diǎn)也會(huì)放在七牛等存儲(chǔ)云上。這樣的站點(diǎn)有時(shí)會(huì)檢查referer,因此會(huì)采集失敗。
這時(shí)需要判斷其頂級(jí)域名。把referer設(shè)置成其頂級(jí)域名即可。
維易PHP有專用函數(shù),可以取得頂級(jí)域名,整合到采集類中即可,如下,$url是一個(gè)采集的圖片URL:
$urlInfo =parse_url($url); if( !empty($urlInfo['host']) ) { $topDomain = getTopDomain ( $urlInfo['host'] ) ; if(!empty($topDomain)) $this->referer = $urlInfo['scheme'].'://'.$topDomain; }
2、301和302跳轉(zhuǎn):
這個(gè)也是在另一個(gè)大網(wǎng)站上遇到,它的圖片301跳轉(zhuǎn)或302跳轉(zhuǎn)到另一個(gè)地方,這時(shí)就要curl跟進(jìn)跳轉(zhuǎn)后的地址。對(duì)應(yīng)的選項(xiàng)是
CURLOPT_FOLLOWLOCATION
因此這兩個(gè)參數(shù)必須設(shè)置:
curl_setopt ($ch,CURLOPT_REFERER,$referer); //很重要, curl_setopt($ch, CURLOPT_USERAGENT, $http_user_agent); //不是太重要,可以隨便寫蜘蛛user agent curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); //很重要,否則有的301跳轉(zhuǎn)到真實(shí)頁(yè),就抓不到。
其它還有一些受拒,比如 沒(méi)有cookies、token,但以上是主要的。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/32.html