Задать вопрос
  • Фильтрация headless ботов (подобных phantomJS) на лету. Как сделать?

    alekciy
    @alekciy
    Вёбных дел мастер
    Вот как раз ботов на базе phantomJS отсеять получиться с трудом. В лучшем случае можно отслеживать частоту запросов с одного IP, но гарантии ни какой, что там нет легитимного пользователя. Ну такую проверку бот быстро может обойти просто засылая запросы через пачку прокси, а сам список прокси постоянно ротировать.
    Ответ написан
    Комментировать
  • Кто-то парсил русский текст PhantomJS?

    alekciy
    @alekciy
    Вёбных дел мастер
    Использую PhantomJS как 1.8 версии так и 2 на машинах с debian7, ubuntu 12/14. Попадаются сайты как в utf-8 кодировке, так и в 1251. Ясное дело все текста - кириллица. Работаю через webdriver из php. Проблем нет.
    Ответ написан
    Комментировать
  • Где можно почитать мануалы по phantomjs и найти примеры сайтовых ботов?

    alekciy
    @alekciy
    Вёбных дел мастер
    Если есть представление о webdriver протоколе, то вопросов этих не возникло бы. Я к тому, что нужно просто прочесть спецификацию. А дальше пишется специализированный под конкретный сайт бот. К примеру, кусок из бота, процесс аутентификации:
    /**
     *
     */
    public function login()
    {
    	// Возможно мы уже залогинены
    	if ( $this->isLogin() ) {
    
    		return true;
    	}
    
    	$current_url = $this->_account->driver->getCurrentURL();
    
    	$this->_account->driver->get($this->login_page);
    	$html = $this->_account->driver->getPageSource();
    	if ( $this->isLogin($html) ) {
    
    		return true;
    	}
    
    	// Пытаемся найти требуемые для работы элементы
    	try {
    		$username    = $this->_account->driver->findElement(\WebDriverBy::xpath('//input[@id="username"]'));
    		$password    = $this->_account->driver->findElement(\WebDriverBy::xpath('//input[@id="password"]'));
    		$remember_me = $this->_account->driver->findElement(\WebDriverBy::xpath('//input[@name="autologin"]'));
    		$submit      = $this->_account->driver->findElement(\WebDriverBy::xpath('//input[@name="login"]'));
    	} catch (\Exception $e) {
    
    		return false;
    	}
    
    	// Галочка автовхода
    	$remember_me->click();
    
    	// Задаем логин
    	$username->click();
    	$username->sendKeys($this->_account->login);
    
    	// Задаем пароль
    	$password->click();
    	$password->sendKeys($this->_account->password);
    
    	$submit->click();
    
    	$html = $this->_account->driver->getPageSource();
    
    	// Возможно нас забанили
    	if ( preg_match('~закрыт доступ к конференции~iu', $html) )
    	{
    		throw new AccountBannedException('Account #' . $this->_account->id . ' is banned');
    	}
    
    	// Возращаемся на исходную страницу
    	if ( !empty($current_url) ) {
    		$this->_account->driver->get($current_url);
    	}
    
    	return $this->isLogin($html);
    }

    Проблемы кук, параллельных сессий, распознавания решаются уже в рамках другой инфраструктуры, т.е. на уровне приложения.
    Ответ написан
    Комментировать
  • Как разделить логику моделей в Yii2 advanced?

    alekciy
    @alekciy
    Вёбных дел мастер
    Делать две независимых модели.
    Ответ написан
    1 комментарий
  • Как настроить nginx, что бы он зависал, но не падал?

    alekciy
    @alekciy
    Вёбных дел мастер
    А кто сказал, что дело в nginx? В его настройках нет таймаутов меньших чем 3 секунды. Поэтому если ошибки есть, то значит это проблема бэкэнда, а не его.
    Ответ написан
    5 комментариев
  • Почему stat, li -lu в убунту не обновляют время чтения файла или его копирования?

    alekciy
    @alekciy
    Вёбных дел мастер
    В метаинформации по файлу нет времени его копирования. Есть atime - время доступа (причем сам stat не обновляет эту информацию и это правильно, т.к. в противном случае он бы затирал эти данные). Есть ctime - время модификации атрибутов (права доступа там). Есть mtime- время последней модификации файла. Если была запись в файл, то mtime меняется без вариантов.
    Ответ написан
  • Где найти договор почасовой оплаты?

    alekciy
    @alekciy
    Вёбных дел мастер
    Укрупните до 2-4 базовый работ с указанием отработанных часов. Работал так с европеский заказчиков. У на сколько валютный контроль бывает придирчив и то им глубоко фиолетово, что там написано. Они все равно не понимаю, о чем там речь. Главное есть акт выполненных работ в котором указаны часы, он принят и подписан заказчиком, эти же часы указана в счет-фактуре, в самом договоре указана часовая ставка. Т.е. умножили цифры, получили ожидаемое и все вопрос в принципе больше нет. Так что без допников обойтись можно, но акты приема-сдачи и счета (инвойсов) не избежать.
    Ответ написан
  • Имеет ли смысл использовать git если вас работает 3 человека в команде?

    alekciy
    @alekciy
    Вёбных дел мастер
    Тут пишут, что стоит использовать даже одному. И это так. Но я дополню. Его использование позволяет: 1) вести историю и при необходимости вспомнить, что было закомичено; 2) при работе над текущей задачей всегда можно понят, что внесено в проект в предыдущего коммита; 3) всегда можно откатиться к прошлой версии; 4) бранчами можно вести разработку параллельного/дублирующего функционала.

    Я вообще не понимаю, как можно работать без СУВ.

    Может ли верстальщик и первый программист иметь 1 версию на вебсервере и пушить изменения оттуда, а второй программист работать с локалхоста.

    Мне кажется, у вас смешалось все, люди, кони. Git децентрализован. Как соедините репозитории сами, так они и будут работать. Может у каждого на компе быть свое локальное репо с которым они работают, а изменения пушат на "ценральный" сервер. Может один пушить в локальное репо другого, а уже другой отправлять на "центральный" сервер/третьему участнику в его локальное репо. Главное одно. Все изменения собираются в одну кодовую базу в итоге.
    Ответ написан
    Комментировать
  • Как правильно считать количество просмотров страницы?

    alekciy
    @alekciy
    Вёбных дел мастер
    Use Google Analytics, Luke.

    По запросу, если стало 4, значит браузер открыл 2 соединения. В общем где-то в коде запрос был вызван два раза. Где конкретно и как, думайте сами смотря на код (а так же в FireBug в руки).
    Ответ написан
    1 комментарий
  • Регистрация домена на ИП. Преимущества?

    alekciy
    @alekciy
    Вёбных дел мастер
    меньше головняка

    Конечно же как физика.
    Потому что там нет "большего количества бумаг" которые в данном случае "мне не нужны".
    Ответ написан
    Комментировать
  • Имеет ли смысл делать многопоточный парсер?

    alekciy
    @alekciy
    Вёбных дел мастер
    1. Конечно может привести. Перед граббингом всегда можно прочесть robot.txt на предмет наличия директив Crawl-delay/Request-rate. Однако реальные цифры можно получить только в ходе работы (по возникновению HTTP статусов отличных от 200). По хорошему в ходе работы нужно копить статистику и динамически подстраивать скорость обхода.
    2. Нет, как и в обычной технике не пропорционально. Степень падения КПД зависит от конечно архитектуры приложения.
    3. Различного рода блокировки (I/O диска/сети, записи в базу, прочее), ограничения ОСи (количество открытых портов, лимиты на I/O диска), низкая скорость отдачи со сграбливаемого ресурса.
    Ответ написан
    Комментировать
  • Чем проверить nginx под нагрузкой?

    alekciy
    @alekciy
    Вёбных дел мастер
    Поддерживаю идею с яндекс танком.
    Сам же использую httperf. У него генерация параллельных коннектов "честнее" (чем в ab). Пример такого тестирования тут: alekciy.livejournal.com/10471.html ("Методика тестирования").
    Ответ написан
    Комментировать
  • Какую версию unix выбрать для обучения?

    alekciy
    @alekciy
    Вёбных дел мастер
    linux
    ubuntu
    И да, с графической оболочкой. Потому что можно и в консоле сидеть и в браузере.
    Хотя лучше конечно LFS, но для того, что бы прокачаться по административной части это перебор.
    Ответ написан
  • Почему nginx так странно отдаёт файлы?

    alekciy
    @alekciy
    Вёбных дел мастер
    Чудес не бывает. nginx достаточно адекватен и хорош что бы быть уверенным, что он отдает ровно то, что его просят. Значит настроен не правильно. Я бы начал с просмотра access лога. Там можно убедиться, что файл он отдал, отдал именно искомый, а так же его размер. Если ситуация не проясняется, то цепляться strace-ом и смотреть куда он за файлом ходит.
    Ответ написан
  • Долгий скрипт на Nginx, php5-fpm. Ошибка 504 через 60 сек. Куда смотреть?

    alekciy
    @alekciy
    Вёбных дел мастер
    Максимальное время которое nginx ждет ответ от бэкэнда - 75 секунд. Причем это захардкожено в коде самого nginx. Это предельная величина директивы конфига fastcgi_read_timeout (которая по умолчанию как раз 60 секунд). Нужно более долгое время - сбрасывайте буфера на бэкэнде не реже этого времени. Я так желаю:
    // отправляем данные nginx-у что бы не выйти за fastcgi_read_timeout
    $output_buffer = ob_get_length();
    if ( !empty($output_buffer) ) {
        flush();
        ob_flush();
    }
    Ответ написан
  • Сколько запросов в сек на один веб-сервер?

    alekciy
    @alekciy
    Вёбных дел мастер
    На самом деле RPS сильно зависит от приложения. От того, на сколько оно хорошо написано. От настроек сервера так же (к примеру, многие ли думают/знают про возможность использовать очередь запросов между nginx и php-fpm).

    Я для интернет магаза на машине с 7Gb (магаз брал что-то около 2Gb) ОЗУ в связке php-fpm+postgresql+redis получал 300 RPS долговременных, т.е. постоянная стабильная скорость без 500-ых, и 600 в пике, но часть запросов все же фейлилась.
    Ответ написан
  • Как лучше реализовать задание порядка выполнения методов?

    alekciy
    @alekciy
    Вёбных дел мастер
    В Module* добавить публичный метод возвращающий правила. В process для каждого загруженного модуля вызывать такой метод, после чего формировать последовательность запуска. По сути, хотя Boss и не знает эти правила, в ходе вызова process он их по сути узнает. В итоге Boss таки знает последовательность, просто опосредованно.
    Ответ написан
    Комментировать
  • Как перевести числовой массив в последовательность чисел для IN

    alekciy
    @alekciy
    Вёбных дел мастер
    Вообще-то функция array_to_string принимает вторым параметром разделитель. Пример прямо в документации: www.postgresql.org/docs/9.3/static/functions-array.html

    Но в целом у вас проблема с архитектурой и неправильным использованием реляционной базы. Потому что если там id записей другой таблицы, то в случае связи "многие-ко-многим" нужно просто "линковочная", промежуточная таблица.
    Ответ написан
  • Есть ли смысл писать библиотеку для сканирования сайтов?

    alekciy
    @alekciy
    Вёбных дел мастер
    Это конечно же велосипед, но если хочется его написать, в чем проблема? Пишите.

    Велосипед это по одной простой причине. Люди с большим опытом парсинга и так уже имеют свои наработки (к примеру, у меня есть кастамизируемый парсер загрузки каталогов добавление к которого нового сайта занимает 1-4 часа) и им велосипед не нужен. А люди без опыта скорее всего воспользоваться адекватно им не смогут.
    Ответ написан
  • Как реализовать очередь заданий на PHP?

    alekciy
    @alekciy
    Вёбных дел мастер
    Преложенные выше серверы очередей хорошо, но есть минус. Для данной задача оно избыточно. Как минимум придется раскуриться настройкой сервера и как с ним взаимодействовать.

    Предложенная схема с базой неплохая, но в ней потенциально заложена повторная проверка если п.2 запускается в несколько копий. Поэтому более правильный вариант это использовать Redis. У меня так: Как сделать «фоновый» парсинг?

    Т.е. смысл в том, что бы очередь url на загрузку формировалась в однопоточном режиме, а сами закачки многопоточны. Тогда скрипт качающий страницы может быть запушен в стольких копиях, сколько у вас потянет сервер и не нужно будет боятся повторной загрузки (у меня каждую минуту запускается новая копия скрипта и так до тех пор, пока очередь не станет пустой). Схема крайне легко маштабируется как в рамках одного сервера, так и нескольких.
    Ответ написан
    Комментировать