curl — самый быстрый способ получить контент другого сайта и проанализировать его

Я должен получить несколько параметров пользователя с веб-сайта. Я могу сделать это, потому что у каждого пользователя есть уникальный идентификатор, и я могу искать пользователей по URL:

http://page.com/search_user.php?uid=Икс

Поэтому я добавил этот URL в цикл for () и попытался получить 500 результатов:

<?php

$start = time();
$results = array();

for($i=0; $i<= 500; $i++)
{
$c = curl_init();
curl_setopt($c, CURLOPT_URL, 'http://page.com/search_user.php?uid='.$i);
curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 desktopsmiley_2_2_5643778701369665_44_71 DS_gamingharbor Firefox/3.5.2 (.NET CLR 3.5.30729)');
curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$p = curl_exec($c);
curl_close($c);

if ( preg_match('"<span class=\"uname\">(.*?)</span>"si', $p, $matches) )
{
$username = $matches[1];
}
else
{
continue;
}

preg_match('"<table cellspacing=\"0\">(.*?)</table>"si', $p, $matches);
$comments = $matches[1];

preg_match('"<tr class=\"pos\">(.*?)</tr>"si', $comments, $matches_pos);
preg_match_all('"<td>([0-9]+)</td>"si', $matches_pos[1], $matches);
$comments_pos = $matches[1][2];

preg_match('"<tr class=\"neu\">(.*?)</tr>"si', $comments, $matches_neu);
preg_match_all('"<td>([0-9]+)</td>"si', $matches_neu[1], $matches);
$comments_neu = $matches[1][2];

preg_match('"<tr class=\"neg\">(.*?)</tr>"si', $comments, $matches_neg);
preg_match_all('"<td>([0-9]+)</td>"si', $matches_neg[1], $matches);
$comments_neg = $matches[1][2];

$comments_all = $comments_pos+$comments_neu+$comments_neg;

$about_me = 0;
if ( preg_match('"<span>O mnie</span>"si', $p) )
{
$about_me = 1;
}

$results[] = array('comments' => $comments_all, 'about_me' => $about_me, 'username' => $username);
}

echo 'Generated in: <b>'.(time()-$start).'</b> seconds.<br><br>';
var_dump($results);
?>

Наконец я получил результаты:
— все было сгенерировано за 135 секунд.

Тогда я заменил локон на file_get_contents () и я получил: 155 секунд.

Есть более быстрый способ получить этот результат, чем скручивание ?? Я должен получить 20 000 000 результатов с другой страницы, и 135 секунд — это слишком много для меня.

Благодарю.

3

Решение

Если вам действительно нужно 500 раз запрашивать разные URL-адреса, возможно, вам стоит рассмотреть асинхронный подход. Проблема с вышеупомянутым состоит в том, что самой медленной частью (узким местом) являются сами запросы curl. В ожидании ответа ваш код ничего не делает.

Попробуйте взглянуть на PHP асинхронный cURL с обратным вызовом (т. е. вы будете делать почти 500 запросов «почти сразу» и обрабатывать ответы по мере их поступления — асинхронно).

2

Другие решения

Взгляните на мой предыдущий ответ о том, как разделить и покорить такую ​​работу.

отладка долго работающего PHP-скрипта

В вашем случае я бы сказал, что вы придерживаетесь той же идеи, но вы, в свою очередь, разбили бы запросы на группы по 500 человек.

0

По вопросам рекламы [email protected]