@forklive

На чем сделать одновременный JS-парсинг большого количества WEB-страниц?

Добрый день!
Предположим - есть много открытых веб страниц, контент на которых меняется динамически и очень часто. Может раз в секунду. Много - это несколько тысяч.
Задача - сделать парсинг этих страниц.
Почему именно парсинг с помощью JS ?
Т.к. контент формируется скриптами. Т.е. если тупо посылать GET-запросы - то во первых IP будет быстро забанен. И во вторых - не факт что вернется то что нужно.
Поэтому можно сделать для каждого типа страниц свой JS скрипт, который будет запускаться на каждой странице например - раз в секунду, и выводить JSON массив с необходимой информацией в программу-обертку, которая будет в свою очередь складывать данные в базу.
Проблема в том, что для того, чтобы просто открыть эти несколько тысяч страниц в браузере - нужно несколько сотен компьютеров.

Гугл дал мне некоторые наводки:

Понятно что, для выполнения такой задачи придется арендовать несколько серверов, и на каждом сервере должно быть максимальное количество оперативы (например 64 ГБ), и процессор помощнее, т.к. на каждой странице нужно будет раз в секунду выполнять JS-скрипт.

Есть ли какие то средства, которые могут открывать ВЕБ-страницы, держать их в памяти, выполнять на этих страницах JS скрипты, получать данные из консоли, но при этом быть не такими ресурсоемкими, как обычный браузер?

Парсинг страниц QT+JS

SCRAPY

Node.js

В какую сторону копать?
  • Вопрос задан
  • 795 просмотров
Пригласить эксперта
Ответы на вопрос 4
Stalker_RED
@Stalker_RED
чтобы просто открыть эти несколько тысяч страниц в браузере - нужно несколько сотен компьютеров.
10 вкладок на компьютер, серьезно?

Посмотрите phantomjs и selenium.

Ну и скорее всего данные не генерируются непосредственно в этих вкладках, а передаются по сети. Разобраться что там за протокол не пробовали?
Ответ написан
@Verz1Lka
Web scraping expert
Весь "динамически генерирующийся контент каждую секунду" не что иное, как те тупые гет (возможно пост) запросы, которые вы не хотите использовать. Т.е. сайт написан так, что страница каждую секунду отправляет запрос определённого формата (используя правильные заголовки и параметры) на сервис. Самое эффективное, как раз так для быстродействия - это подделывать эти запросы, и считывать ответы. Чтобы вас не банили меняйте IP и заголовки (например User Agent, Cookie).

Для запросов можно использовать scrapy (поддерживается многопоточность).

Если всё-же хотите прям эмулировать весь браузер пробуйте headless chrome и selenium.

P.S. Если дадите глянуть страничку - скажу какая технология более пригодна.
Ответ написан
@forklive Автор вопроса
Спасибо за ответы!
>P.S. Если дадите глянуть страничку - скажу какая технология более пригодна.
Это все сайты букмекерских контор, которые заблокированы в РФ.
К примеру - https://www.betfair.com/sport/inplay, ну и там выбираете любое событие.
Да, большинство из них посылают ГЕТ-ПОСТ запросы, и ответ приходит либо в виде JSON-а, либо просто в виде HTML-а.
И да - разбираться очень тяжело - какое поле к чему относиться. К примеру - при первоначальной загрузке приходит таблица, в которой у каждой ячейки свой ID.
И потом, в динамических запросах приходят пары - "ID ячейки - значение ячейки".
И у каждой из 50-100 контор какой то свой алгоритм со своими особенностями.
К примеру - посмотрел ты в Хроме какой запрос посылает страница - посылаешь его в другой вкладке - а сервер уже возвращает какую то ошибку. Т.е. сервер уже понимает что это какой то левый запрос. И вот нужно разбираться что не так...
Поэтому, дабы достичь какой то универсальности, кмк - лучше писать JS-скрипты. Страница браузера (или эмулятора браузера) будет сама посылать все нужные запросы, и остается только забирать из консоли JSON массив, в котором ты уже не запутаешься.
Ну это ход моих мыслей...

>10 вкладок на компьютер, серьезно?
Может и не 10. Но учтите, что в каждой вкладке каждую секунду выполняется скрипт, и потом происходит распарсинг JSON-а. Мои эксперименты показали что даже при 20 таких открытых страницах создается существенная нагрузка.
Ответ написан
JabbaHotep
@JabbaHotep
Пытаюсь минимизировать ручную работу
У меня коллега писал парсер для беттинга (под заказ), 2000 запросов должны были быть обработаны каждые 10 секунд (включая собственно забор данных, парсинг и запись в базу). Могу сказать что с Python у него не получилось уложиться, поэтому был использован Go.
Ответ написан
Ваш ответ на вопрос

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

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