Как не попасть в блэк-лист при многопоточном парсинге?
Написал многопоточный парсер на php с использованием библиотеки guzzle . Он проходит по большому числу сайтов и берет контент одной страницы. Со временем вместо контента возвращается 302 код ответа сервера. Даже не со временем, я провел пару тестовых запусков:
1. Всего 300 сайтов парсятся в 100 потоков.
2. 300 сайтов парсятся в 300 потоков.
Во втором варианте 302 код начал возвращаться сразу же с сообщение о том что мой ip находиться в блэк листе, а в первом все нормально спарсилось. При этом первый вариант я запускал после второго, то есть если мой ip в блэк листе, то почему парсинг по 100 сайтов после парсинга по 300 отработал нормально?
Какие есть способы свести на нет эту проблему или хотя бы уменьшить количество сайтов, отдающих 302 код ответа? Возможно ли обойтись без смены ip адресов?
Пока ваш парсер по поведению не отличается от обычных пользователей сайта - он незаметен.
Достаточно корректно эмулировать виртуального пользователя (браузер, JS-события, периодичность запросов и правильность навигации), чтобы не быть забаненым. Вкратце: запрос одной страницы на одном домене - не чаще одного раза в 15 секунд.
Один из вариантов бана получается, когда много сайтов висят на одном сервере.
Самый простой способ обхода - определить ip сайтов и делать паузы при запросах на одинаковые ip.
В теории, механизм таких пауз в курле должен быть встроен и есть вероятность, что этим можно управлять из php. Для подробностей читайте маны ;)
Более сложный и более редкий вариант - на один сервер несколько ip или несколько серверов за одним фаерволом, который воспринимает множественные запросы как DDOS. Здесь уже необходимо вычислять подсеть или даже все подсети ДЦ для установки пауз.