3 место Конвейер ⃰ по парсингу баз ключевиков (заголовков статей) от Грибника

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Вот и пришло время рассказать о моей "небольшой" уникальной разработке, которую я делал и тестировал более 2х недель :-)

Предисловие
Наверняка многие из тех, кто тут занимается дорвеестроительством и SEO сталкивались с тем, что для получения качественных результатов необходимо создавать страницы с хорошими и читаемыми заголовками, но вот беда: где взять столько ключевиков, чтобы нагенерить как можно больше результатов? Ведь есть ниши, где количество ключевиков в базах - минимально. Использовать яндекс.wordstat? Использовать подсказки (suggests) от поисковиков? Использовать бесплатные базы ключевых слов? Использовать платные базы ключевых слов? Все эти способы имеют очень большой процент мусора, по ним уже делают доры множество других людей и поэтому по точному вхождению есть очень большой риск того, что вся выдача уже "засрана" кем-то другим.
Я тоже не раз сталкивался с этой проблемой: часто использовал spintax для генерации заголовков по моим спинтакс-шаблонам (сделать которые очень большая проблема, т.к. качество будет не самым лучшим); использовал платные и бесплатные базы ключевых слов, а затем часами сидел и чистил их от различного шлака (чтобы минимизировать процент страниц, которые будут созданы, но трафика с них не будет). И в итоге пришел к идее, что самым лучшим и оптимальным вариантом напарсить качественных ключей (читай: заголовков) будет у самого гугла. Ведь именно он, гугл, как никто другой знает как должен выглядеть заголовок (по его мнению), чтоб он приносил трафик.

Зарождение
Именно так родилась идея написать парсер заголовков с сайтов. Идея была до банального проста: забиваем в какой-нибудь парсер гугла список ключевых слов по нужной нише, собираем ссылки до топ100 (например), прогоняем результат через свой шаблон и вытаскиваем из страницы содержимое тега <title>. Но! При первых же попытках было замечено, что есть ещё множество сайтов, которые в title не пишут заголовок, а засовывают туда зачем-то только название сайта. А сам заголовок находится в h1 или мета-теге og:title или twitter:title. Но проблема не может придти одна. Ведь если мы всё равно вытянем заголовок, то в большинстве случаев там будет и название сайта, а как от него избавиться? Ведь нам оно совершенно не нужно и будет только мешать. Значит нужно "чистить" названия сайтов каким-то образом... Плюс ко всему, если задуматься, то на статейных страницах наверняка используются теги h2-h6, в которых могут быть релевантные и очень "вкусные" подзаголовки, которые с большой долей вероятности никто не использует в качестве основных заголовков. Значит нужно парсить и их! Но ведь среди этих тегов ещё крайне часто попадаются различные названия меню, разделов сайта и прочая белиберда, которая нам абсолютно не нужна. Удалять её по списку стоп-слов? Тогда получится, что это будет "шаг назад", возвращение к многочасовым очисткам итоговой базы. Это не по нашему! Нужно автоматизировать весь этот процесс, чтобы я мог сидеть и попивать чай, пока Zenno работает на благо одного из "санитаров интернета". Что ж, стоит посидеть с блокнотом и подумать о бренности жизни возможности алгоритмизировать эту задачу.

