Страницы

Поиск по вопросам

понедельник, 3 июня 2019 г.

Как сохранить веб-страницу в формат mht программно?

Решил заранее подготовить все ссылки страниц, а после сохранять их в формате .mht Например, в .txt файле находятся все ссылки (каждая с новой строчки). Программа должна читать оттуда ссылки и сохранять в формате .mht на жесткий диск.
Можно ли это реализовать программно и какую технологию лучше использовать?
Зачем мне это нужно?
Есть один интернет-магазин. С него мне нужно скачать все изображения товаров. Пытался использовать jQuery через расширения Google Chrome. Пытался писать приложение на C#. Но, почему-то, загружаются не все картинки каталога. Вот, например эта страница: www.onlinetrade.ru/catalogue/smartfoni-c13 Здесь показано 50 товаров. Ищу все конструкции "img". Скачиваю. В итоге, загружаются только первые 7 картинок товаров. В итоге, решил загрузить таким способом, описанным выше.


Ответ

Точно ли сохраняет первые 7, а не 10 фото? Там на странице фильтр 10, 20, 50. Возможно ваш парсер просто не умеет наверное нажимать на цифру 50, для фильтра. А если 7, то возможно просто получалось что берет первую картинку и идет на следующую страницу. Там берет тоже первую и т.д. Соответственно, возможно вы просто чего-то не учли.
Почему я так думаю? Потому, что урл спокойно себе парсится. Картинки (и не только) достаются без проблем.
Вот пример с использованием php и Simple HTML DOM Parser (для использования Simple HTML DOM Parser конечно же надо его скачать...ресурс)
// Добавлять сообщения обо всех ошибках, кроме E_WARNING error_reporting(E_ALL & ~E_WARNING); include './domParser/simple_html_dom.php';
class DomParser { public $url = ''; public $imgHost = ''; public $returnVal = 0;
public function __construct($urlParse, $imgHostUrl) { $this->url = $urlParse; $this->imgHost = $imgHostUrl; }
public function getImages($_data) { $i = 1; $data = $_data ? $_data : file_get_html($this->url);
if ($data->innertext != '') { foreach ($data->find('div.catalog__displayedItem') as $a) { foreach ($a->find('.catalog__displayedItem__columnFoto img') as $img) { echo '';
$imgExt = explode('.', $img->src);
// Это для добавления картинки себе в папку // Закоментировал в фиддле if ($image = file_get_contents($this->imgHost . $img->src)) { //file_put_contents('./images/' . $i . '.' . end($imgExt), $image); } }
$i++; }
echo '

';
$this->getNextPage($data, 'getImages'); $data->clear(); unset($data); } }
public function getNextPage($data, $repeatFunctionName) { // сделал пока чтобы много циклов не делал не нагружал if ($this->returnVal >= 2) return;
if ($data->innertext != '') { $this->returnVal++;
foreach ($data->find('.catalogItemList__paginator a') as $a) { $str = iconv("windows-1251", "UTF-8", $a->title);
if (mb_strpos(strtolower($str), 'ледующие', 0, 'UTF-8') !== false) { $page = explode('?', $a->href); $data_inner_link = file_get_html($this->url . '?' . end($page)); $this->$repeatFunctionName($data_inner_link); break; } } } } }
$url = 'http://www.onlinetrade.ru/catalogue/smartfoni-c13/'; $imgHost = 'http://www.onlinetrade.ru'; $parser = new DomParser($url, $imgHost); $parser->getImages(null);
/* $url = 'http://www.onlinetrade.ru/catalogue/smartfoni-c13/'; $imgHost = 'http://www.onlinetrade.ru'; $data = file_get_html($url); $i = 1;
function getImages($data) { global $imgHost; global $i;
if ($data->innertext!='') { foreach($data->find('div.catalog__displayedItem') as $a) { foreach ($a->find('.catalog__displayedItem__columnFoto img') as $img) { echo ''; $imgExt = explode('.', $img->src);
// Это для добавления картинки себе в папку // Закоментировал в фиддле if ($image = file_get_contents($imgHost . $img->src)) { file_put_contents('./images/' . $i . '.' . end($imgExt), $image); } }
$i++; }
echo '

';
getNextPage($data); $data->clear(); unset($data); } }
$return = 0; function getNextPage($data) { global $url; global $return;
// сделал пока чтобы много циклов не делал не нагружал if ($return >= 2) return;
if($data->innertext != ''){ $return++;
foreach($data->find('.catalogItemList__paginator a') as $a){ $str = iconv("windows-1251", "UTF-8", $a->title);
if (mb_strpos(strtolower($str), 'ледующие', 0, 'UTF-8') !== false) { $page = explode('?', $a->href); $data_inner_link = file_get_html($url . '?' . end($page)); getImages($data_inner_link); break; } } } }
//getImages($data);
*/
Вариант использования класса и вариант обычный через функции (закоментированы ниже)
Потрогать можно Здесь
На данный момент специально установлено ограничение на парсинг только первых 3-х страниц (по 10 товаров), чтобы не грузить фиддл и закоменчена строка с file_put_contents потому что фиддл не пропускает, что логично)))
вот пруф сохранения: И там еще много внизу...
Как вариант можно и наверное лучше использовать (касаемо php) cURL
cURL - свободная служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.

Этот код просто скорее в целях показать, что всё работает, можно скачать и что у вас, скорее всего, где-то в коде ошибка.
Не является, скорее всего, мой ответ ответом, но, возможно, этот код будет чем-то полезен и захотите как-то переделать под нужды. Нежели сохранять mht. Хотя памяти он будет кушать много.

Комментариев нет:

Отправить комментарий