Парсинг интернет магазинов

Наконец дошли руки написать обещанный пост про парсер сайтов. Главное условие для нашего парсера, чтобы сайт был открытый и не требовал авторизации (в принципе 98% интернет магазинов).

Для примера работы я буду использовать этот сайт, ни в коем случае не реклама. Сам парсер я взял у команды Lofblog (ссылка на оригинал) это не реклама, урок был написан еще в апреле 2014, но почему то не нашел своей славы. На него я наткнулся после нескольких часов блужданию по интернету в поисках бесплатного и хорошего способа парсинга сайт.


Так а теперь приступим к самому парсеру, сначала я выложу его код (для тех кто хоть немного понимает справятся без моих коментариев), а потом начну пояснять все потихоньку.


function getconten() {

for(var j=1;j<=68;j++){

getPageContent(1+10*(j-1),"https://cleanshop.ru/catalog/spbd/?start="+j)

}}


function getPageContent(startRow,url) {

var sheet = SpreadsheetApp.getActiveSheet();

var range = sheet.getRange("A2:I5000");

var cell = range.getCell(startRow,1);

var response = UrlFetchApp.fetch(url);

var textResp=response.getContentText();

var start,end,name;

for (var i=1;i<=10;i++){


//фото

start = textResp.indexOf('<table class="good_img">',end)+24;

start = textResp.indexOf('src="',start)+5;

end = textResp.indexOf('"',start);

name = textResp.substring(start,end);

cell.setValue(name);

cell=cell.offset(0,1);


// цена

start = textResp.indexOf('</td></tr><tr><th>',end)+18;

end = textResp.indexOf('</th></tr></table>',start);

name = textResp.substring(start,end);

cell.setValue(name);

cell=cell.offset(0,1);


//название

start= textResp.indexOf('<div class="good_text">',end)+23;

start= textResp.indexOf('class="good_title">',start)+19;

end=textResp.indexOf('</a>',start);

name =textResp.substring(start,end);

cell.setValue(name);

cell=cell.offset(0,1);


//код

start = textResp.indexOf('Код: ',end)+5;

end = textResp.indexOf(' | ',start);

name = textResp.substring(start,end);

cell.setValue(name);

cell=cell.offset(0,1);


// описание

start = textResp.indexOf('<p>',end)+3;

end = textResp.indexOf('</p>',start);

name = textResp.substring(start,end);

cell.setValue(name);

cell=cell.offset(0,1);


cell=cell.offset(1,-5);}}


Шаг 1: Создаем документ на Google тут или тут;

Шаг 2: Кликаем в меню по пункту "Инструменты" затем на "Редактор скриптов", у нас откроется новая вкладка.

Парсинг интернет магазинов Google, Парсер, Google script, Лофт, HTML, Pikaweb, Длиннопост

Шаг 3: В открытое окно вставляем наш скрипт.

Парсинг интернет магазинов Google, Парсер, Google script, Лофт, HTML, Pikaweb, Длиннопост

Шаг 4: Запуск скрипта для начала нужно выбрать функцию getcontent. затем нажать кнопку запуска (серая стрелка, станет черной после выбора функции).

Парсинг интернет магазинов Google, Парсер, Google script, Лофт, HTML, Pikaweb, Длиннопост

После этого в документе мы увидим подобное:

Парсинг интернет магазинов Google, Парсер, Google script, Лофт, HTML, Pikaweb, Длиннопост

Теперь основные комментарии к коду:

Мы имеем 2 функции getconten и getPageContent , из getconten мы передаем нужные данные и запускаем функцию для getPageContent для парсинга страницы которую мы передали из getconten.

Функция getconten: здесь мы имеем цикл равный количество страниц в данном разделе. За каждый проход цикла мы отправляем ссылку на страницу и кол-во уже обработанных товаров.

И так какую же ссылку нам вставить для нашего сайта? Большинство сайтов имеет подобную структуру сайт.ру/раздел/?страниц=1 под словом страница может скрываться любое слово в нашем случае start, чаще page. Иногда на первой странице сайта этой переменной нет, нужно просто перейти например на вторую. Для лучше понимая рекомендую прочитать прочитать про GET запросы тут или в google.

Парсинг интернет магазинов Google, Парсер, Google script, Лофт, HTML, Pikaweb, Длиннопост

Формула 1+10*(j-1) - нужна для того чтобы записи шли дальше,а не перезаписывались в документе, где 10 это количество записей (!внимание! количество записей по умолчанию, для частоты лучше зайти на нужную страницу с другого браузера или с приватной вкладки тогда вы уведите страницу именно так, как видит ее ваш скрипт).

Функция getPageContent: здесь творится основная магия. Я думаю здесь стоит пояснить только основные моменты, более подробнее почитать про каждую из функций можно в гугле если заинтересует.

