#парсер
Решил заранее подготовить все ссылки страниц, а после сохранять их в формате .mht Например, в .txt файле находятся все ссылки (каждая с новой строчки). Программа должна читать оттуда ссылки и сохранять в формате .mht на жесткий диск. Можно ли это реализовать программно и какую технологию лучше использовать? Зачем мне это нужно? Есть один интернет-магазин. С него мне нужно скачать все изображения товаров. Пытался использовать jQuery через расширения Google Chrome. Пытался писать приложение на C#. Но, почему-то, загружаются не все картинки каталога. Вот, например эта страница: www.onlinetrade.ru/catalogue/smartfoni-c13 Здесь показано 50 товаров. Ищу все конструкции "img". Скачиваю. В итоге, загружаются только первые 7 картинок товаров. В итоге, решил загрузить таким способом, описанным выше.
Ответы
Ответ 1
Точно ли сохраняет первые 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. Хотя памяти он будет кушать много.Ответ 2
Для программного создания mht: C# source code for generating MHT files from an URL CDO.Message COM-объект, реализующий IMessage interface Из JavaScript попробуйте вызвать print(document.body.innerHTML); или document.execCommand('SaveAs','true','http://...')
Комментариев нет:
Отправить комментарий