Как написать универсальный парсер для множества однообразных сайтов?
Как раз занимаюсь этой проблемой.
Скачать сейчас можно только 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 секунд... Но может кто-то заинтересуется.
Если без выполнения скриптов, импортов и применения стилей, то приспокойно берем любой готовый xml-парсер и скармливаем ему страницы.
Далее останется только найти нужные данные в получившейся структуре.