За последние 24 часа нас посетили 22912 программистов и 1260 роботов. Сейчас ищут 754 программиста ...

Как спарсть все твиты если они подгружаются при прокрутке?

Тема в разделе "Прочие вопросы по PHP", создана пользователем Medvedoc, 1 дек 2018.

  1. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    Добрый вечер, уважаемые форумчане!
    Пытаюсь спарсить все твиты из поисковой выдачи самого twitter по конкретному запросу.
    Например, https://twitter.com/search?q=тостер&src=typd

    Для парсинга использовал curl
    PHP:
    1. <?php
    2. $ch = curl_init();
    3.   CURLOPT_URL => "https://twitter.com/search?src=typd&q=redsurf",
    4.   CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0',
    5.   CURLOPT_AUTOREFERER => true, // имитация передачи реферера при редиректе
    6.   CURLOPT_ENCODING => "", // поддержка декодировния результата: identity, deflate и gzip
    7.   CURLOPT_HEADER => false, // отключение заголовков из вывода
    8.   CURLOPT_RETURNTRANSFER => true, // результат в curl_exec()
    9.   CURLOPT_CONNECTTIMEOUT => 60, // ограничение времени соединения
    10.   CURLOPT_TIMEOUT => 60, // ограничение времени выполнения cURL функции
    11.   CURLOPT_FOLLOWLOCATION => true, // следовать по редиректам
    12.   CURLOPT_MAXREDIRS => 5, // максимальное кол-во редиректов
    13.   CURLOPT_SSL_VERIFYPEER => false, // отключение проверки сертификата узла
    14.   CURLOPT_SSL_VERIFYHOST => false, // отключение проверки сертификата хоста
    15. ));
    16. $content = curl_exec($ch);
    17. $errno = curl_errno($ch);
    18. $error = curl_error($ch);
    19. $info = curl_getinfo($ch);
    20. echo $content;
    21. echo $info;
    22.  
    23. ?>

    Но загружаются не все твиты, а позади есть кнопка для подгрузки остальных.

    В самом твиттере посмотрел что происходит при подгрузке следующих твиттов. Там отправляется GET-запрос по ссылкам:
    Код (Text):
    1. 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):
    1. 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 твитов
     
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  3. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @nospiou, а при чем тут хакеры? С композером не приходилось работать.
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    Не понял, причем тут композер.
    По теме сам же сказал что нужно доп параметры передавать, так и делай в цикле запросы для получения порциями относительно данного параметра
     
  5. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @ADSoft, про композер предназначалось для @nospiou. Просто он ссылку прислал на библиотеку на api. Но и с api не хотелось бы связываться из-за ограничений.
    Что касается запросов в цикле, то я написал выше, что параметр max-position всегда разный и я не знаю как его определить.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.823
    Симпатии:
    736
    Адрес:
    Татарстан
    все-же апи предпочтительнее
    п 2 как раз легко лечится тем что через цикл запрашиваешь следующие 100, потом еще 100 и так - сколько нужно
    дума и п 1 как-то регулируется, стоит только почитать

    а ответ типа не умею - не хочу.... имхо недостоин для программиста
     
  7. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    API может и предпочтительнее, но дельного решения своей задачи не нашел. Я попытался парсить выдачу поискового запроса в twitter по слову redsurf. С этой целью использовал библиотеку https://github.com/selimhallac/Twitter-API-Search-Tweets-or-Hashtags. Но поиск выдал мне всего лишь один результат, в то время как в самом twitter их гораздо больше https://twitter.com/search?q=redsurf&src=typd.
    Тогда что я не так делаю, что у меня не получается? Да и в API свои ограничения, о которых писал выше.
     
  8. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    если использовать api, то для поиска нужно использовать версию enterprise. Вроде в ней есть подобное решение, но в интернете примеров не нашел в данном направлении.
     
  9. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    На данном форуме запрещены темы парсинга в обход API.
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @acho Да пускай мучается. Напишет парсер. Попадет в бан за частые запросы. И сделает как нужно.
     
  11. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @acho, хорошо учту.
    @nospiou, я вроде в последнем своем посте указал, что если использовать API, то только в режиме ENTERPRISE. Но мои поиски на ютубе и в просторах интеренета не дали результата, поскольку нет примеров. Если Вы разбираетесь в API, то просто приведите пример. Потому что я если честно пока не пойму как мне применить enterprise к той библиотеке, о которой я указал выше.
     
  12. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Точно так же как и обычным. Просто будет платно. Регистрируйся оплачивай. И вперед
    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
     
  13. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @nospiou спасибо ))) только не нашел информацию по точной стоимости ) а может есть на гитхабе готовые библиотеки?
     
  14. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
  15. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @nospiou, ох е-мое ))) проще отказаться от затеи с premium и enterprise

    А со стандартной я так понимаю только за последние 7 дней можно получить твиты. Позже уже никак?
    --- Добавлено ---
    поэтому я и хотел через curl парсить, но блокировка меня явно не радует
     
  16. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну а зачем тебе старье. Парси и сохраняй себе в бд
     
  17. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @nospiou, не все так просто ) слова могут часто меняться и мне необходимо было определить количество постов на заданное слово.
    --- Добавлено ---
    а блокировка я так понимаю происходит за частые обращения. Может попробовать выставить задержку? или смену прокси с юзерагентом?
    Просто дело в том, что я не знаю как подгружать следующие посты при обычном парсинге.
     
  18. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @Medvedoc Лучше создать свой интересный проект. Ты ж наверное б не хотел что б другие нагружали твои сервера воруя контент?
     
    Medvedoc нравится это.
  19. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @nospiou, мне не совсем посты нужны. У меня в планах подсчитать количество данных постов. А решение данной задачи я вижу именно только в парсинге через curl, поскольку API имеет ограничения.
    --- Добавлено ---
    Просмотрев в браузере как twitter подгружает новую пачку твитов, увидел get запрос
    Код (Text):
    1. 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. если делаю парсер со своего домена, то данная подгрузка выдает ошибку
     
  20. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Чтобы подсчитать что-то, не надо это парсить. Сдается мне, через апи можно одним запросом дернуть поиск по слову или хэштегу и получить сразу все, что нужно. Плюс под твитур куча есть ботов-аггрегаторов. И ботов-сборщиков статистики. Работают также через апи, но уже готовы и не требуют написания с нуля. Ищи. А парсить курлом динамически сибираемую, на клиенте рендерящуюся страницу это просто смешно.
     
  21. Medvedoc

    Medvedoc Активный пользователь

    С нами с:
    17 окт 2011
    Сообщения:
    65
    Симпатии:
    0
    @Fell-x27 я же выше писал, что твиттер через апи собирает только посты за последние 7 дней. А платная версия для сбора всех постов стоит дорого. Хранить на хостинге тоже смысла нет.
    просто суть заключается в том, чтобы подсчитать сколько постов с искомым словом было за все время.
     
  22. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну...увы, не все в этой жизни реализуемо. По крайней мере бесплатно.