Сброс PHP Web содержимого, сгенерированного Javascript

В моем проекте я застрял со скребковой задачей.

Я хочу захватить данные из ссылки в $ html, все содержимое таблицы tr и td, здесь я пытаюсь захватить ссылку, но она показывает только 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>'; ?> 

Solutions Collecting From Web of "Сброс PHP Web содержимого, сгенерированного Javascript"

Обычно такие страницы загружают кучу 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() для своих элементов, преобразованных в форму массива, а Боб – ваш дядя.

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

Изучив исходный код, вы увидите что-то вроде этого:

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

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

 <?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); ?> в <?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> 

Поэтому, чтобы иметь «Альпийское» и «Восточное время», вам нужно заменить

  $csv[] = $td->innertext; 

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

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

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