0

ブラウザから実行しているカスタムPHPスクリプトがいくつかある場合、スクリプトは任意のURLを取得し、ブラウザ内のテーブル形式またはExcelファイルとしてデータを返します。(オプション)

問題は、スクリプトに3つ以上のURLを追加するたびに、ネットワーク接続エラー(ピアによって接続がリセットされる)が発生することです。これは、さまざまな理由で発生する可能性があります。次に、データがテーブルによって返される場合、結果は切り捨てられ、Excelファイルによって、ダウンロードファイルは特定の時点で停止します「ネットワークエラー」

ローカルマシン(XAMPP)でスクリプトを実行していて、いくつかのライブサーバーでテストしたところ、同じ問題が発生しましたが、ライブサーバーでは接続が長くなることに気付きました。ホスティングプロバイダーから、大量のメモリ(+ 1GB RAM)を使用していて、処理速度が低下しているため、サーバーでスクリプトを実行しないようにという警告が表示されました。ローカルホストでテストを再開すると思います。

質問:

  1. エラー「ピアによる接続リセット」を防ぐための構成/アドバイスはありますか?

  2. 毎週80を超えるURL(同じドメイン)を取得したいと思います。スクリプトを80個のスクリプト(それぞれ1つのURL)に分割し、それぞれを個別に実行します。あまり実用的ではありませんが、60秒の時間間隔でマスタースクリプトから複数のスクリプトを次々に実行するための良い方法/ Phpスクリプトは何ですか?

ここに私が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>";

ECT.....。

スクリプトが次のように実行される場合:

  1. localhost / Scraper.php?xls = 0&show = 1 | ブラウザにデータを表示する
  2. localhost / Scraper.php?xls = 1&show = 1 | Excelファイルとしてダウンロードされたデータ

接続エラーによってデータが切り捨てられない限り、どちらの方法でも問題ありません。

私は初心者であり、自分でPHPを学んでいるので、解決策を見つけるための助けを本当にいただければ幸いです。

よろしくお願いします、Raj

4

1 に答える 1

0

2 番目の質問については、2 番目のスクリプトまたは関数を実行して 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 に答える