sheet.getRange("A1:I5000") - здесь мы выбираем диапазон ячеек, с которыми мы будем работать, рекомендую ставить большой разбег.

for (var i=1;i<=10;i++) - параметры цикла, где 10 см.формулу выше (!Внимание! цифры должны совпадать с формулой вышей).

Основные параметры мы настроили, теперь приступаем к настройке парсинга.

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

И так разбор полета пошел:

Чтобы вставить в ячейку некоторый текст со страницы нам нужно знать его начальное положение (start) и конечное (end). Для этого мы находим уникальную строку для элемента которые мы хотим спарсить, в случае с изображением товара это строка <table class="good_img"> она уникальная, ее имеет только товары при этом она имеется у каждого товара, но отталкиваясь от этой строки мы захватим слишком много, по этому находим точку еще ближе к нужной информации и уже от ее оставляем как start. Незабываем приплюсовывать количество всех символов в строке.

start = textResp.indexOf('<table class="good_img">',end)+24;

start = textResp.indexOf('src="',start)+5;

С концом еще проще здесь как правило закрывающийся тег или же кавычки.

end = textResp.indexOf('"',start);

Далее функцией substring извлекаем нужные данные зная где они начинаются и где заканчиваются.

name = textResp.substring(start,end);

Тут просто присваиваем значению в ячейку.

cell.setValue(name); 

И перешагиваем на новый столбец, оставаясь на этой же строке .offset(Строка,Столбец).

cell=cell.offset(0,1); 


Незабываем в конце перепрыгнуть на новую строку и вернуться на нулевой столбец.

cell=cell.offset(1,-5);- где 5 количество столбцов на которое мы ушли или проще говоря сколько данных у товаров мы спарсили.


Теперь поговорим о его достоинствах и недостатков более подробно:

Он бесплатный, но имеет ограничений на кол-во использования обращения к сайту, вроде 12000 раз за 24 часа, для обхода вроде как надо покупать специальную лицензию ну или просто зайти с другого аккаунта.

Он полностью универсальный, да его функционал позволяет спарсить почти все тоже самое что и большая часть платных парсеров.

Не требует установки какого то софта.


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

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

Нельзя парсить на закрытах сайтах где требуется авторизация или же данные которые динамически подгружаются на странице.


Если мой урок не очень понятен, то советую посмотреть видео там очень доходчиво объясняют. Это мой первый пост в стиле уроков, по этому совсем сильно не бить. Надеюсь кому то этот способ сэкономит время и возможно даже деньги с учетом того, что цена за наполнения карточки товара начинается от 10р.

Так же хочу написать пост про то как с пользой использовать формулы в EXCEL для решение больших задач, если тема с excel вам интересна и у вас есть некоторые рутинные задачи пишите их в комментариях постараюсь оптимизировать с excel.

Web-технологии

460 постов5.8K подписчиков

Добавить пост

Правила сообщества

1. Не оскорблять других пользователей

2. Не пытаться продвигать свои услуги под видом тематических постов

3. Не заниматься рекламой

4. Никакой табличной верстки

5. Тег сообщества(не обязателен) pikaweb

4
Автор поста оценил этот комментарий

Мой тебе совет - не лезть учить людей, пока ты сам новичок. В приличном обществе за это ногами бьют. Достаточно посмотреть на ютубе что-нибудь типа уроков по юнити - тонны говна от малолетних даунов, в которых теряется действительно полезная инфа. Не надо.

раскрыть ветку (1)
3
Автор поста оценил этот комментарий
Да не хотел я никого учить, просто показал такой вот способ Парсинга и как его настроить под себя. Это не урок программирования.
показать ответы
9
Автор поста оценил этот комментарий

отличный парсер, и комментарии интересные

Иллюстрация к комментарию
раскрыть ветку (1)
6
Автор поста оценил этот комментарий

Ну это мои первые попытки написания подобных статей. Если есть какие то замечания я вас внимательно и с удовольствием выслушаю и приму к сведению.

показать ответы
DELETED
Автор поста оценил этот комментарий

Спасибо конечно, но у меня пока получается только записать код страницы  хтмл  в 1 ячейку гугл доков: вот так http://joxi.ru/xAe5onRTpg1GnA

Это нормально? Как исправить?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Скрин самого кода, скорей всего ошибка в нахождение строки start = textResp.indexOf('<table class="good_img">',end)+24; в подобной строчке, проверьте точно ли такая строка существует на странице и внимание строка должна быть на одной строке т.е не должно быть 'enter' как то криво объяснил, не знаю как более правильно и понятно сказать

показать ответы
4
Автор поста оценил этот комментарий

Пишешь что взял чей-то парсер, значит самому написать не по силам. Значит не нужно пытаться учить кого-то делать что-то, чего сам не умеешь и не понимаешь.

