2014-01-11 3 views
0

У меня проблема. Это то, что я должен сделать, и код занимает очень много времени для запуска:
Существует 1 веб-сайт, на котором мне нужно собирать данные, и для этого мне нужен мой алгоритм для посещения более 15 000 подразделов этого сайта (то есть www .website.com/item.php? rid = $_id), где $_id будет текущей итерацией цикла for.
Вот проблемы:Как извлечь содержимое из URL?

  1. Метод настоящее время я использую, чтобы получить исходный код каждой страницы file_get_contents, и, как вы можете себе представить, это занимает очень много времени, чтобы file_get_contents из 15,000 страниц.
  2. Каждая страница содержит более 900 строк кода, но все, что мне нужно извлечь, составляет около 5 строк, поэтому кажется, что алгоритм тратит много времени, извлекая все 900 строк.
  3. Некоторые страницы не существует (т.е., возможно, www.website.com/item.php?rid= 2 существует, но www.website.com/item.php?rid= 3 не делает), так Мне нужен способ быстрого пропущения этих страниц, прежде чем алгоритм попытается получить его содержимое и потратить кучу времени.

Вкратце, мне нужен способ извлечения небольшой части страницы из 15 000 веб-страниц как можно быстрее и эффективнее.
Вот мой текущий код.

for ($_id = 0; $_id < 15392; $_id++){ 
    //****************************************************** Locating page 
    $_location = "http://www.website.com/item.php?rid=".$_id; 
    $_headers = @get_headers($_location); 
    if(strpos($_headers[0],"200") === FALSE){ 
     continue; 
    } // end if 
    $_source = file_get_contents($_location); 
    //****************************************************** Extracting price 
    $_needle_initial = "<td align=\"center\" colspan=\"4\" style=\"font-weight: bold\">Current Price:"; 
    $_needle_terminal = "</td>"; 
    $_position_initial = (stripos($_source,$_needle_initial))+strlen($_needle_initial); 
    $_position_terminal = stripos($_source,$_needle_terminal); 
    $_length = $_position_terminal-$_position_initial; 
    $_current_price = strip_tags(trim(substr($_source,$_position_initial,$_length))); 
} // end for 

Любая помощь вообще очень ценится, так как мне действительно нужно решение!
Заранее благодарю вас за помощь!

+0

Если вы не можете настроить удаленный сервер, чтобы просто дать вам эти 5 строк каждый раз, вам нужно загрузить весь файл и извлечь все, что вам нужно. Не обойти это. Вы можете [проверить его существование] (http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file-exists-using-php) каждый раз, чтобы избегайте загружать несуществующие страницы, хотя – Clive

+0

- это строка файла после определенных байтов байтов – sanjeev

+0

вы можете использовать RollingCurl.RollingCurl позволяет обрабатывать несколько HTTP-запросов параллельно с использованием библиотеки CURL PHP. [link] (https://github.com/takinbo/rolling-curl) – jingyu

ответ

2

не хватает: не надо.

дольше: Если вы хотите сделать это много работы, вы не должны делать это по требованию. Сделайте это на заднем плане! Вы можете использовать код, который у вас есть, или любой другой метод, который вам нравится, но вместо того, чтобы показывать его пользователю, вы можете сохранить его в базе данных или локальном файле. Вызовите этот скрипт с заданием cron каждые x минут (в зависимости от необходимого вам интервала) и просто покажите последний контент из вашего локального кеша (будь то база данных или файл).

Смежные вопросы