以不同的时间间隔从主脚本运行多个PHP脚本

时间:2013-01-25 10:05:55

标签: php web-scraping

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

问题在于,每当我向脚本添加3个以上的URL时,我遇到网络连接错误(由对等方重置连接)可能是由多种原因引起的。 然后,如果按表返回数据,则结果将被截断,如果通过Excel文件,下载文件将在某个时间点停止"网络错误"

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

问题:

  1. 是否有任何配置/建议可以防止错误"连接由同行重置"

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

  3. 这是我输入网址的一段代码:

    <?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>";
    

    ECT ......

    如果脚本运行为:

    1. localhost / scraper.php?xls = 0&amp; show = 1 |在浏览器中显示数据
    2. localhost / scraper.php?xls = 1&amp; show = 1 |数据下载为Excel文件
    3. 只要数据不被连接错误截断,任何一种方法都可以。

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

      提前感谢你, 拉吉

1 个答案:

答案 0 :(得分:0)

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

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

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

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