Initial commit
Сразу стало понятно, что использовать "браузер" для такого рода задач - идея как минимум безумная и как максимум: очень непроизводительная. GET-запросы - наше всё! Но писать "километровые" регулярки желания никакого не было, хоть это и казалось вполне адекватной задачей. Давно уже чесались руки, чтобы распробовать и потестировать AngleSharp - что ж, пришло время.
Когда я изучал форум по вопросу подключения и использования этой библиотеки, то много раз сталкивался с тем, что все собирают его из исходников или качают nuget пакет и компилируют его оттуда. Собирать из исходников желания не было, а использовать nuget и разбираться не хотелось. Поэтому пришлось зайти "с тыла"... Погуглив описание nuget пакетов я встретил такую мысль, что некоторые пакеты - это просто zip архив с какими-то инструкциями, которые содержат уже скомпилированные *.dll под различные версии .NET.
И о чудо! С AngleSharp всё произошло именно так: если заглянуть на страницу пакета https://www.nuget.org/packages/AngleSharp , то можно увидеть, что для .NET v4.5 нет зависимостей (No dependencies), то есть вероятнее всего внутри архива лежит нужная dll. И это оказалось именно так! Везение? Возможно :-) По ссылке "Manual download" со страницы пакета качаем странный "anglesharp.0.9.9.1.nupkg", переименовываем его в *.zip, разархивируем и видим, что в папке "lib/net45" как раз находится нужная и уже скомпилированная библиотека, которая, повторю - не нуждается в зависимостях. Просто? - Да. Удобно? - Более чем! Копируем её к себе в ExternalAssemblies в ZP и наслаждаемся минимизацией геморроя с этой библиотекой.
PS: не факт, что с другими библиотеками будет аналогичная ситуация, да и я не представляю возможны ли "подводные камни" от такого рода использования, поэтому не принимайте этот совет как первоначальную инструкцию. Может быть для требуемой вам библиотеки всё будет совсем по-другому, но с AngleSharp - всё работает.
При первой же попытке написать парсер заголовков встал вопрос вопрос "каким образом конфигурировать проект?". Использовать BotUI желания не было (т.к. релиза с исправлением багов ещё не было в то время), а старые "входные настройки" не на столько универсальны, да и всё равно большую часть времени пришлось бы "править" их, что наверняка создало бы дополнительные неудобства. И, да, именно в тот момент я уже понимал, что выложу этот шаблон в рамках конкурса, но точно так же понимал (и писал это в заявке), что по итогу я могу "не потянуть", т.к. задача эта сложная, интересная и возможно непосильная. Так вот, конфигурировать проект помогло решение от друже @DmitryAk: чтение переменных из *.ini файла. Пришлось чуть доработать его код до того вида, который был необходим, но это не заняло много времени.
Начальный конфиг был написан, за пару дней был сделан простой парсер тегов title, h1-h6, мета-тегов OpenGraph/Twitter, и сохранение всего добра в *.txt файл. Но вселенная решила, что такая задача не может решиться таким банальным подходом, и в этот момент я понял, что использование простых файлов абсолютно не поможет мне избавиться от "мусора": названий сайтов в заголовке (а они встречаются даже в meta-тегах og:title!!!), а также названий меню/разделов... Подумав какое-то время было принято волевое решение: использовать СУБД, но отказаться от MySQL/PostgreSQL базы данных, т.к. с большой долей вероятности это повлечет трудности у тех, кто захочет использовать данный проект у себя. Поэтому было решено посмотреть в сторону SQLite, которую я никогда до этого не использовал в desktop-решениях (только при веб-разработке, в рамках использования её как development базы данных). Из этого всего с помощью неиссякаемого желания и какой-то матери родилась библиотека FastSqliteHelper (легковесный C# wrapper), которую я тоже выложил как конкурсный шаблон + полностью открытый код на github.
После этого мысли стали более структурированы (и данные тоже), что по моим прикидкам должно было увеличить скорость (как же я ошибался) и улучшить качество итоговых результатов (а тут не ошибался).

Тупиковый подход?
Изначально было решено, что парсер должен состоять из 3 частей (шаблонов):
  1. Добавление ссылок из файла в базу sqlite.
  2. Получение ссылки из базы, парсинг всех данных со страницы, добавление этих данных в базу.
  3. Получение всех данных (заголовков) из базы и очистка их от мусора + запись результата в файл.
Вроде бы всё просто и логично, по изначальной идее всё должно работать в многопотоке, а поэтому скорость должна быть просто "вау". Но на последнем шаге до меня всё же "дошла" запоздалая мысль, что мусор то чистить нужно какими-то самописными алгоритмами. Просто взять все заголовки и попытаться их очистить от повторов и мусора - снова приведет к тому, что мы будем работать с множеством данных, извлечь пользу из которых можно только посредством стоп-слов. Но ведь гугл умеет отделять названия сайтов от заголовка статьи? Значит и я смогу)) И эта мысль привела меня в крайне оптимистичную идею о том, что для удаления названия сайта из заголовка - необходимо иметь заголовки нескольких страниц с сайта. Вроде бы просто и логично, но покажу на примере:
Российские хоккеисты выиграли золото Олимпиады в Пхенчхане — Meduza
Венесуэла первой в мире выпустила национальную криптовалюту. В нее почти никто не верит — Meduza
Два заголовка двух новостей со всеми известного сайта. Что их объединяет? Правильно, окончание заголовка. Это то самое "название сайта", от которого так хотелось бы избавиться. Если был бы один заголовок, то данная задача была бы практически не реализуемой, но вот когда есть два и более - это уже что-то! Обдумав такой стратегический поворот было решено написать алгоритм, который из списка заголовков удалял бы окончания (а в некоторых случаях и начала), которые повторяются в абсолютно каждом заголовке для одного домена. И чем больше страниц с домена мы имеем в нашей базе, тем точнее будут "выделены" правильные заголовки.
Примерно такая же идея была продумана и по отношению к мусорным "разделам" сайта: если у нас есть несколько страниц, с которых мы спарсили содержимое тегов h1-h6, то с очень большой долей вероятности у нас есть такие данные, которые повторяются в рамках одного тега из страницы в страницу - именно это и есть "меню", "разделы" и прочие не нужные "словосочетания".
Далее пришлось погрузиться в давно забытый раздел информатики: олимпиадное программирование :-) Вспомнил сортировку пузырьком, чуть-чуть подумал о графах и деревьях и пришел к выводу, что данная задача будет оптимально (по соотношению затраченное время / количество кода) решаться полным перебором так как, к счастью, данных то у нас не терабайты. Порисовав на листочке примеры, забросив их в SharpDevelop - за пару дней были сделаны оба алгоритма, которые удаляли именно то, что мне было необходимо, но плюсом ко всему были написаны различные варианты, при которых "что-то может пойти не так" и, к счастью, алгоритмы справлялись с ними на "ура" - ничего не падало в неожиданный Exception, результаты точно соответствовали тому, что нужно.
Фактически, этот этап ознаменовал победу над этой идеей и близость к конечной реализации, поэтому дальнейшие правки, объединение 3х частей/шаблонов в один (для удобства) хочется опустить, т.к. практического смысла в них нет. А поэтому перейдем к самому интересному и ожидаемому!

