Хороший алгоритм обхода графика

Q: Как Вы мешали бы сценаристам хлопнуть Вашим сайтом сотни времен в секунду?
А: Вы не делаете. Нет никакого пути к , предотвращают это поведение внешними агентами.

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

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

Как дела это? Ну, это - другой вопрос! ;-)

...

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

  • генерирует изображение (кэшируемый, конечно), когда страницу требуют
  • , сохраняют имя источника изображения тем же, так, чтобы не давал игру далеко
  • большую часть времени, изображение будет иметь обычный текст в нем и будет выровненное, чтобы казаться, быть частью встроенной страницы HTML
  • , когда игра будет 'включена', изменения образа к тексту объявления
  • , текст объявления показывает URL и/или код , который должен быть вручную введен для получения приза. КАПЧА код, если Вам нравится, но это, вероятно, не необходимо.
  • для дополнительной безопасности, код может быть одноразовым маркером, сгенерированным специально для запроса/IP/агента, так, чтобы повторные запросы сгенерировали различные коды. Или можно предварительно генерировать набор случайных кодов (шифр Вернама), если поколение по запросу является слишком налоговым.

гонки на время Выполнения настоящих людей, отвечающих, это, и игнорирует ('ой, ошибка произошла, извините! попробуйте еще раз'), ответы быстрее, чем (говорят) половину этого времени. Это событие должно также инициировать предупреждение разработчикам, что по крайней мере один бот выяснил код/игру, таким образом, пора изменить код/игру.

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

Одно заключительное предложение: когда запрос на Вашу основную страницу входит, помещает его в очередь и отвечают на запросы в порядке в отдельном процессе (Вам, вероятно, придется взломать/расширить веб-сервер, чтобы сделать это, но это будет, вероятно, стоить). Если другой запрос от того же IP/агента входит, в то время как первый запрос находится в очереди, проигнорируйте его. Это должно автоматически потерять загрузку из ботов.

РЕДАКТИРОВАНИЕ: другая опция, кроме использования изображений, состоит в том, чтобы использовать JavaScript для заполнения buy/no-buy текста; боты редко интерпретируют JavaScript, таким образом, они не видели бы его

11
задан TheJacobTaylor 24 August 2009 в 06:15
поделиться

4 ответа

Чтобы запомнить идентификаторы пользователей, которых вы уже посетили, вам понадобится карта длиной 250 000 целых чисел. Это далеко не «слишком много». Просто поддерживайте такую ​​карту и проходите только по краям, которые ведут к уже неоткрытым пользователям, добавляя их к этой карте в момент нахождения такого края.

Насколько я понимаю, вы близки к реализации Breadth-first поиск (BFS). Узнайте подробности этого алгоритма в Google. И, конечно, не забывайте о мьютексах - они вам понадобятся.

7
ответ дан 3 December 2019 в 09:42
поделиться

Я действительно не понимаю, почему для добавления узла в БД требуется 10 секунд. Это похоже на проблему. Какую базу данных вы используете? Есть ли у вас серьезные ограничения платформы?

С современными системами и их огромным объемом памяти я бы порекомендовал какой-нибудь хороший простой кэш. Вы должны иметь возможность создавать очень быстрый кеш с пользовательской информацией, что позволит вам избежать повторяющейся работы. Когда вы уже встретили узел, остановите обработку. Это позволит избежать бесконечного зацикливания в кликах.

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

Джейкоб

2
ответ дан 3 December 2019 в 09:42
поделиться

Хотя вы говорите, что получение списка друзей занимает много времени (10 секунд или больше), вариант старого доброго алгоритма Дейкстры может сработать:

  1. Получить любой узел.
  2. Получите соединение от любого уже загруженного узла.
  3. Если другой конец еще не загружен, добавьте узел к графу.
  4. Перейдите к шагу 2.

Уловка состоит в том, чтобы выбрать соединение, которое вы загружаете на шаге 2 разумным способом. Несколько коротких замечаний по этому поводу:

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

В чтобы действительно что-то сказать об эффективности,

0
ответ дан 3 December 2019 в 09:42
поделиться

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

Если вы выполните простую проверку существования новых узлов (O (1), если вы используете хэш для поиска), то циклы вообще не будут проблемой. Циклы вызывают беспокойство, только если вы не храните полный график. Вы можете оптимизировать поиск по графику, но сам этап построения всегда будет занимать линейное время.

Я согласен с другими авторами, что размер вашего графика не должен быть проблемой. 250 000 - это не очень много!

По поводу одновременного выполнения; график обновляется всеми потоками, поэтому это должна быть синхронизированная структура данных. Поскольку это Python, вы можете использовать модуль Queue для хранения новых ссылок, которые еще предстоит обработать вашим потокам.

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

Я согласен с другими авторами, что размер вашего графа не должен быть проблемой. 250 000 - это не очень много!

По поводу одновременного выполнения; график обновляется всеми потоками, поэтому это должна быть синхронизированная структура данных. Поскольку это Python, вы можете использовать модуль Queue для хранения новых ссылок, которые еще предстоит обработать вашим потокам.

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

Я согласен с другими авторами, что размер вашего графа не должен быть проблемой. 250 000 - это не очень много!

По поводу одновременного выполнения; график обновляется всеми потоками, поэтому это должна быть синхронизированная структура данных. Поскольку это Python, вы можете использовать модуль Queue для хранения новых ссылок, которые еще предстоит обработать вашим потокам.

график обновляется всеми потоками, поэтому это должна быть синхронизированная структура данных. Поскольку это Python, вы можете использовать модуль Queue для хранения новых ссылок, которые еще предстоит обработать вашим потокам.

график обновляется всеми потоками, поэтому это должна быть синхронизированная структура данных. Поскольку это Python, вы можете использовать модуль Queue для хранения новых ссылок, которые еще предстоит обработать вашим потокам.

2
ответ дан 3 December 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: