2014-01-04 3 views
-1

В моем проекте застревает задача соскабливания.PHP Скремблирование сгенерированного Javascript содержимого

я хочу, чтобы захватить данные из ссылки в $ HTML, все содержимое таблицы из тр и тд, здесь я пытаюсь захватить ссылку, но это только показывает JavaScript: self.close()

<?php 
include("simple_html_dom.php"); 

$html = file_get_html('http://www.areacodelocations.info/allcities.php?ac=201'); 

foreach($html->find('a') as $element) 
    echo $element->href . '<br>'; 


    ?> 
+0

Что вы используете для передряги?Добавьте свой существующий код в свой вопрос, отформатированный с помощью кнопки «Код». – halfer

+0

найти ('а'), как $ элемента) эхо $ element-> HREF. '
'; ?> – user3161025

+0

Uhm ... это ** другой сайт ** из того, который вы цитировали ранее. Мое решение больше не применяется, а ваше теперь не работает, потому что на новой странице вам нужно найти элементы TR, а не элементы A. На этой странице есть только один элемент A, и это то, что вы восстанавливаете. Вы проверяли источник HTML? – LSerni

ответ

6

Обычно такие страницы загружают кучу Javascript (jQuery и т. Д.), Который затем создает интерфейс и извлекает данные для отображения из источника данных .

Итак, вам нужно открыть эту страницу в Firefox или аналогичную с помощью инструмента, такого как Firebug, чтобы посмотреть, какие запросы действительно выполняются. Если вам повезет, вы найдете его непосредственно в списке запросов XHR. Как и в этом случае:

http://www.govliquidation.com/json/buyer_ux/salescalendar.js 

Обратите внимание, что данный курс действий может нарушать некоторые лицензии или условия использования. Перед тем, как продолжить, очистите это с помощью веб-мастера/источника данных/владельца авторских прав: . Обнаружение и запрещение такого рода скребков очень просто, и при определении вы, вероятно, только немного меньше.

Во всяком случае, если вы выдаете тот же вызов в PHP, вы можете непосредственно скрести данные (при условии, что нет никакой проблемы сессии/аутентификации, как это кажется в данном случае) с очень простым кодом:

<?php 

    $url = "http://www.govliquidation.com/json/buyer_ux/salescalendar.js"; 

    $json = file_get_contents($url); 

    $data = json_decode($json); 

?> 

Этого дает объект данных, который вы можете проверять и преобразовывать в CSV путем простой циклизации.

stdClass Object 
(
    [result] => stdClass Object 
     (
      [events] => Array 
       (
        [0] => stdClass Object 
         (
          [yahoo_dur] => 11300 
          [closing_today] => 0 
          [language_code] => en 
          [mixed_id] => 9297 
          [event_id] => 9297 
          [close_meridian] => PM 
          [commercial_sale_flag] => 0 
          [close_time] => 01/06/2014 
          [award_time_unixtime] => 1389070800 
          [category] => Tires, Parts & Components 
          [open_time_unixtime] => 1388638800 
          [yahoo_date] => 20140102T000000Z 
          [open_time] => 01/02/2014 
          [event_close_time] => 2014-01-06 17:00:00 
          [display_event_id] => 9297 
          [type_code] => X3 
          [title] => Truck Drive Axles @ Killeen, TX 
          [special_flag] => 1 
          [demil_flag] => 0 
          [google_close] => 20140106 
          [event_open_time] => 2014-01-02 00:00:00 
          [google_open] => 20140102 
          [third_party_url] => 
          [bid_package_flag] => 0 
          [is_open] => 1 
          [fda_count] => 0 
          [close_time_unixtime] => 1389045600 

Вы получите $data->result->events, используйте fputcsv() на его элементах преобразуется в виде массива, и Боб твоего дяди.

1

В случае второго сайта у вас есть таблица с несколькими элементами TR, и вы хотите поймать первые два TD-файла каждого TR.

Проверяя исходный код, который вы видите что-то вроде этого:

<tr> 
     <td>&nbsp;Allendale</td> 
     <td>&nbsp;Eastern Time 
</td> 
    </tr> 
    <tr> 
     <td>&nbsp;Alpine</td> 
     <td>&nbsp;Eastern Time 
</td> 

Таким образом, вы просто захватить все ТР

<?php 
    include("simple_html_dom.php"); 

    $html = file_get_html('http://www.areacodelocations.info/allcities.php?ac=201'); 

    $fp = fopen('output.csv', 'w'); 

    if (!$fp) die("Cannot open output CSV - permission problems maybe?"); 

    foreach($html->find('tr') as $tr) { 
     $csv = array(); // Start empty. A new CSV row for each TR. 
     // Now find the TD children of $tr. They will make up a row. 
     foreach($tr->find('td') as $td) { 
      // Get TD's innertext, but 
      $csv[] = $td->innertext; 
     } 
     fputcsv($fp, $csv); 
    } 

    fclose($fp); 
    ?> 

Вы заметите, что текст CSV является «грязным». Это происходит потому, что фактический текст:

 <td>&nbsp;Alpine</td> 
     <td>&nbsp;Eastern Time[CARRIAGE RETURN HERE] 
      </td> 

Так, чтобы "Alpine" и "Eastern Time", вы должны заменить

  $csv[] = $td->innertext; 

с чем-то вроде

  $csv[] = strip(
       html_entity_decode (
        $td->innertext, 
        ENT_COMPAT | ENT_HTML401, 
        'UTF-8' 
       ) 
      ); 

Выезд справочную страницу PHP для html_entity_decode() о кодировке набора символов и обработке объектов. Выше должно работать - и должно и пятьдесят центов получит вам чашку кофе :-)

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