0

有几个我从浏览器运行的自定义 PHP 脚本,这些脚本将抓取任何给定的 URL,并以浏览器中的表格或 Excel 文件的形式返回数据。( 可选的)

问题是每当我在脚本中添加超过 3 个 URL 时,我都会遇到网络连接错误( Connection reset by peer )可能是由多种原因引起的。然后,如果数据由表返回,则结果将被截断,如果通过 Excel 文件,下载文件将在某个点停止“网络错误”

我在我的本地机器( XAMPP )上运行脚本,并且我已经在几个实时服务器上测试了这些脚本并且发生了同样的问题,但是,我注意到在实时服务器上连接会持续更长时间。我收到了来自托管服务提供商的警告,该脚本不应该再在他们的服务器上运行,因为它使用了大量内存(+1GB RAM)并且正在减慢他们的速度。我假设我将在我的本地主机上恢复测试。

问题 :

  1. 是否有任何配置/建议可以防止“对等连接重置”错误?

  2. 我有 80 多个 URL(相同域),我希望每周抓取一次。将脚本拆分为 80 个脚本(每个 1 个 URL)并独立运行每个脚本。不是很实用,但是有什么好的方法/ PHP 脚本可以从主脚本上以 60 秒的时间间隔一个接一个地运行多个脚本?

这是我输入 URL 的一段代码:

<?php 
//to do link
$OutPut_Excel = $_GET['xls'];// 0 web page or 1 output excel
$show_Name = $_GET['show'];// 0 or 1
$urls = "http://www.URL1.com;
http://www.URL2.com;
http://www.URL3.com;
http://www.URL4.com;
http://www.URL5.com;
http://www.URL6.com;
http://www.URL7.com
";
//output excel
if($OutPut_Excel == "1")
{
header("Content-Type: application/vnd.ms-execl;charset=iso-8859-1");
header("Content-Disposition: attachment; filename=data.xls");
header("Pragma: no-cache");
header("Expires: 0");
}

set_time_limit(0);
ini_set('memory_limit', '-1');
ini_set('display_errors',true);


//output html
if($OutPut_Excel == "0")
{
?>

<html>
<head> 
title>scraper</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?php
}

if($OutPut_Excel == "0")
{
if($show_Name)
{
    $nametext = '<td>Name</td>';
}
echo "<table border='1'><tr><td>Name</td><td>Code</td>
<td>City</td><td>Address</td><td>E-mail</td><td>Phone/td>  <td>Url</td>$nametext</tr>";

等......

如果脚本运行为:

  1. localhost/scraper.php?xls=0&show=1 | 在浏览器中显示数据
  2. localhost/scraper.php?xls=1&show=1 | 数据下载为 Excel 文件

只要数据不被连接错误截断,任何一种方式都可以。

我非常感谢任何帮助我找到解决方案,因为我是初学者并且一直在自己学习 PHP。

提前谢谢你,拉吉

4

1 回答 1

0

关于您的第二个问题,您可以编写一个循环来执行第二个脚本或函数来检索 URL。您应该有一个数组,其中包含要抓取的所有链接并为每个链接运行该函数或脚本,每次运行后休眠 60 秒。这只是我头脑中的示例代码,未经测试:

$links = array('URL1', 'URL2', ...);
foreach ($link as $l) {
  runScraper($l);
  sleep(60);
}

runScraper 方法可以调用 system() 或 exec() 在另一个 PHP 进程中运行脚本。

关于您收到的错误,这可能是由于对服务器的请求过多。在如此短的时间内请求 N 个页面后,您尝试访问的服务器可能会阻止您。

于 2015-04-14T10:40:39.233 回答