В моем проекте я застрял со скребковой задачей.
Я хочу захватить данные из ссылки в $ 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>';
?>
Обычно такие страницы загружают кучу 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> Allendale</td>
<td> Eastern Time
</td>
</tr>
<tr>
<td> Alpine</td>
<td> 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> Alpine</td>
<td> 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()
. Вышесказанное должно работать - и пятьдесят центов доставят вам чашку кофе :-)