simple_html_dom не берет данные с некоторых сайтов - PullRequest
0 голосов
/ 28 апреля 2019

simple_html_dom не берет данные с некоторых сайтов. Для веб-сайта www.google.pl, он загружает источник страницы, но для других, таких как: gearbest.com, stooq.pl не загружает никаких данных.

require('simple_html_dom.php');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.google.com/"); //  work

/*
curl_setopt($ch, CURLOPT_URL, "https://www.gearbest.com/"); // dont work
curl_setopt($ch, CURLOPT_URL, "https://stooq.pl/"); // dont work
*/

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
curl_close($ch);

$html = new simple_html_dom();
$html->load($response);

echo $html;

Что я должен изменить в коде для получения данных с веб-сайтов?

1 Ответ

0 голосов
/ 29 апреля 2019

Проблема с корнем здесь (по крайней мере, на моем компьютере, может отличаться от ваша версия ...), что сайт возвращает сжатые данные, и это не так php и curl распаковываются должным образом перед передачей в дом синтаксический анализатор. Если вы используете php 5.4, вы можете использовать gzdecode и file_get_contents, чтобы распаковать его самостоятельно.

<?php
    // download the site
    $data = file_get_contents("http://www.tsetmc.com/loader.aspx?ParTree=151311&i=49776615757150035");
    // decompress it (a bit hacky to strip off the gzip header)
    $data = gzinflate(substr($data, 10, -8));
    include("simple_html_dom.php");
    // parse and use
    $html = str_get_html($data);
    echo $html->root->innertext();

Обратите внимание, что этот хак не будет работать на большинстве сайтов. Главная причина в основе этого мне кажется, что curl не объявляет, что принимает данные gzip ... но веб-сервер в этом домене не обращает внимания в этот заголовок, и все равно gzips. Тогда ни скручивай, ни php фактически проверяет заголовок Content-Encoding в ответе, и предполагает, что это не GZIP, поэтому он проходит без ошибок, ни вызывая gunzip. Ошибки как на сервере, так и на клиенте здесь!

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

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

header('Content-Type: text/html; charset=utf-8');
...