Конфигурация шаблона
Надеюсь, что я вас не шокирую количеством и возможностями для конфигурирования, т.к. их в ходе работы получилось ну очень много, но оно того стоило. Тут я приведу лишь часть из всего, полное описание настроек находится в config.ini
  1. Название проекта - используется как имя файла базы данных, папки с результатами, префиксов (а точнее частей пути) для других настроек.
  2. Путь к файлу со списком урлов для парсинга - все строки обязательно должны быть уникальными (без повторов).
  3. Сохранять ли объединенные результаты в один файл?
  4. Путь к файлу с объединенными результатами.
  5. Сохранять ли результаты, разбитые по названиям тегов?
  6. Путь к папке с результатами, разбитыми по названиям тегов.
  7. Фильтровать ли результаты? Тут стоит уточнить, что это список для "включения", а не для "исключения" (это не стоп-слова).
  8. Файл со списком строк для фильтрации.
  9. Директория для сохранения краткого лога, когда шаблон падает по BadEnd.
  10. Путь к файлу со списком UserAgent'ов.
  11. Путь к файлу со списком дополнительных заголовков - необходимо для проставления правильного языка (AcceptLanguage).
  12. Количество попыток получить данные со страницы.
  13. Максимальный размер страницы в байтах.
  14. Максимальная длина заголовка.
  15. Минимальная длина заголовка.
  16. Пропускать главные страницы сайта?
  17. Минимальное количество страниц с домена для правильной очистки.
  18. Огромное количество настроек для парсинга и очистки любых тегов со страниц (при желании вы сможете спарсить все <b>, <strong>, <em> и так далее)
    • Название тега
    • Селектор для парсинга
    • Местонахождение данных (содержимое тега или содержимое атрибута)
    • Алгоритм очистки (удаление названия сайта, удаление разделов меню, оставить "как есть")
    • Параметры алгоритма
В итоге файл настроек содержит чуть более 130 строк с комментариями. Думаю, тем кому интересна эта разработка - в любом случае лучше его досконально изучить.

