PHP Web чистка сгенерированного Javascript содержимого

0

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

Я хочу захватить данные из ссылки в $ 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>'; 


  ?>
  • 0
    Что вы используете для своего скребка? Пожалуйста, добавьте свой текущий код в свой вопрос, отформатированный с помощью кнопки «Код».
  • 0
    <? php include ("simple_html_dom.php"); $ html = file_get_html (' areacodelocations.info/allcities.php?ac=201' ); // Найти все изображения // Найти все ссылки foreach ($ html-> find ('a') как $ element) echo $ element-> href. '<br>'; ?>
Показать ещё 5 комментариев
Теги:
web-scraping

2 ответа

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>

Таким образом, вы просто хватаете все 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 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(). Вышесказанное должно работать - и пятьдесят центов доставят вам чашку кофе :-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню