Добрый вечер, уважаемые форумчане! Пытаюсь спарсить все твиты из поисковой выдачи самого twitter по конкретному запросу. Например, https://twitter.com/search?q=тостер&src=typd Для парсинга использовал curl Спойлер: Сам код: PHP: <?php $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => "https://twitter.com/search?src=typd&q=redsurf", CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0', CURLOPT_AUTOREFERER => true, // имитация передачи реферера при редиректе CURLOPT_ENCODING => "", // поддержка декодировния результата: identity, deflate и gzip CURLOPT_HEADER => false, // отключение заголовков из вывода CURLOPT_RETURNTRANSFER => true, // результат в curl_exec() CURLOPT_CONNECTTIMEOUT => 60, // ограничение времени соединения CURLOPT_TIMEOUT => 60, // ограничение времени выполнения cURL функции CURLOPT_FOLLOWLOCATION => true, // следовать по редиректам CURLOPT_MAXREDIRS => 5, // максимальное кол-во редиректов CURLOPT_SSL_VERIFYPEER => false, // отключение проверки сертификата узла CURLOPT_SSL_VERIFYHOST => false, // отключение проверки сертификата хоста )); $content = curl_exec($ch); $errno = curl_errno($ch); $error = curl_error($ch); $info = curl_getinfo($ch); curl_close($ch); echo $content; echo $info; ?> Но загружаются не все твиты, а позади есть кнопка для подгрузки остальных. В самом твиттере посмотрел что происходит при подгрузке следующих твиттов. Там отправляется GET-запрос по ссылкам: Спойлер: ссылка при первой подгрузке Код (Text): https://twitter.com/i/search/timeline?vertical=default&q=%D1%82%D0%BE%D1%81%D1%82%D0%B5%D1%80&src=typd&include_available_features=1&include_entities=1&max_position=cm%2B55m--aDFIIDDaEEsvbvDvIDb-BD1UO2FFu9QAAAAAAAAVfAAAAAcAAABWAAgAAEEgQAAACAgAgABBEDggAAAACAIAAAgAATAKAAyAIAAAAAASAEAAAAAAAAAEBAAoCgAAQAAABAkAAhAMAIRQACAAEAAAAAAIAAAAAAAAAAwARBAAASAAAAIECGAAEgMgAyAAAAAAAAABAAAQAAAAAAAAoQBAAAEAAMAAIAAAIAEEFQCgAAAIKAAABAAKoKIAgAAAEIAQAAQAAQBAIQQACBAAAEAAEAAIAAQCIQQgIgNAAQAAQAEAgAQgCAQAYAAICBDEIAIAEBAAAQAAAAABAABAAAAAAMAQAAhAQACASACgBCAABMAgAAgABgAAACAAAAIAAAhECIACIAACQQADCAEAAAAQIAAIAACAQAACQkAAgACQAEAAAAAIARAGwAoAAAABgQAAgACARAAAQCBAAIAgACAAAKA4QAQEQQAAAgEQAIABAAIAAIAAAFOABIAGEAgAAAFBACUIBAUAAWgZgAkQCAABMCQAAIoAAA4AgCAAQCLoEAwIAAAgMAAABAAAAAAAAkAAQAJAAAAyQgBIQAAAEggBACAQCgECEgACAAYnQAAEAAIAEgEDAAIQAQARIAAEgAJEQAAAIAAAxIAIAJIACEABMAAAAAAgCAAAAEAAACCFAACAAkAAAAAQAgAAEAAQQAAACAAAAAAABIJCCAQAAAAACAAIAEANAFAAgAAAAoAABAChIAQAQIAAACIACACACAAAhiiCAAAAAgECAACAIAVCAEAAgBAIAAQgAAAoAAEAFAAAFBEAERFABDAAAIAAABAEAICQQQCCSAAAAAAAJQAQBAAAgAAgAIACGAQAAEABBAQAAgAAAAAAAgAAAACIAAGCAAAAAAAKAAAIEBAAAAAAAAAAggAACJgoAABKAAQACBAUAoAEAIiAgAmBIQAIAAAAQgAAABAAAA%3D%3D-T-0-0&oldest_unread_id=0&reset_error_state=false Спойлер: ссылка при следующей подгрузке Код (Text): https://twitter.com/i/search/timeline?vertical=default&q=%D1%82%D0%BE%D1%81%D1%82%D0%B5%D1%80&src=typd&include_available_features=1&include_entities=1&max_position=cm%2B55m-aDFIsvFsvEXIJvDXFvJ-aDFIIDDaEEsvbvDvIDb-BD1UO2FFu9QAAAAAAAAVfAAAAAcAAABWAAgAAEEkQCAACAgAkABBEDogACAACAIAAAgAATAKIAyCIAABAIASAEAAAAAAAAAEBAAoCgAgQQAABAkiAhAMAIRQACAAEAACAAAYAEAAAAAIAgwARBAAASAAAAIEGGCAEgMgAyAIAAAAAAABAAAQAAAEAAIAoQBCAAUAAMAAIQgAIBEEFQCgAAAIKAAABEAKoKIAgAAAEIAQAAQAAQBAIQQACBAAEEAAEAAIAAQiIQQgIgNAAQCAQAEAhASgSAQAYAAICBDEIAIAEhAAAwAAAAABAABAAAAAAMAQEAhAQACASICghCAARMAgAEgABgAAECAAAAIAAghECIACIAACQQADCAEAAAAQIAAIAACMQABCQkAAkACQAEAAAAAIARAGwAoAAAADgQIQgACARAAAQCBAAYIgACAAAKA4QIQEQQBAAkEQAIABAAIAAIAAAFOQBMAGEAgAAIFBACUIBAUAAWgZgAkQCAABcKQAAIoAAA4AgCAAUCLoEB0IgAAgMAAABAAAAAAAAkABQQJAAAAyQgBIQAAAEgkBgKAQCgECEgADAAYnQAEEgAIAEgEDAAKQAQARIAAEgAJEQAAAIAAAxIAIAJIACEABMAAAAAAgCAAAAEAAgCCFAACAAkAEAAAUAgAAEEAQQAAACAACIAAABIJCCAQAAAAACAAIAEANAFAAiAAAAoAABAChMARAQIAAACIACACADAAAhiiCBAACAoECAICCIAVCAEAAgJAICBQgQAAoAAEIFAAAFBEAERFABDUAAIAAABAEAICQQwCCSAAACAABpQAQBAAIgAAgAJACGAQAAEABBISAAgAAAAABAggAAACIBAGCAAAIAAgKAAgIkBAAQAAAAAAAggkACJgoAABaAAQACBAUAoAEAIiBgCmBMQAIAAAAQgEAAJIAAA%3D%3D-T-0-1&reset_error_state=false Как видно в основном меняется параметр max_position. Как мне подгружать все твиты, которые выдает поиск? API Twitter в данном случае не подходит, поскольку там есть ограничения: 1. выдает твиты за последние 7 дней 2. за один запрос не более 100 твитов
Не понял, причем тут композер. По теме сам же сказал что нужно доп параметры передавать, так и делай в цикле запросы для получения порциями относительно данного параметра
@ADSoft, про композер предназначалось для @nospiou. Просто он ссылку прислал на библиотеку на api. Но и с api не хотелось бы связываться из-за ограничений. Что касается запросов в цикле, то я написал выше, что параметр max-position всегда разный и я не знаю как его определить.
все-же апи предпочтительнее п 2 как раз легко лечится тем что через цикл запрашиваешь следующие 100, потом еще 100 и так - сколько нужно дума и п 1 как-то регулируется, стоит только почитать а ответ типа не умею - не хочу.... имхо недостоин для программиста
API может и предпочтительнее, но дельного решения своей задачи не нашел. Я попытался парсить выдачу поискового запроса в twitter по слову redsurf. С этой целью использовал библиотеку https://github.com/selimhallac/Twitter-API-Search-Tweets-or-Hashtags. Но поиск выдал мне всего лишь один результат, в то время как в самом twitter их гораздо больше https://twitter.com/search?q=redsurf&src=typd. Тогда что я не так делаю, что у меня не получается? Да и в API свои ограничения, о которых писал выше.
если использовать api, то для поиска нужно использовать версию enterprise. Вроде в ней есть подобное решение, но в интернете примеров не нашел в данном направлении.
@acho, хорошо учту. @nospiou, я вроде в последнем своем посте указал, что если использовать API, то только в режиме ENTERPRISE. Но мои поиски на ютубе и в просторах интеренета не дали результата, поскольку нет примеров. Если Вы разбираетесь в API, то просто приведите пример. Потому что я если честно пока не пойму как мне применить enterprise к той библиотеке, о которой я указал выше.
Точно так же как и обычным. Просто будет платно. Регистрируйся оплачивай. И вперед https://developer.twitter.com/en/pricing.html https://developer.twitter.com/en/docs/api-reference-index https://developer.twitter.com/en/docs/tweets/search/api-reference/enterprise-search
@nospiou спасибо ))) только не нашел информацию по точной стоимости ) а может есть на гитхабе готовые библиотеки?
@Medvedoc в первом посте я бросил ссылку на php api. Ну а стоимость в буржуев не маленькая https://developer.twitter.com/en/pricing/search-30day жми селект на премиум
@nospiou, ох е-мое ))) проще отказаться от затеи с premium и enterprise А со стандартной я так понимаю только за последние 7 дней можно получить твиты. Позже уже никак? --- Добавлено --- поэтому я и хотел через curl парсить, но блокировка меня явно не радует
@nospiou, не все так просто ) слова могут часто меняться и мне необходимо было определить количество постов на заданное слово. --- Добавлено --- а блокировка я так понимаю происходит за частые обращения. Может попробовать выставить задержку? или смену прокси с юзерагентом? Просто дело в том, что я не знаю как подгружать следующие посты при обычном парсинге.
@Medvedoc Лучше создать свой интересный проект. Ты ж наверное б не хотел что б другие нагружали твои сервера воруя контент?
@nospiou, мне не совсем посты нужны. У меня в планах подсчитать количество данных постов. А решение данной задачи я вижу именно только в парсинге через curl, поскольку API имеет ограничения. --- Добавлено --- Просмотрев в браузере как twitter подгружает новую пачку твитов, увидел get запрос Спойлер: ссылка Код (Text): https://twitter.com/i/search/timeline?vertical=default&q=%D1%82%D0%BE%D1%81%D1%82%D0%B5%D1%80&src=typd&include_available_features=1&include_entities=1&max_position=cm%2B55m--aDFIIDDaEEsvbvDvIDb-BD1UO2FFu9QAAAAAAAAVfAAAAAcAAABWAAgAAEEgQAAACAgAgABBEDggAAAACAIAAAgAATAKAAyAIAAAAAASAEAAAAAAAAAEBAAoCgAAQAAABAkAAhAMAIRQACAAEAAAAAAIAAAAAAAAAAwARBAAASAAAAIECGAAEgMgAyAAAAAAAAABAAAQAAAAAAAAoQBAAAEAAMAAIAAAIAEEFQCgAAAIKAAABAAKoKIAgAAAEIAQAAQAAQBAIQQACBAAAEAAEAAIAAQCIQQgIgNAAQAAQAEAgAQgCAQAYAAICBDEIAIAEBAAAQAAAAABAABAAAAAAMAQAAhAQACASACgBCAABMAgAAgABgAAACAAAAIAAAhECIACIAACQQADCAEAAAAQIAAIAACAQAACQkAAgACQAEAAAAAIARAGwAoAAAABgQAAgACARAAAQCBAAIAgACAAAKA4QAQEQQAAAgEQAIABAAIAAIAAAFOABIAGEAgAAAFBACUIBAUAAWgZgAkQCAABMCQAAIoAAA4AgCAAQCLoEAwIAAAgMAAABAAAAAAAAkAAQAJAAAAyQgBIQAAAEggBACAQCgECEgACAAYnQAAEAAIAEgEDAAIQAQARIAAEgAJEQAAAIAAAxIAIAJIACEABMAAAAAAgCAAAAEAAACCFAACAAkAAAAAQAgAAEAAQQAAACAAAAAAABIJCCAQAAAAACAAIAEANAFAAgAAAAoAABAChIAQAQIAAACIACACACAAAhiiCAAAAAgECAACAIAVCAEAAgBAIAAQgAAAoAAEAFAAAFBEAERFABDAAAIAAABAEAICQQQCCSAAAAAAAJQAQBAAAgAAgAIACGAQAAEABBAQAAgAAAAAAAgAAAACIAAGCAAAAAAAKAAAIEBAAAAAAAAAAggAACJgoAABKAAQACBAUAoAEAIiAgAmBIQAIAAAAQgAAABAAAA%3D%3D-T-0-0&oldest_unread_id=0&reset_error_state=false Все ссылки однотипные, но тут возникает два вопроса: 1. в каждой ссылке постоянно меняется max_position (как вот его можно определить?) 2. если делаю парсер со своего домена, то данная подгрузка выдает ошибку
Чтобы подсчитать что-то, не надо это парсить. Сдается мне, через апи можно одним запросом дернуть поиск по слову или хэштегу и получить сразу все, что нужно. Плюс под твитур куча есть ботов-аггрегаторов. И ботов-сборщиков статистики. Работают также через апи, но уже готовы и не требуют написания с нуля. Ищи. А парсить курлом динамически сибираемую, на клиенте рендерящуюся страницу это просто смешно.
@Fell-x27 я же выше писал, что твиттер через апи собирает только посты за последние 7 дней. А платная версия для сбора всех постов стоит дорого. Хранить на хостинге тоже смысла нет. просто суть заключается в том, чтобы подсчитать сколько постов с искомым словом было за все время.