Решил заранее подготовить все ссылки страниц, а после сохранять их в формате .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. Хотя памяти он будет кушать много.
Комментариев нет:
Отправить комментарий