2011-04-12 53 views
3

我想輸入很長的URL列表並搜索源代碼中的特定字符串,輸出包含字符串的URL列表。聽起來很簡單吧?我已經拿出了下面的代碼,輸入是一個html表單。你可以在pelican-cement.com/findfrog上試試。通過許多URL在源代碼中查找字符串的代碼

它似乎工作了一半時間,但是被不同順序的多個網址/網址拋出。搜索「AdSense」的它正確地標識出politics1.com的

cnn.com 
politics1.com 

然而,如果顛倒輸出是空白。我如何獲得可靠,一致的結果?最好是我可以輸入數千個網址的東西?

<html> 
<body> 

<? 
set_time_limit (0); 

$urls=explode("\n", $_POST['url']); 

$allurls=count($urls); 

for ($counter = 0; $counter <= $allurls; $counter++) { 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$urls[$counter]); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET'); 
curl_setopt ($ch, CURLOPT_HEADER, 1); 
curl_exec ($ch); 
$curl_scraped_page=curl_exec($ch); 

$haystack=strtolower($curl_scraped_page); 
$needle=$_POST['proxy']; 
if (strlen(strstr($haystack,$needle))>0) { 

echo $urls[$counter]; 
echo "<br/>"; 
curl_close($ch); 
} 
} 




//$FileNameSQL = "/googleresearch" . abs(rand(0,1000000000000000)) . ".csv"; 
//$query = "SELECT * FROM happyturtle INTO OUTFILE '$FileNameSQL' FIELDS TERMINATED BY ','"; 
//$result = mysql_query($query) or die(mysql_error()); 

//exit; 

echo '$FileNameSQL'; 





?> 

</body> 
</html> 

回答

1

重新組織你的代碼。主要的罪魁禍首是空白。您需要在使用前修剪您的URL字符串(即trim($url);)。

其他變化:

  • 設置您的搜索字詞外的for循環,因爲它永遠不會改變。
  • 在循環外部設置curl對象,並通過每次更改URL來重用它。
  • 使用curl_setopt_array()在一個語句中設置多個捲曲選項。
  • 使用foreach循環,因爲無論如何你都在遍歷整個數組,並且代碼更乾淨。
  • 使用stripos()比strstr()更有效,並且無論如何不區分大小寫。
  • 使用!==比較器來防止隱含的類型轉換(FALSE!== 0,但FALSE == 0)。
  • 檢查返回的$ html字符串,因爲如果失敗,curl_exec()可以返回FALSE。
  • 關閉最後的捲曲對象(即if語句之外)。

下面的代碼可以在my quick mockup上運行。

<html> 
<body> 

<form action="search.php" method="post"> 
    URLs: <br/> 
    <textarea rows="20" cols="50" input type="text" name="url" /></textarea><br/> 

    Search Term: <br/> 
    <textarea rows="20" cols="50" input type="text" name="proxy" /></textarea><br/> 

    <input type="submit" /> 
</form> 

<? 
    if(isset($_POST['url'])) { 
    set_time_limit (0); 

    $urls = explode("\n", $_POST['url']); 
    $term = $_POST['proxy']; 
    $options = array(CURLOPT_FOLLOWLOCATION => 1, 
         CURLOPT_RETURNTRANSFER => 1, 
         CURLOPT_CUSTOMREQUEST => 'GET', 
         CURLOPT_HEADER   => 1, 
        ); 
    $ch = curl_init(); 
    curl_setopt_array($ch, $options); 

    foreach ($urls as $url) { 
     curl_setopt($ch, CURLOPT_URL, trim($url)); 
     $html = curl_exec($ch); 

     if ($html !== FALSE && stristr($html, $term) !== FALSE) { // Found! 
     echo $url; 
     } 
    } 

    curl_close($ch); 
    } 
?> 

</body> 
</html> 
+0

謝謝!現在的問題是,每當輸入超過50個URL時它就會超時。 @James An – user586011 2011-04-13 03:10:53

+0

用PHP在批處理過程中包裝代碼要複雜得多。不需要立即處理表單提交,您需要將搜索詞和所有URL記錄在文件或數據庫中。然後,調用另一個PHP文件,該文件將在超時之前處理,將結果保存到文件或數據庫中,並返回一個HTML文件以顯示進度,並自動(刷新)再次調用批處理PHP文件,直到處理完所有URL 。 – 2011-04-13 11:01:05

1

也許你應該叫

curl_close($ch); 

不管它發現在刮頁面或不是字符串。除此之外,我沒有看到任何明顯的代碼錯誤。

如果它沒有在代碼中的東西,那麼它可能在刮頁面的一些差異。也許這個頁面是動態的,在隨後的檢查中並不總是包含針字。也許您試圖抓取的頁面的服務器返回錯誤代碼。

1

一對夫婦的調整的,不知道他們是否會幫助,但仍

$url_to_go = trim($urls[$counter]); 
if($url_to_go){ 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$url_to_go); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,'GET'); 
curl_setopt ($ch, CURLOPT_HEADER, 1); 
$curl_scraped_page=curl_exec($ch); 
curl_close($ch); 

// more code follows 
} 
1

難道是回車/空格周圍被扔它關閉的網址?在您的for循環開始時,可​​能需要輸入

$urls[$counter] = trim($urls[$counter]); 

另外:

if (strpos($haystack, $needle) !== false) { 
    [...] 
} 

是檢查是否一個字符串包含另一個更有效的方式。你也可以在這裏使用stripos而不是strtolower()首先整個事情(不知道這是否會改善事情)。

相關問題