Как написать универсальный парсер для множества однообразных сайтов?

Доброго времени суток.

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

Парсер для выдергивания данных по любому надо писать специализированный под каждый сайт, верно? Или все-таки есть какие-то варианты?

А как на счет БД?
К примеру у меня сейчас готов парсер для одного сайта. Есть входные URL-ы категорий при заходе на который парсер выдергивает URL-ы pagination по определенным категориям.

Входные URL-ы:
Table: site_category

URL-ы pagination по категориям:
Table: site_pagination

Далее URL-ы pagination парсятся и из них выдергиваются URL-ы самих объявлений.
Table: site_item

А что делать если у следующего сайта будет другая структура?
  • Вопрос задан
  • 6130 просмотров
Пригласить эксперта
Ответы на вопрос 4
viktorvsk
@viktorvsk
Как раз занимаюсь этой проблемой.
Скачать сейчас можно только https://github.com/victorvsk/apify-core
Но уже есть сервер, клиент (админка), и готовится рецепт ansible/chief/puppet, где, в принципе, нужен будет только vps, и синтаксис типа:
{
  "index": {
    "url": ["https://github.com/blog"],
    "js": false,
    "paginate": [
      "\\/?+$",
      "/?page=<% 1,2,1 %>"
    ]
  },
  "posts": {
    "from": "select('h2.blog-post-title a') from('index')",
    "js": false,
    "host": "http://github.com",
    "pattern": {
      "title": "<% .blog-title %>",
      "meta": {
        "calendar": "<% .blog-post-meta li:first %>",
        "author": "<% .blog-post-meta .vcard %>",
        "category": "<% .blog-post-meta li:last %>"
      },
      "body": "<% .blog-post-body %>"
    }
  }
}

(Этот "код" скачивает все посты с первых двух страниц гитхаба https://github.com/blog)
Код на руби, но задумывается как standalone демон, так что можете или поучаствовать или подождать готового решения.
Самая большая сложность, в ближайшее время, наверное, в нормальной документации.

P.S. Смысл вообще в том, есть куча инстансов-парсеров на разных серверах (или на одном, или локально, неважно) и есть админка, где вы создаете сущности (юниты), в которых описываете структуру таким вот псевдо-синтаксисом (что откуда парсить) и в конце-концов указываете url, куда отправить готовый результат

UPDATE: Выложил кривоватый кусок на хероку
Если интересно, можете поэкспериментировать. Конечно, без документации тяжело, но, возможно, что то получится, используя примеры:
Например, json указанный выше, можно отправить на адрес:
https://agile-river-6704.herokuapp.com/crawler?apify_secret=secret

POST запросом, Content-type: application/json
А для проверки непосредственно синтаксиса, можно передавать не ссылки, а html. Например, вот такой json:
{
"html": "<html><head></head><body><div id='text'>Текст</div></body></html>",
"pattern": { "title": "Значение", "title-2": "Это: <% #text %> <% html |first |html %>", "text-html": "<% #text | first | html %>" }
}

POST запросом на https://agile-river-6704.herokuapp.com/parser?apif...
Важно указать в адресе ?apify_secret=secret

Это, конечно, совсем черновой вариант, и хероку обрывает запросы более 30 секунд... Но может кто-то заинтересуется.
Ответ написан
@Stasy_sin
У меня много косяков в парсинге выходит, вчера напала на вебинар, может можно записаться тем, кто у него не постоянно учится https://dmitrylavrik.ru/php-parser
Ответ написан
Комментировать
keksmen
@keksmen
Just a programmer
Если без выполнения скриптов, импортов и применения стилей, то приспокойно берем любой готовый xml-парсер и скармливаем ему страницы.
Далее останется только найти нужные данные в получившейся структуре.
Ответ написан
Комментировать
silenzushka
@silenzushka
Маркетинг-гик и интернет-предприниматель
Мы сделали «обучающийся» парсер. Ему без разницы структура сайта. Он из любого магазина может получить информацию о товаре. Вот онлайн демка https://fetch.ee/ru/developers/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы