2013-12-04 3 views
1

Предположим, что есть сайт для объявлений, а уникальный URL-адрес для каждого продукта - это всего лишь номер: example.com/product/12345/ Теперь предположим, что каждое число дает результат другому продукту на странице, и сказать, что я хочу, чтобы сканировать все URL, и получить все данные от со страницы путем извлечения информации из бывших: <div id='info'>someinfo</div> Теперь я пытался сделать это с чем-то вродеEffiecint способ обхода сайта

$URL = 1000; 

for($i=1; $i < $URL; $i++){ 
    $content = file_get_contents("http://example.com/products/$i"); 
    $info = //get the exact info from div and 
    file_put_contents('file.txt', $info); 
} 

Даже если этот скрипт работает так или иначе, он не чтобы написать больше, чем первые 5 результатов, перед сбоем моей системы из-за ограничений памяти. Итак, я хотел бы знать, как это делается.

Я мог бы использовать объект DOM для получения содержимого divs, но реальная проблема заключается в том, как не иметь скрипта freez на странице.

Есть ли какие-либо решения?

+0

Вы можете попробовать использовать библиотеку cURL. По моему мнению, это должно быть более эффективным, а затем использовать file_get_contents – falconspy

+0

. Вы должны подумать о том, как долго выполняется один запрос. Выполнение 1000 запросов и их запись в файл сразу могут отменить ваш скрипт. – War10ck

+3

Уверены ли вы, что у вас проблемы с памятью, а не на тайм-аут скрипта? Я не вижу ничего такого, что могло бы привести к утечке памяти, поэтому, если у вас достаточно памяти, выделенной для хранения '$ content', объекта DOM, который вы используете для получения' $ info' и '' info info, я бы думаю, что память не будет ограничением. Опять же, возможно, вы не замечаете что-то из своего примера кода, что может быть проблематичным. –

ответ

2

Я бы рекомендовал создать сценарий оболочки для такого искателя. Тогда вам не нужно заботиться о таймауте:

#!/usr/bin/env php 
<?php 
$url = 1000; 
for ($i = 1; $i < $url; ++$i) { 
    $content = getContent("http://example.com/products/$i"); 
    $info = getInfo($content); 
    file_put_contents('file.txt', implode("\n", $info), FILE_APPEND); 
} 

function getContent($url) { 
    $ch = curl_init($url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch); 
    $curl_errno = curl_errno($ch); 
    $curl_error = curl_error($ch); 
    curl_close($ch); 
    $curl_errno === 0 or die("cURL Error ($curl_errno): $curl_error\n"); 
    //sleep(2); // Pause 2 sec to avoid ban :) 
    return $data; 
} 

function getInfo($content) { 
    $doc = new DOMDocument(); 
    $doc->loadHTML($content); 
    $xpath = new DOMXPath($doc); 
    $result = array(); 
    // Adopt this block for your needs. This is just example 
    $elements = $xpath->query("//*[@id='info']"); 
    foreach ($elements as $element) { 
     $result[] = $element->nodeValue; 
    } 
    return $result; 
} 
1

Я не смог проверить это, потому что редактор онлайнового кода, использующий im, не позволяет мне давать значения $_GET, но я бы предположил, что это самый простой способ обмануть PHP для запуска вашего кода без ограничения по времени , (или что-то в этом роде)

$url = intval($_GET['url']); 
if ($url >= 1) { 
    $content = file_get_contents("http://example.com/products/$url"); 
    $info = //get the exact info from div and 
    file_put_contents('file.txt', $info); 
    ob_end_flush(); 
    $url--; 
    header("Location: ./thisfile.php?url=$url"); 
} 
+0

Вы не имеете в виду 'while'? – raam86

+0

@ raam86 с такими вещами, где php будет работать в течение длительного времени, я предпочитаю перемещать каждую другую операцию в загрузку страницы. которые могут даже обеспечить обратную связь по мере продолжения процесса. вызов 'header' вызовет цикл –

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