Объяснения типа "Формула 1+10*(j-1) - нужна для того чтобы записи шли дальше,а не перезаписывались в документе, где 10 это количество записей" нелепы и вредны для новичков, которым нужно изучать теоретические основы, а не магические заклинания.

раскрыть ветку (1)
5
Автор поста оценил этот комментарий

В данном случае я не хотел научить программированию или чему то подобному. Я не отрицаю что взял чужой парсер даже привел ссылки на оргинал.

В тот момент когда я искал парсер я не догадывался о таких возможностях google и уже почти написал на delphi свой. Но потом нашел этот парсер, он удобней моего по этому я использую его.


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

Но я учту и в следующий раз постараюсь более научно объяснять. Если можно напишите как вы считается лучше описать данную формулу.

показать ответы
2
Автор поста оценил этот комментарий

К чему тогда этот разбор кода с крайне важными объяснениями типа "Тут просто присваиваем значению в ячейку."? =) Не надо отвечать на этот вопрос, а то мне станет интересно почему ты пишешь "парсинг" с большой буквы. Ещё раз повторяю: не надо.

раскрыть ветку (1)
2
Автор поста оценил этот комментарий
Парсинг с большой это Т9 на телефоне работает.
Автор поста оценил этот комментарий

Классный парсер, супер. Я раньше оригинал читал Романа Спиридонова, а здесь еще больше пояснений и т. д. Спасибо!


Есть несколько вопросов!

1. как вывести парсинг на карточку товара, чтобы парсить непосредственно с нее, со всем содержимым??? Это очень важно, так как в категориях редко бывают какие-то описания?

2. Можно ли сохранять картинки и как?
Буду очень признателен за ответ, Еще раз спасибо.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Дополнение к первому пункту Парсинг сайтов с помощью Google Table V2

Автор поста оценил этот комментарий

Спасибо огромное за пост! очень помог!!! Особенно в заполнении несколько ячеек! Супер!

Можешь поподробней написать про парсинг ссылок товара (ссылки получила, как по ним заходить?) чтобы из внутренней карточки взять инфу и записать в таблицу?

раскрыть ветку (1)
Автор поста оценил этот комментарий

А опции они умеют парсить?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Ну если опции не динамически подгружаются то может. Здесь больше описывается принцип Парсинга, а не универсальный код Парсинга.

Автор поста оценил этот комментарий

Спасибо за ответ! Проблема в том, что парсить нужно магазин закрытый для всех кроме Америки. На него без  нельзя попасть! Все программы парсинга не видят сайт.


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

раскрыть ветку (1)
Автор поста оценил этот комментарий
Готового скрипта не осталось. Я сейчас с телефона доступ к компу нет. По этому достаточно сложно и лень все это писать подробно.
Познания в программирование есть?
Проблема в том что тут нет готовых решений совсем и каждое решение нужно писать с нуля. По этому сделать можно все что угодно если хватает знаний
Автор поста оценил этот комментарий

Классный парсер, супер. Я раньше оригинал читал Романа Спиридонова, а здесь еще больше пояснений и т. д. Спасибо!


Есть несколько вопросов!

1. как вывести парсинг на карточку товара, чтобы парсить непосредственно с нее, со всем содержимым??? Это очень важно, так как в категориях редко бывают какие-то описания?

2. Можно ли сохранять картинки и как?
Буду очень признателен за ответ, Еще раз спасибо.

раскрыть ветку (1)
Автор поста оценил этот комментарий
1 я делал пар но который собирает ссылки на товар. В потом по этому списку бежал другим парсером который парсил описание. Не самый лучший вариант но меня вполне устраиваел. Работал без сбоев.
2 сохранить? Получаешь список ссылок, а потом сохраняешь через любую программу таких программ много.
Есть ещё способ создаёшь просто HTML страницу, там просто вставляешь весь список ссылок, но так чтобы каждый ссылка была в теге. Потом открываешь страницу в браузере и нажимаешь сохранить страницу со всеми файлами. Схема в принципе неплохая поворачивал я её быстро. Минус только если есть изображение с одинаковыми названиями то они будут изменять друг друга.
Правда может реализовать ещё через PHP тогда по скачивание он может изменять название, разрешение и тд но это только если надо понастоящему большой объем информации обработать.

Извиняюсь за ошибки пишу с телефона. Объяснил тоже по детски тупо, но надеюсь понятно и поможет
показать ответы
1
Автор поста оценил этот комментарий

Ох и не думал, что мой урок с лофтблога перевоплотится на pikabu! Спасибо автору за свой вариант.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Это ваш курс? Не думал встретить автора. Спасибо вам за него в одно время очень спас и помог выполнить быстро большую работу
DELETED
Автор поста оценил этот комментарий

