3

我想输入一个很长的 url 列表并在源代码中搜索特定的字符串,输出包含该字符串的 url 列表。听起来很简单吧?我想出了下面的代码,输入是一个html表单。您可以在 pelican-cement.com/findfrog 上试用。

它似乎工作了一半,但被多个不同顺序的 url/url 抛弃了。搜索“adsense”,它会正确识别出political1.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>
4

4 回答 4

1

也许你应该打电话

curl_close($ch);

不管它是否在抓取的页面中找到字符串。除此之外,我看不出代码有任何明显错误。

如果它不是代码中的内容,那么它可能在抓取的页面中存在一些差异。也许页面是动态的,并且在后续检查中并不总是包含针词。也许您尝试抓取的页面的服务器返回了错误代码。

于 2011-04-12T22:44:16.657 回答
1

会不会是 URL 周围的回车/空格导致它被抛出?可能值得投入

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

在你的 for 循环开始时。

还:

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

是检查一个字符串是否包含另一个字符串的更有效方法。你也可以在这里使用 stripos 而不是先用 strtolower() 处理整个事情(不确定这是否会改善事情)。

于 2011-04-12T22:46:58.860 回答
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
}
于 2011-04-12T22:45:15.067 回答
1

稍微重新组织了您的代码。罪魁祸首是空白。您需要在使用它之前修剪您的 URL 字符串(即trim($url);)。

其他变化:

  • 将您的搜索词设置在 for 循环之外,因为它永远不会改变。
  • 在循环外设置 curl 对象并通过每次更改 URL 来重用它。
  • 使用 curl_setopt_array() 在一个语句中设置多个 curl 选项。
  • 使用 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>
于 2011-04-12T22:55:14.830 回答