Советы и ограничения
  1. Самое важное замечание, которое хотелось бы отметить: данный шаблон не тестировался со страницами на русском языке. Мне это абсолютно не нужно, да и разбираться с "кракозябрами" в виде кодировки не хотелось. Поэтому я не даю никакой гарантии, что сайты в кодировке windows-1251 будут выдавать результаты, которые пригодны для использования. Но благодаря тому, что я покрыл комментариями ~95% кода - для тех, кому это жизненно необходимо - есть возможность исправить такое недоразумение и сделать, чтоб всё парсилось в нужной кодировке. Хотя есть подозрения, что AngleSharp может делать это автоматически, поэтому в любом случае - нужно тестировать и смотреть.
  2. Данный шаблон наиболее пригоден для "общенишевого" парсинга, а не "точечного". Что это значит: вам изначально нужно спарсить ссылки по определенным ключевым словам другим парсером, но ключевые слова (а точнее ниша, по которой вы работаете) должны быть вида "электроника и компьютеры", а не "macbook air 2016". Да, со вторым вариантом тоже всё будет работать, просто результат будет немного иной. Сложно объяснить в двух словах, но данный парсер заголовков будет работать лучше со статейными нишами, а не там, где есть отдельные объекты (товары, например) и вы будете использовать в качестве ключевиков для парсинга - разные объекты.
  3. Не стоит использовать для парсинга огромные базы урлов (по моим прикидкам - более 250 тысяч). К сожалению, sqlite оказалась такой базой, где скорость работы и множество блокировок внутри шаблона привели к тому, что увеличение потоков не даст прирост скорости (в первую очередь из-за записи результатов в базу). Это был технический просчет в плане того, что я выбрал её. Под MySQL всё бы работало быстрее, но возможности использования было бы меньше. Поэтому всё вышло именно так, как вышло. Чуть ниже я расскажу о скорости работы.
  4. При первом использовании лучше выключить фильтрацию результатов, чтобы посмотреть что получится в итоге. А уже потом решить для себя стоит ли использовать её или лучше фильтровать через другие программы.
  5. Так как внутри 1 шаблона пришлось уместить 3, то нагрузка на процессор в разных частях будет идти по разному: в первой части при добавлении урлов в базу будет незначительной, а вот когда будет идти парсинг - нагрузка возрастет. Поэтому мониторьте состояние шаблона (будет ясно по логу) и не выставляйте потоки "в максимум", т.к. это всё равно не даст сильного прироста по производительности.
  6. В ходе работы в логе будут появляться ошибки непосредственно из самого шаблона (когда окончили добавление ссылок, когда пропарсили все ссылки и когда очистили результаты), но могут вываливаться и совершенно неожиданные исключения. Если их количество не "зашкаливает", то ничего особо страшного не произойдет, но на всякий случай стоит проверить папку с логом BadEnd'a, там будут 3 файла: если в каком-то из них несколько урлов/идентификаторов, то в этом нет ничего страшного - потеря нескольких ссылок не принесет вам ощутимых проблем, но если там будут сотни строк, то это уже значит что что-то пошло не так (но надеюсь, что такого не будет).
  7. SQLite база будет достаточно "увесиста", поэтому имейте место на диске, где лежит шаблон, чтобы оно внезапно не кончилось.
  8. В ZP при выборе проекта есть вкладка "Остановка" - обязательно установите там в поле "Количество неуспехов подряд" значение от 10 до (количество_потоков / 5). Тем самым шаблон гарантировано остановится после окончания, а не будет "крутится" до конца жизни на земле.
  9. В результирующих файлах с заголовками будут повторы! Это сделано преднамеренно, вы должны очистить их от дублей самостоятельно.
  10. Парсинг происходит только с использованием прокси. Это не конфигурируемо и не отключаемо через настройки. Сделано в целях вашей же защиты от самих себя :-) Чтобы потом не оказалось, что вы случайно "уронили" какой-то сайт парсингом, да ещё и со своего IP. Прокси берутся из ZennoPoster, поэтому учтите, что там они должны быть добавлены.
  11. Во время парсинга гугла (или любой другой ПС) для составления списка урлов для выдергивания заголовков, я советую не парсить все ссылки целиком. А ограничиться, например, топ50 или топ100. Потому что далее уже будет всё равно всякая хрень :-)
  12. Все нужные директории создаются автоматически при первом запуске, поэтому не обязательно их делать руками. И пути к директориям должны быть в папке, где лежит шаблон, то есть не следует указывать полный путь.
  13. В итоговых результатах могут встречаться заголовки, которые не содержат пробелов. Это, к сожалению, так работает .TextContent в AngleSharp. Я хотел рекурсивно выделять под-ноды, чтобы избежать такого поведения, но так и не протестировал это, поэтому не стал выкладывать такое решение.
  14. 99% шаблона написано на C#, причем прокомментирована практически каждая строчка. Для тех, кто уже начал осваиваться в C#, но ещё жаждет знаний - думаю, будет полезно. Часть кода (по очистке) лежит в OwnCode отдельным классом, загляните туда тоже, если хотите :-)

Установка

Установка с одной стороны тривиальна, а с другой - сложна. Для начала в любом случае нужно будет скопировать все необходимые библиотеки из архива в ExternalAssemblies, затем напарсить ссылок каким-то сторонним софтом, сконфигурировать необходимые настройки в файле config.ini и запустить парсер в многопоточном режиме в ZP. Работать будет долго, но терпимо.

Скорость работы
Хотелось бы привести некоторые численные показатели, которые были проведены в ходе последних 2х парсингов.
Параметр
База на 481 тысячу ссылок
База на 146 тысяч ссылок
Точное количество ссылок в базе:
481 904​
146 000​
Количество строк для фильтрации:
37​
37​
Уникальных доменов:
170 381​
72 172​
Всего заголовков в базе (с повторами!):
7 240 266​
1 722 535​
Получено заголовков в результате:
342 260​
95 388​
Уникальных заголовков в результате:
316 604​
85 534​
Количество выполнений шаблона в ZP:
1 203 137​
392 179​
Размер SQLite базы:
723 МБ​
187 МБ​
Примерное время работы:
5 дней​
20 часов​
[TBODY] [/TBODY]
Основываясь на этих данных, можно предположить что итоговое количество выполнений шаблона в ZennoPoster можно рассчитать по примерной формуле:
Код:
(Количество ссылок в базе) + (Количество ссылок в базе * 1.2) + (Количество уникальных доменов) = Количество выполнений
Слагаемые здесь расположены в том порядке, в котором они идут в процессе работы (добавление ссылок, парсинг страниц, очистка результатов). Стоит уточнить, что во втором слагаемом (во время парсинга страниц) используется коэффициент 1.2 - это то число повторов, которое необходимо произвести для каждой страницы. У меня были более-менее свежие базы ссылок, поэтому повторов в итоге было немного. Для вас это число может запросто уменьшится или увеличится.
Стоит ещё уточнить, что здесь в двух проходах использовалась фильтрация, поэтому количество итоговых заголовков получилось меньше количества ссылок в базе. Если убрать фильтрацию, то их будет гораздо больше (но и мусора попадет больше).

Post Scriptum
К концу статьи вы уже, наверное, забыли что я назвал эту разработку "конвейером" со звездочкой. И сейчас хотелось бы привнести ясность в используемую "игру слов". Дело в том, что я считаю, что "комбайн" в нашем понимании (автоматизации) - это такой продукт/шаблон/софт, который из множества разных сущностей делает одну. А вот "конвейер" - это когда из одного множества мы в итоге получим другое множество сущностей: из списка урлов мы получаем список заголовков. Не знаю приживется ли такая терминология в нашем "серо-черном" мире, но вдруг ;-)

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

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

Post Post Scriptum
Пример работы шаблона по сбору базы ключевиков для запроса "pancakes" (блинчики): http://zennolab.com/discussion/threads/konvejer-po-parsingu-baz-kljuchevikov-zagolovkov-statej-ot-gribnika.46636/#post-345905
 
Категория
Парсинг

Вложения

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

ibred

Administrator
Команда форума
Регистрация
04.04.2015
Сообщения
3 222
Благодарностей
2 591
Баллы
113
  • Спасибо
Реакции: orka13 и Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Передозировка полезностями от @Lord_Alfred :-)
Спасибо за приятные слова :-)

На этот счет у меня есть множество факторов:
  1. Мне привычнее работать с базой в ORM-духе, когда не нужно писать RAW-sql запросы.
  2. Мне не нравится реализация работы с базой в ZennoPoster через C#.
  3. Я не знаю, но подозреваю, что на каждый запрос в базу данных в ZennoPoster открывается новое соединение к БД (а не используется 1 коннект на поток), меня смущает такое поведение (если это действительно так), т.к. запросов внутри 1 выполнения шаблона много, значит и коннектов будет много и явно какой-то может отвалиться в ходе работы или превысится лимит подключений. Кстати, было бы интересно узнать от @darkdiver: оправданы ли мои подозрения, что на каждый запрос через кубик/C# открывается новое подключение к базе?
  4. Хотелось испробовать на вкус SQLite и понять стоит ли она того.
  5. Ещё больше хотелось попробовать сделать свой wrapper под SQLite, чтобы просто поставить у себя в голове галочку "я смог" :-)
 
  • Спасибо
Реакции: orka13

Vavildi

Client
Регистрация
29.02.2016
Сообщения
176
Благодарностей
95
Баллы
28
млять , ты вообще когда нибудь спишь или отдыхаешь?
 
  • Спасибо
Реакции: orka13

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113

garat

Client
Регистрация
18.07.2016
Сообщения
31
Благодарностей
14
Баллы
8
Lord_Alfred - спс что подумал об "убить тему" и сделал порог вхождения нормальным - очень достойный жест и забота о коллегах по цеху
 
  • Спасибо
Реакции: Lord_Alfred

garat

Client
Регистрация
18.07.2016
Сообщения
31
Благодарностей
14
Баллы
8
хотя автор предупредил в топике более чем понятно - хочу напомнить нубам - про припятствование работе сайта - а парсинг это по сути дос атака - будьте осторожно с потоками и делайте все с умом - а то на УК РФ можно нарватся
 
Последнее редактирование:
Регистрация
12.07.2014
Сообщения
823
Благодарностей
305
Баллы
63
и результаты его работы меня самого поразили.
И каковы результаты?

Вообще сфера применения может быть и в белом направлении.. для "прощупывания ниши" и расширения охвата семантики.
 
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Отдельно хотелось бы показать как выглядит шаблон изнутри :-) Думал прилепить это изображение к стартпосту, но в итоге решил, что лучше не стоит)

Кликабельно:


И каковы результаты?
Как раз думаю над тем по какой бы нише спарсить немного урлов и прогнать через данный шаблон :-)
Свои ниши палить не хочу, поэтому если есть идеи - могу попробовать. Лучше всего какие-то статейные и обязательно на английском
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
  • Спасибо
Реакции: Сибиряк

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
@Сибиряк, всё спарсилось по блинчикам, поэтому выкладываю результаты :-)
Правда, пришлось добавить ещё других вариаций запросов и использовать подстановку "{subs:english_top1000}", чтоб побольше в итоге результатов получить, т.к. парсинг был только топ50 для всех запросов. В итоге, конечно, не выпарсил вообще всю выдачу, но 30к ссылок для теста вполне достаточно :-)

Точное количество ссылок в базе:33 769
Количество строк для фильтрации:0
Уникальных доменов:10 698
Всего заголовков в базе (с повторами!):428 450
Получено заголовков в результате:111 116
Уникальных заголовков в результате:97 771
Количество выполнений шаблона в ZP:80 906
Размер SQLite базы:45 МБ
Примерное время работы:8 часов
[TBODY] [/TBODY]
Стоит ещё сразу уточнить, что работа шла в 20 потоков, а не в 100-150 как на предыдущих двух парсингах (когда парсил по своим нишам), т.к. у меня ещё параллельно гугл парсился другим софтом, поэтому нагрузка была на максимуме, не стал рисковать и грузить под завязку.
Также, не использовались строки для фильтрации, чтобы показать, что если бы не было этой настройки, то в итоговой базе будет мусор, но его легко пофильтровать даже на начальном этапе.
В остальном, парсинг шел именно на том конфиге, который был выложен.


Параметр
Ссылка
Количество строк/размер
Файл с запросами для парсинга урлов с гугла:https://yadi.sk/i/kbwTTnq73Sma8B
133​
Список урлов, спаршенных с гугла:https://yadi.sk/d/-mIJvsdX3SmaEX
33 769​
Итоговая sqlite база (можно открыть через SQLiteStudio):https://yadi.sk/d/78S54z0m3SmaHr
45 МБ​
Объединенные итоговые заголовки (с повторами):https://yadi.sk/i/SSvtoSe_3SmaMr
111 160​
Объединенные итоговые заголовки (без повторов):https://yadi.sk/i/jFmMobRg3SmaQw
97 771​
Объединенные итоговые заголовки (без повторов, отфильтровано по "pancake"):https://yadi.sk/i/i79qUOIj3SmaRe
26 710
Заголовки по тегу title (с повторами):https://yadi.sk/i/lJyGRNmG3Smasp
18 804​
Заголовки по мета-тегу og:title (с повторами):https://yadi.sk/i/c3-ICK0B3Smaty
16 375​
Заголовки по мета-тегу twitter:title (с повторами):https://yadi.sk/i/QLRRKn9Y3SmayC
7 479​
Заголовки по тегу h1 (с повторами):https://yadi.sk/i/J0FMw6-P3Smb5D
16 527​
Заголовки по тегу h2 (с повторами):https://yadi.sk/i/nnz6ckH03Smb5h
24 673​
Заголовки по тегу h3 (с повторами):https://yadi.sk/i/YySKC2WE3Smb66
36 460​
Заголовки по тегу h4 (с повторами):https://yadi.sk/i/9-sOKsjy3Smb6k
12 385​
Заголовки по тегу h5 (с повторами):https://yadi.sk/i/yZHEuAyR3Smb7q
2 957​
Заголовки по тегу h6 (с повторами):https://yadi.sk/i/tqQ-TKwb3Smb8X
1 791​
[TBODY] [/TBODY]
PS: стоит ещё отдельно отметить тот факт, что чем чище база урлов (если бы там было меньше всяких pinterest, google books и прочего хлама, который явно не релевантен, но гугл упорно его подсовывает), то результат был бы ещё лучше. Тут как с нейросетями: чем лучше на входе данные, тем чище на выходе.
Поэтому, возможно стоит предварительно перед парсингом убирать заведомо плохие популярные домены, я для себя скорее всего что-то такое сделаю.
 