Немного непонятно.

1. <table class="good_img"> Это какой элемент вы выделяете и по какому принципу?

2. Что такое +24 в конце и как отмерять сколько нужно?

3.В парсер нужно вставлять ссылку на каталог (в самом коде) или на карточку?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Первое это часть текста, который находится перед нужной тебе информацией например тег или что либо еще. Этот текст должен быть уникальным т.е нельзя просто тег <p> искать. Вообще это команда выдает индекс первого вхождения подстроки в строке.

+24 это количество символ в искомой строке, если этого не сделать то в ячейку будет вставляться вместе с этой строкой.

Данный вариант парсера предназначен для каталога т.е превью товаров. Можно переделать чтобы он саму карточку товара парсил если нужна такая задача. Мне просто всегда хватало првеью.


Хотя один раз я парсил сами карточки, но было один раз и там было немного, не хочется его как то доделывать


// Сбор ссылок

// start = textResp.indexOf('</td><td width="100%" style="vertical-align:top;">',end)+50;

// start = textResp.indexOf('<div class="good_text">',start)+23;

// start = textResp.indexOf('<a href="',start)+9;

// end = textResp.indexOf('"',start); name = textResp.substring(start,end); name='https://cleanshop.ru'+name;


и функция которая уже по массиву ссылок пробегает,которые записаны в таблице.


function getconten2() {

var sheet = SpreadsheetApp.getActiveSheet();

var range = sheet.getRange("A1:A5000");

for (var j=1;j<=898;j++) {

var cell = range.getCell(j,1);

getPageContent(j,cell.getValues());

}

Автор поста оценил этот комментарий

А мне знаний не хватает чтобы вот это допилить: Modelprice.ru. Поэтому с удовольствием буду следить за вашими уроками.

На данный момент у меня получились парсеры для десяти магазинов. Парсеры 2-ух видов. Поиск товара в магазине, например по артикулу. Я же только ставлю галочку напротив подходящего, т.к. в поиске может быть несколько вариантов. И ссылка заносится в БД. И второй парсер - это обновление цены по ссылке.

Загнал это всё в функции. И блин если вручную по одному нажимать - то работает. А вот в цикле никак. Применял кстати Simple Html Dom.

Пока гоняю на локальном - времени нет совсем хоть какой то приличный вид привести.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Уроков не будет, я сам учусь только. Просто почему про такой хороший лёгкий и хороший способ Парсинга мало где упоминается. Везде при поиске либо платные программы либо php, питон.
Я просто хотел показать этот способ и быстренько показать как этот скрипт настроить, вдруг кому то поможет.
Автор поста оценил этот комментарий

для запуска php скриптов, особенно в последних версиях php веб сервер не обязателен.

раскрыть ветку (1)
Автор поста оценил этот комментарий
А вот этот момент я пропустил если не сложно кинь ссылку посмотреть.
показать ответы
Автор поста оценил этот комментарий
переписывать Ваш код мне лень, могу свои парсеры на php скинуть. код получается намного компактнее т.к. весь массив данных в большинстве случаев получается с помощью одного regex
раскрыть ветку (1)
Автор поста оценил этот комментарий
Давай интересно посмотреть на примере. Сейчас как раз изучаю php и хочу создать что типа фильмотеки и было очень интересно посмотреть на ваш способ реализации Парсинга. А кроме того что код компактней, производительность увеличивается?

Правда этот скрипт все равно для меня удобней, хотя бы тем что запустить я его могу с любого устройства.
показать ответы
Автор поста оценил этот комментарий

Ну они хотя бы позволяют писать по человечески По моему питон - один из самых простых языков, сделать там requests.get('suite'), а оттуда разбирать его регулярками - даже для новичка не составит проблем (учитывая количество мануалов в интернете особенно) В том числе там нет проблем с авторизацией, с парсингом сложных структур (типа DOM).

раскрыть ветку (1)
Автор поста оценил этот комментарий
Dom штука хорошая, но иногда архитектура сайта убита так что этот способ не работает. По этому это способ считаю более универсальным. Да питоны, php и т.д требуют и установки различного софта и желания хотя бы научиться программировать. А тут мы имеем доступ в любой момент это раз да и специальных навыков не надо.
Автор поста оценил этот комментарий

ужас, регулярки Вы еще не освоили?

раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Я еще только учусь и буду благодарен, если вы покажите как с помощью регулярных выражений выполнить данную задачу

показать ответы
Автор поста оценил этот комментарий
Парсер на JavaScript. Делал только на Perl и Python. Они и авторизацию умеют.
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Но они требует установки и некоторых знаний программирования, здесь же все свели к минимуму как мне кажется. Если мне потребуется я напишу и с авторизации, но пока такой необходимости не было

показать ответы