2

難しい問題があります。私は基本的な共有ホスティングを利用しています。curl と php を使用して適切なスクレイピング スクリプトを作成しました。

Curl を使用したマルチスレッドは実際にはマルチスレッドではなく、私が使用した最高の curl マルチスレッド スクリプトでさえスクレイピングの速度が 1.5-2 であるため、膨大な量の cron タスクを実行する必要があるという結論に達しました。顧客に高速な Web スクレイピングを提供するために、mysql テーブルとやり取りする php スクリプトで 1 分あたり (50 など)。

私の問題は、同時に多数の cron タスクを実行しているときに、「Mysql server has gone away」というメッセージが表示されることです。cron タスクの数を減らすと、引き続き機能しますが、常に遅くなります。

while が終了するたびにスクリプトをリロードすることで、ブラウザベースのソリューションも試しました。うまく機能しますが、常に同じ問題があります。スクリプトを同時に 10 回実行すると、mysql サーバーまたは Web サーバーが過負荷になり始めます (わかりません)。

これを解決するために、my.cnf を設定できる mysql サーバーを取得しました ...しかし、問題はほぼ同じままです。

========= 私の質問は: 問題はどこから来るのですか? テーブルサイズ? 100MBPS の大きな専用サーバーが必要です。はいの場合、問題が解決されると確信していますか? また、その速度はどれくらいですか? 抽出速度が 1 秒あたり約 100 URL になることを知りたい (現時点では、15 秒あたり 1 URL で、信じられないほど遅い...)

  • 台本にある間は 1 つだけです。すべてのページと preg の一致または dom データをロードし、mysql データベースに挿入します。

  • 私は大量のデータを抽出します。これが、テーブルに数百万のエントリがすばやく含まれる理由です...しかし、それらを削除すると、少し速くなるかもしれませんが、常に同じ問題があります:大量のタスクを順番に並行して実行することは不可能ですプロセスを加速します。

  • 問題が私のスクリプトにあるとは思いません。すべての場合において、たとえ完全に最適化されたとしても、思い通りには進みません。

  • スクレイピングにプロキシなしのスクリプトを使用してテストしましたが、違いは非常に小さく..重要ではありません..

私の結論は、専用サーバーを使用する必要があるということですが、問題が解決するかどうかわからない場合は、月額 100 ドルほど投資したくありません。これらの大量の cron タスク/呼び出しを実行できるようになります。問題なくmysql db。

4

2 に答える 2

0

コードを確認する必要がありますが、基本的にはホストによってレート制限されているようです。

cron を 1 ~ 2 分に 1 回実行して、スクレイピングをスクリプト内の 1 つの SQL 接続にバッチ処理することは可能ですか?

基本的に、目標は、SQL ソケットを 1 回開き、接続で複数の URL スクレイプを実行することと、現在の mysql 接続ごとに 1 つのスクレイプを実行して、ホストによるレート制限を回避することです。

擬似コード:

<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
$sql = "SELECT url FROM urls_table WHERE scraped='0' LIMIT 100";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_NUM)){
    $url_to_scrape = $row[0];
    //TODO: your scrape code goes here
}
//Only AFTER you've scraped multiple URLs do we close the connection
//this will drastically reduce the number of SQL connects and should help
mysqli_close($link);
?>
于 2018-03-11T14:50:11.253 に答える