1
A
回答
0
好的,我重新編寫了我的答案,只提取了我的搜索引擎優化助手的相關部分(我的以前的版本有其他的東西,如Alexa排名,谷歌索引,雅虎鏈接等,如果你正在尋找,只是請查看這個答案的舊版本!)
請注意,有些網頁沒有PAGERANK,而且我也不是意思是ZERO。沒有。這可能是因爲該頁面非常不重要(甚至比PR 0更重要),或者只是如此新,但可能非常重要。 這與我班的PR 0相同!
這有一些優點和一些缺點。如果可能的話,你應該在你的邏輯中單獨處理它,但這並不總是可能的,所以0是下一個最好的方法。
此外:
該代碼被反向engeneered和不利用某種API的具有任何形式的SLA或任何的。 因此,它可能會停止工作任何時間!
並請不要讓洪水GOOGLE!
我做了測試。如果您只有很短的睡眠時間,Google會在1000次請求後阻止您(相當長時間!)。隨着1.5到2秒的隨機睡眠,它看起來很好。
我曾經爲70k頁抓取過PageRank。只有一次,因爲我只是需要它。我從幾個IP每天只做5k,現在我有數據,它不會過時,因爲這些頁面已經存在了幾十年。
IMO完全可以一次檢查一次pagerank甚至一次,但不要錯過使用此代碼或谷歌可能鎖定我們所有在一起!
<?php
/*
* @author Joe Hopfgartner <[email protected]>
*/
class Helper_Seo
{
protected function _pageRankStrToNum($Str,$Check,$Magic) {
$Int32Unit=4294967296;
// 2^32
$length=strlen($Str);
for($i=0;$i<$length;$i++) {
$Check*=$Magic;
//If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
// the result of converting to integer is undefined
if($Check>=$Int32Unit) {
$Check=($Check-$Int32Unit*(int)($Check/$Int32Unit));
//if the check less than -2^31
$Check=($Check<-2147483648)?($Check+$Int32Unit):$Check;
}
$Check+=ord($Str {
$i
});
}
return $Check;
}
/*
* Genearate a hash for a url
*/
protected function _pageRankHashURL($String) {
$Check1=self::_pageRankStrToNum($String,0x1505,0x21);
$Check2=self::_pageRankStrToNum($String,0,0x1003F);
$Check1>>=2;
$Check1=(($Check1>>4)&0x3FFFFC0)|($Check1&0x3F);
$Check1=(($Check1>>4)&0x3FFC00)|($Check1&0x3FF);
$Check1=(($Check1>>4)&0x3C000)|($Check1&0x3FFF);
$T1=(((($Check1&0x3C0)<<4)|($Check1&0x3C))<<2)|($Check2&0xF0F);
$T2=(((($Check1&0xFFFFC000)<<4)|($Check1&0x3C00))<<0xA)|($Check2&0xF0F0000);
return($T1|$T2);
}
/*
* genearate a checksum for the hash string
*/
protected function CheckHash($Hashnum) {
$CheckByte=0;
$Flag=0;
$HashStr=sprintf('%u',$Hashnum);
$length=strlen($HashStr);
for($i=$length-1;$i>=0;$i--) {
$Re=$HashStr {
$i
};
if(1===($Flag%2)) {
$Re+=$Re;
$Re=(int)($Re/10)+($Re%10);
}
$CheckByte+=$Re;
$Flag++;
}
$CheckByte%=10;
if(0!==$CheckByte) {
$CheckByte=10-$CheckByte;
if(1===($Flag%2)) {
if(1===($CheckByte%2)) {
$CheckByte+=9;
}
$CheckByte>>=1;
}
}
return '7'.$CheckByte.$HashStr;
}
public static function getPageRank($url) {
$fp=fsockopen("toolbarqueries.google.com",80,$errno,$errstr,30);
if(!$fp) {
trigger_error("$errstr ($errno)<br />\n");
return false;
}
else {
$out="GET /search?client=navclient-auto&ch=".self::CheckHash(self::_pageRankHashURL($url))."&features=Rank&q=info:".$url."&num=100&filter=0 HTTP/1.1\r\n";
$out.="Host: toolbarqueries.google.com\r\n";
$out.="User-Agent: Mozilla/4.0 (compatible; GoogleToolbar 2.0.114-big; Windows XP 5.1)\r\n";
$out.="Connection: Close\r\n\r\n";
fwrite($fp,$out);
#echo " U: http://toolbarqueries.google.com/search?client=navclient-auto&ch=".$this->CheckHash($this->_pageRankHashURL($url))."&features=Rank&q=info:".$url."&num=100&filter=0";
#echo "\n";
//$pagerank = substr(fgets($fp, 128), 4);
//echo $pagerank;
#echo "DATA:\n\n";
$responseOK = false;
$response = "";
$inhead = true;
$body = "";
while(!feof($fp)) {
$data=fgets($fp,128);
if($data == "\r\n" && $inhead) {
$inhead = false;
} else {
if(!$inhead) {
$body.= $data;
}
}
//if($data == '\r\n\r\n')
$response .= $data;
if(trim($data) == 'HTTP/1.1 200 OK') {
$responseOK = true;
}
#echo "D ".$data;
$pos=strpos($data,"Rank_");
if($pos===false) {
}
else {
$pagerank=trim(substr($data,$pos+9));
if($pagerank === '0') {
fclose($fp);
return 0;
} else if(intval($pagerank) === 0) {
throw new Exception('couldnt get pagerank from string: '.$pagerank);
//trigger_error('couldnt get pagerank from string: '.$pagerank);
fclose($fp);
return false;
} else {
fclose($fp);
return intval($pagerank);
}
}
}
fclose($fp);
//var_dump($body);
if($responseOK && $body=='') {
return 0;
}
//return 0;
throw new Exception('couldnt get pagerank, unknown error. probably google flood block. my tests showed that 1req/sec is okay! i recommend a random sleep between 1.5 and 2 secs. no sleep breaks at ~1000 reqs.');
//trigger_error('couldnt get pagerank, unknown error. probably google flood block.');
return false;
}
}
}
$url = "http://www.2xfun.de/";
$pagerank = Helper_Seo::getPagerank($url);
var_dump($pagerank);
?>
相關問題
- 1. 執行PHP腳本時顯示結果
- 2. php腳本正在顯示weired結果
- 3. 我的php腳本顯示刪除結果,但phpmyadmin顯示結果仍然
- 4. 搜索結果顯示,像谷歌的PHP
- 5. 獲取列顯示月份名稱谷歌應用腳本
- 6. 在編輯文本中顯示谷歌搜索結果 - WebView
- 7. 谷歌的網頁排名給出不同的結果
- 8. 谷歌地圖API的距離意外的結果V3排名
- 9. 顯示結果PHP
- 10. 顯示PHP結果
- 11. 結合multy陣列並排谷歌腳本
- 12. 谷歌播放排行榜不顯示
- 13. 谷歌圖表表 - 顯示並排
- 14. PHP - 迭代谷歌搜索結果
- 15. PHP結果和谷歌地圖
- 16. 獲得谷歌的搜索結果,PHP
- 17. 刮谷歌頭版結果與PHP
- 18. 需要讓PHP腳本在同一頁面上顯示結果
- 19. 使用jquery顯示一個php腳本結果在一個div
- 20. 在wordpress header中顯示php腳本的結果
- 21. 如何顯示結果,而PHP腳本仍在運行
- 22. PHP搜索結果突出顯示腳本
- 23. 如何在客戶端顯示php腳本的結果(html)
- 24. 用於顯示目錄列表結果的php腳本
- 25. C execl執行PHP腳本不在STDOUT中顯示結果
- 26. Wolfram Alpha的PHP API腳本不顯示公式結果
- 27. 谷歌腳本IMPORTRANGE
- 28. /谷歌Apps腳本
- 29. 在谷歌腳本
- 30. HTML腳本谷歌
您是指PageRank(PR)還是結果中列表的實際位置? – 2010-08-28 04:07:45
你應該閱讀http://stackoverflow.com/faq#howtoask並考慮標記一些你的問題的答案***接受**並使用**投票**投票了所有答案,這對你有幫助。 – Oleg 2010-08-28 10:36:46
@ Oleg:大部分問題都沒有給我想要的答案。我應該把它標記爲無益嗎? @Cody Snider:我正在嘗試0到10之間的實際pagerang(PR)數字 – Smith 2010-08-28 12:18:20