Последнее редактирование:

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
  • Спасибо
Реакции: Сибиряк
Регистрация
12.07.2014
Сообщения
823
Благодарностей
305
Баллы
63

Danny

Client
Регистрация
29.09.2014
Сообщения
723
Благодарностей
156
Баллы
43
Lord_Alfred, классная темка! Спасибо большое за статью!
Особенно понравилось, что все расписано логически по полочкам - для вникания в суть с таким техническим арсеналом очень полезно!
 
  • Спасибо
Реакции: Lord_Alfred
Регистрация
12.07.2014
Сообщения
823
Благодарностей
305
Баллы
63
Результат интересный. Думаю для создателей инф.сайтов самое то. Там вечная проблема как расширить семантику и притом не вылезть из темы.
Для доров хз. Если только для разбавки...
@Lord_Alfred, пили сервис по анализу ниш)))
 
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Особенно понравилось, что все расписано логически по полочкам - для вникания в суть с таким техническим арсеналом очень полезно!
В шаблоне тоже всё по полочкам разложено :-)

Результат интересный. Думаю для создателей инф.сайтов самое то. Там вечная проблема как расширить семантику и притом не вылезть из темы.
Для доров хз. Если только для разбавки...
Ну тут каждый по душе найдет применение такому. Я вчера вот подумал, что даже тем, кто на kwork продает свои услуги - можно продавать результат парсинга этого шаба по ключам клиента)

@Lord_Alfred, пили сервис по анализу ниш)))
Когда-нибудь что-нибудь обязательно :-) Но сейчас не хочу погружаться в платные решения для паблика)
 
  • Спасибо
Реакции: Danny

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
80
Баллы
28
Интересная идея. Понравилась.Хочу ее реализовать по своему.
python+(crowler-Srapy)+(BeautifulSoup)+MySQL+(десяток дешевых VDS за 3$ в месяц у буржуев с упрощенной регистрацией)
 
Последнее редактирование:
  • Спасибо
Реакции: emel и Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Интересная идея. Понравилась.Хочу ее реализовать по своему.
python+(crowler-Srapy)+(BeautifulSoup)+MySQL+(десяток дешевых VDS за 3$ в месяц у буржуев с упрощенной регистрацией)
Я посоветую посмотреть в сторону requests + SQLAlchemy и обязательно async/await в трешке (хотя в этом может быть мало смысла, если впски дешевые с 1 ядром) или лучше всё прокидывать в очередь вроде celery (на 2.7 робит).
В прицнипе, вопрос архитектуры тут условно не сложный, но в середине пути можно будет встретить веселые косяки, которые могут попортить всю малину)))

PS: глянул scrapy - он крайне изменился с моего последнего раза, когда я смотрел на него)
 
  • Спасибо
Реакции: progrlab

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
80
Баллы
28
Я посоветую посмотреть в сторону requests + SQLAlchemy и обязательно async/await в трешке (хотя в этом может быть мало смысла, если впски дешевые с 1 ядром) или лучше всё прокидывать в очередь вроде celery (на 2.7 робит).
В прицнипе, вопрос архитектуры тут условно не сложный, но в середине пути можно будет встретить веселые косяки, которые могут попортить всю малину)))

PS: глянул scrapy - он крайне изменился с моего последнего раза, когда я смотрел на него)
requests конечно тоже жизнь облегчает...
Я scrapy пока мало использовал. И в какую сторону он изменился ? Ну к 3-й ке его теперь можно прикрутить. А что еще ?
Ну я думаю, что асинхронно (async/await) даже на этих VPS можно будет работать . Если не увлекаться. Поток, допустим один, операции предположим неблокирующие => 1 ядра будет хватать.
Эхх.. а потом сделать API, чтобы на той-же Зенке можно было-бы использовать. А доступ в виде кубика оформить. :-)
 
Последнее редактирование:

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Я scrapy пока мало использовал. И в какую сторону он изменился ? Ну к 3-й ке его теперь можно прикрутить. А что еще ?
Примеры стали чище и интереснее выглядеть, сразу интуитивно видно что к чему) Я просто помню скрапингхаб (саму платформу для скрапи) ещё в самом начале, я на одной из каких-то конференций с одним из разработчиков из Ебурга общался, он вроде бы как раз только начинал там работу :-)

