Код для поиска строк в исходном коде по многим URL - PullRequest
3 голосов
/ 13 апреля 2011

Я хочу ввести очень длинный список URL-адресов и искать конкретные строки в исходном коде, выводя список URL-адресов, которые содержат строку. Звучит достаточно просто, верно? Я придумал нижеприведенный код, который представляет собой HTML-форму. Вы можете попробовать это на pelican-cement.com/findfrog.

Кажется, он работает половину времени, но отбрасывается несколькими URL-адресами в разных порядках. При поиске 'adsense' он правильно идентифицирует policy1.com из

cnn.com
politics1.com

однако, если инвертировано, вывод будет пустым. Как я могу получить надежные, последовательные результаты? желательно что-то, что я мог бы ввести тысячи URL-адресов?

<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>

Ответы [ 4 ]

1 голос
/ 13 апреля 2011

Реорганизовал ваш код немного.Основным виновником были пробелы.Вам необходимо обрезать строку URL-адреса перед ее использованием (т. Е. trim($url);).

Другие изменения:

  • Установите критерий поиска вне цикла for, поскольку он никогда не изменяется.
  • Установите объект curl вне цикла и повторно используйте его, просто каждый раз меняя URL.
  • Используйте curl_setopt_array (), чтобы установить несколько параметров curl в одном операторе.
  • Используйте aцикл foreach, поскольку вы все равно выполняете итерацию по всему массиву, а код становится чище.
  • Использование stripos () более эффективно, чем strstr (), и в любом случае не учитывает регистр.
  • Использованиекомпаратор! == для предотвращения неявного приведения типов (FALSE! == 0, но FALSE == 0).
  • Проверьте возвращенную строку $ html, так как curl_exec () может вернуть FALSE в случае сбоя.
  • Закройте объект curl в конце (т. Е. Вне оператора if).

Приведенный ниже код можно запустить на моем быстром макете .

<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>
1 голос
/ 13 апреля 2011

Несколько твиков, не уверен, что они помогут, но все же

$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 голос
/ 13 апреля 2011

Может ли быть возврат каретки / пробел вокруг URL, который его отбрасывает? Возможно, стоит положить в

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

в начале цикла for.

Также:

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

- более эффективный способ проверки, содержит ли одна строка другую. Здесь вы также можете использовать стрипы вместо strtolower (), прежде всего целиком (не уверен, что это улучшит ситуацию).

1 голос
/ 13 апреля 2011

Возможно, вам следует позвонить

curl_close($ch);

Независимо от того, находит ли она строку на очищенной странице или нет. Кроме того, я не вижу ничего явно неправильного в коде.

Если это не что-то в коде, то, вероятно, какая-то разница в очищенной странице. Возможно, страница динамическая и не всегда содержит слово «стрелка» при последующих проверках. Возможно, сервер страницы, которую вы пытались очистить, вернул код ошибки.

...