Эхх.. а потом сделать API, чтобы на той-же Зенке можно было-бы использовать. А доступ в виде кубика оформить.
Тоже думал в сторону сервиса :-) Но потом понял, что смысла в этом особо нет, т.к. данных будет куча, брать деньги за это можно только небольшие, поэтому в теории может даже сервер не окупиться ) Но, конечно, рискнуть всегда можно - опыт то не оценивается в деньгах :-)
 
  • Спасибо
Реакции: AZANIR

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
80
Баллы
28
Тоже думал в сторону сервиса :-) Но потом понял, что смысла в этом особо нет, т.к. данных будет куча, брать деньги за это можно только небольшие, поэтому в теории может даже сервер не окупиться ) Но, конечно, рискнуть всегда можно - опыт то не оценивается в деньгах
Эту кучу данных использовать для самообучающейся нейросети. Пускай после обучения она составляет тайтлы и сниппеты , которые ПС-ам нравятся. :-)
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Эту кучу данных использовать для самообучающейся нейросети. Пускай после обучения она составляет тайтлы и сниппеты , которые ПС-ам нравятся. :-)
Есть опыт в tf или keras?)
Я пробовал это, даже рассказывал тут на форуме где-то)
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Выложил в другой теме пример того, что генерила нейронка, основываясь на заголовках (тестировал это ровно год назад): http://zennolab.com/discussion/threads/itogi-2017-goda.44815/page-2#post-346970
Может предостерегу от потери времени в попытках сделать без должных знаний что-то такое, что в итоге потратит кучу времени и не даст никакого толку))
 

progrlab

Client
Регистрация
07.02.2014
Сообщения
204
Благодарностей
80
Баллы
28
Есть опыт в tf или keras?)
Я пробовал это, даже рассказывал тут на форуме где-то)
Практического опыта в TensorFlow и надстройке keros у меня нет.
Разобраться с ними ,я думаю, несложно. При наличии соответствующего математического, статистического бэкграунда, знания предметной области и наличии опыта в программировании.
Может предостерегу от потери времени в попытках сделать без должных знаний что-то такое, что в итоге потратит кучу времени и не даст никакого толку))
ИТОГИ-2017 :-) .
Прочел с большим интересом всю ветку, а не только про образцы генерёнки бредо-текста.
Нет, нет. Я не собираюсь тратить время и обучать нейросеть для написания связного человеческого текста. Это задача для серьезных специалистов и коллективов.

Мои слова про :
Пускай после обучения она составляет тайтлы и сниппеты , которые ПС-ам нравятся. :-)
Были чистейшей воды волюнтаризЪмом, дилетантизЪмом, а где-то даже кумовством и распиздяйщиной! :-) . Каюсь. :ah: . Начитался статей в Телеге по типу : "Нейронная сеть на питоне за 5-ть минут". "Машинное обучение для дебилов". "Заставь свою бабушку с помощью кросс-энтропии оценивать матрицы социальных счетов", ну и т.д.

А если серьезно, то уже с полгода плотно засел за вспоминание мат.анализа, дискретки и статистики. Изучаю язык R, deep lerning, нейросети.
Пока из чистого любопытства. Но параллельно присматриваю практические задачи.
Есть уже парочка таких задач. Провожу тесты.
 
Последнее редактирование:
  • Спасибо
Реакции: Lord_Alfred и Astraport

Tianes

Client
Регистрация
07.04.2016
Сообщения
24
Благодарностей
3
Баллы
3
Вчера поставил на ночь и утром результат меня приятно удивил. Спасибо за проделанную работу!

Хотел уточнить. При обработке 10к линков, получилось 1.3к H1. Это отсутствующие теги или может дело в прокси, т.к. юзались по шаблону стоковые спаршенные зенкой?
 
  • Спасибо
Реакции: Lord_Alfred

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 795
Благодарностей
3 452
Баллы
113
Хотел уточнить. При обработке 10к линков, получилось 1.3к H1. Это отсутствующие теги или может дело в прокси, т.к. юзались по шаблону стоковые спаршенные зенкой?
Точно сказать не смогу, но очень смущает что на паблик прокси работа была - там наверняка были ситуации, когда страница не скачивалась, для паблик прокси лучше количество попыток скачать страницу увеличивать по максимуму (настройка в config.ini), например, до 5-10. Будет дольше, но зато вероятность того, что страница будет пропущена в итоге - пропадет.
 
  • Спасибо
Реакции: Tianes

Viking01

Client
Регистрация
19.08.2017
Сообщения
63
Благодарностей
11
Баллы
8
огонь шаблон, спасибо))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)