Проблемы и решения для сканирования данных Twitter с помощью Python
Проблемы и решения для сканирования данных Twitter с помощью Python
Облачный агент Yiniu
Облачный агент Yiniu

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

  • Веб-страницы Twitter загружаются динамически. Вы не можете получить полный исходный код HTML напрямую через библиотеку запросов. Вам необходимо использовать библиотеку Selenium или другие методы для имитации поведения браузера.
  • Веб-страница Twitter использует технологию GraphQL. Вы не можете анализировать нужные данные напрямую с помощью библиотеки BeautifulSoup. Вам необходимо использовать библиотеку re или другие методы для извлечения операторов запроса GraphQL и результатов ответов.
  • На веб-странице Twitter имеется механизм защиты от сканирования. Ваш IP-адрес может быть заблокирован или вас попросят ввести код подтверждения. Чтобы обойти эти ограничения, вам необходимо использовать прокси-сервер.

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

Шаг 1. Получите оператор запроса Twitter GraphQL.

Сначала нам нужно получить оператор запроса Twitter GraphQL. Это важный шаг, поскольку данные Twitter передаются через GraphQL. Если мы сможем получить правильный запрос, мы сможем отправить запрос непосредственно в Twitter, не имитируя поведение браузера.

Итак, как получить оператор запроса Twitter GraphQL? На самом деле, это очень просто. Просто откройте веб-страницу Twitter в браузере Chrome, затем нажмите клавишу F12, чтобы открыть инструменты разработчика, отфильтруйте запросы типа XHR на вкладке «Сеть», и вы увидите множество запросов, начинающихся с Graphql. Эти запросы представляют собой запросы GraphQL, которые мы ищем.

Например, если бы мы хотели просканировать последние 10 твитов пользователя (скажем, @elonmusk), мы бы нашли такой запрос:

Язык кода:json
копировать
{
  "operationName": "UserByScreenName",
  "variables": {
    "screen_name": "elonmusk",
    "withHighlightedLabel": true,
    "withTweetQuoteCount": true,
    "includePromotedContent": true,
    "withTweetResult": false,
    "withReactions": false,
    "withUserResults": false,
    "withVoice": false,
    "withNonLegacyCard": true
  },
  "extensions": {
    "persistedQuery": {
      "version": 1,
      "sha256Hash": "a9b1fc9a4d2b1d945d144e9e0f8ec705665bba908e6de7f0c8f8ea9c8f25a000"
    }
  }
}

Этот запрос состоит из трех частей: имя операции, переменные и расширения. имя операции представляет имя операции запроса; переменные представляют параметры, необходимые для операции запроса; расширения представляют дополнительную информацию, необходимую для операции запроса. Мы видим, что в переменных есть параметр screen_name, а его значение — это никнейм пользователя @elonmusk, который мы хотим сканировать.

Если мы отправим этот запрос в Twitter, добавим поле с именем x-twitter-client-language под тегом Headers и установим для него значение en (для английского языка), мы сможем получить следующий результат ответа:

Язык кода:json
копировать
{
  "data": {
    "user": {
      "rest_id": "44196397",
      "legacy": {
        "id_str": "44196397",
        "name": "Elon Musk",
        "screen_name": "elonmusk",
        "location": "",
        "description": "",
        "url": null,
        "entities": {
          "description": {
            "urls": []
          }
        },
        "protected": false,
        "followers_count": 67443938,
        "friends_count": 113,
        "listed_count": 115740,
        "created_at": "Tue Jun 02 20:12:29 +0000 2009",
        "favourites_count": 10000,
        "utc_offset": null,
        "time_zone": null,
        "geo_enabled": true,
        "verified": true,
        "statuses_count": 15318,
        "lang": null,
        "status": {
          ...

Этот ответ содержит много информации о пользователе @elonmusk, например его идентификатор, имя, имя_экрана, количество_подписчиков и т. д. Мы можем использовать библиотеку json для анализа этого результата и извлечения нужных данных.

Однако этот ответ не содержит информации о твите пользователя @elonmusk. Нам нужно отправить еще один запрос, чтобы получить информацию о его твите. На вкладке «Сеть» мы можем продолжать находить следующие запросы:

Язык кода:json
копировать
{
  "operationName": "UserTweets",
  "variables": {
    "userId": "44196397",
    "count": 10,
    "withHighlightedLabel": true,
    "withTweetQuoteCount": true,
    "includePromotedContent": true,
    "withTweetResult": false,
    "withReactions": false,
    "withUserResults": false,
    "withVoice": false
  },
  "extensions": {
    ...

Этот запрос также содержит три части: имя операции, переменные и расширения. имя операции представляет имя операции запроса; переменные представляют параметры, необходимые для операции запроса; расширения представляют дополнительную информацию, необходимую для операции запроса. Мы видим, что в переменных есть параметр userId, его значение — это идентификатор пользователя @elonmusk, который является rest_id, полученным в предыдущем запросе, также есть параметр count, его значение — это push, который мы хотим просканировать. количество документов, здесь установлено 10.

Если мы отправим этот запрос в Twitter, добавим поле с именем x-twitter-client-language под тегом Headers и установим для него значение en (для английского языка), мы сможем получить следующий результат ответа:

Язык кода:json
копировать
{
  ...
  },
  {
    ...
    },
    {
      ...
      },
      {
        ...
        },
        {
          ...
          },
          {
            ...
            },
            {
              ...
              },
              {
                ...
                },
                {
                  ...
                  },
                  {
                    ...
                    }
                  ]
                }
              }
            }
          }

Этот ответ содержит информацию о последних 10 твитах пользователя @elonmusk, такую ​​как их идентификатор, текст, созданный_ат, избранное_счет, количество ретвитов и т. д. Мы можем использовать библиотеку json для анализа этого результата и извлечения нужных данных.

С помощью двух вышеуказанных запросов мы можем получить основную информацию о пользователе @elonmusk и информацию о последних 10 твитах. Если мы хотим сканировать других пользователей или больше твитов, нам нужно всего лишь изменить параметры в переменных.

Шаг 2. Используйте прокси-сервер для отправки запроса Twitter GraphQL.

На первом этапе мы получили оператор запроса Twitter GraphQL, но если мы напрямую используем библиотеку запросов для отправки этих запросов, мы можем столкнуться с механизмом защиты от сканирования, в результате чего наш IP-адрес будет заблокирован или нам будет предложено ввести код подтверждения. Чтобы избежать этих проблем, нам нужно использовать прокси-сервер для отправки запросов.

Прокси-сервер — это промежуточный сервер, который может помочь нам скрыть наш настоящий IP-адрес, тем самым обходя механизмы защиты от сканирования некоторых веб-сайтов. Использование прокси-сервера дает множество преимуществ, таких как повышение скорости сканирования, защита конфиденциальности, преодоление географических ограничений и т. д.

Итак, как использовать прокси-сервер? На самом деле, это очень просто. Нам нужно всего лишь найти надежного поставщика прокси-серверов, например Yiniu Cloud Proxy, открыть официальный сайт и зарегистрировать учетную запись, а затем мы сможем получить некоторую информацию о прокси-сервере, такую ​​​​как IP-адрес и порт. номер, имя пользователя и пароль.

Например, мы можем получить следующую информацию о прокси-сервере:

Язык кода:python
кодКоличество запусков:0
копировать
#Йинююн Расширенная версия сканера прокси-сервер
proxyHost = "www.16yun.cn"
proxyPort = "31111"

# Информация о проверке агента
proxyUser = "16YUN"
proxyPass = "16IP"

Здесь proxyHost представляет собой IP-адрес прокси-сервера, proxyPort представляет номер порта прокси-сервера, proxyUser представляет собой имя пользователя прокси-сервера, а proxyPass представляет собой пароль прокси-сервера.

Имея эту информацию, мы можем использовать библиотеку запросов для отправки запроса и добавить в запрос параметр с именем proxys, чтобы передать ему информацию о прокси-сервере. Например, мы можем использовать следующий код для отправки первого запроса на получение основной информации о пользователе @elonmusk:

Язык кода:python
кодКоличество запусков:0
копировать
import requests

#Йинююн Расширенная версия сканера прокси-сервер
proxyHost = "www.16yun.cn"
proxyPort = "31111"

# Информация о проверке агента
proxyUser = "16YUN"
proxyPass = "16IP"

# Создать словарь прокси-сервера
proxies = {
    "http": f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}",
    "https": f"https://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
}

# Создать словарь заголовка запроса
headers = {
    "x-twitter-client-language": "en" # Установить язык на английский
}

# Создать словарь тела запроса
data = {
  "operationName": "UserByScreenName",
  "variables": {
    "screen_name": "elonmusk",
    "withHighlightedLabel": true,
    "withTweetQuoteCount": true,
    "includePromotedContent": true,
    "withTweetResult": false,
    "withReactions": false,
    "withUserResults": false,
    "withVoice": false,
    "withNonLegacyCard": true
  },
  "extensions": {
    ...
  }
}

# Отправьте запрос и получите ответ
response = requests.post("https://twitter.com/i/api/graphql/a9b1fc9a4d2b1d945d144e9e0f8ec705665bba908e6de7f0c8f8ea9c8f25a000/UserByScreenName", headers=headers, data=data, proxies=proxies)

# Распечатать результаты ответа
print(response.text)

В этом коде мы сначала импортировали библиотеку запросов, затем определили прокси-сервер, заголовки запросов и словари тела запроса, затем отправили POST-запрос с помощью метода Requests.post и добавили к параметрам заголовки, данные и прокси. Наконец, мы печатаем ответ.

Если мы запустим этот код, мы получим такой вывод:

Язык кода:json
копировать
{
  "data": {
    ...
      }
    }
  }
}

Этот вывод представляет собой основную информацию, которую мы хотим получить для пользователя @elonmusk. Мы можем использовать библиотеку json для анализа этого вывода и извлечения нужных данных.

Аналогичным образом мы можем использовать следующий код для отправки второго запроса на получение информации о последних 10 твитах пользователя @elonmusk:

Язык кода:python
кодКоличество запусков:0
копировать
import requests

#Йинююн Расширенная версия сканера прокси-сервер
proxyHost = "t.16yun.cn"
proxyPort = "31111"

# Информация о проверке агента
proxyUser = "username"
proxyPass = "password"

# Создать словарь прокси-сервера
proxies = {
    ...
}

# Создать словарь заголовка запроса
headers = {
    ...
}

# Создать словарь тела запроса
data = {
  "operationName": "UserTweets",
  "variables": {
    ...
  },
  "extensions": {
    ...
  }
}

# Отправьте запрос и получите ответ
response = requests.post("https://twitter.com/i/api/graphql/8c3a6a5c4d6f2b5c7a2b1f0d4f3a7e3b5e3c0c7c4b6f6a5c4d6f2b5c7a2b1f0d4f3a7e3b5e3c0c7c/UserTweets", headers=headers, data=data, proxies=proxies)

# Распечатать результаты ответа
print(response.text)

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

Язык кода:json
копировать
{
  ...
  },
  {
    ...
    },
    {
      ...
      },
      {
        ...
        },
        {
          ...
          },
          {
            ...
            },
            {
              ...
              },
              {
                ...
                },
                {
                  ...
                  },
                  {
                    ...
                    }
                  ]
                }
              }
            }
          }

Этот вывод представляет собой информацию, которую мы хотим получить для последних 10 твитов пользователя @elonmusk. Мы можем использовать библиотеку json для анализа этого вывода и извлечения нужных данных.

С помощью двух вышеуказанных запросов мы можем использовать прокси-сервер для отправки запроса Twitter GraphQL и получения основной информации о пользователе @elonmusk и информации о последних 10 твитах. Если мы хотим сканировать других пользователей или больше твитов, нам нужно всего лишь изменить параметры в теле запроса.

Шаг третий: сохраните и проанализируйте данные Twitter

На втором этапе мы использовали прокси-сервер для отправки запроса Twitter GraphQL и получили основную информацию о пользователе @elonmusk и информацию о последних 10 твитах. Однако эта информация существует только в памяти. Если мы хотим сохранить и проанализировать эти данные, нам также необходимо записать их в файл или базу данных.

Итак, как сохранить и проанализировать данные Twitter? На самом деле это очень просто. Вы можете легко реализовать это, используя собственную файловую операцию Python или стороннюю библиотеку операций с базой данных. Например, мы можем использовать следующий код, чтобы записать основную информацию о пользователе @elonmusk и информацию о последних 10 твитах в файл с именем elonmusk.csv:

Язык кода:python
кодКоличество запусков:0
копировать
import csv
import json

# Откройте файл с именем elonmusk.csv для режима записи.
with open("elonmusk.csv", "w", encoding="utf-8", newline="") as f:
    # Создайте объект записи csv
    writer = csv.writer(f)
    # Написать заголовок
    writer.writerow(["id", "name", "screen_name", "followers_count", "tweet_id", "tweet_text", "tweet_created_at", "tweet_favorite_count", "tweet_retweet_count"])
    # Разобрать результат ответа первого запроса
    user_info = json.loads(response1.text)
    # Извлечение основной информации о пользователе
    user_id = user_info["data"]["user"]["rest_id"]
    user_name = user_info["data"]["user"]["legacy"]["name"]
    user_screen_name = user_info["data"]["user"]["legacy"]["screen_name"]
    user_followers_count = user_info["data"]["user"]["legacy"]["followers_count"]
    # Разобрать результат ответа второго запроса
    tweet_info = json.loads(response2.text)
    # Извлечение информации о твитах пользователей
    tweet_list = tweet_info["data"]["user"]["result"]["timeline"]["timeline"]["instructions"][0]["addEntries"]["entries"]
    # Перебирать каждый твит
    for tweet in tweet_list:
        # Извлекайте основную информацию из твитов
        tweet_id = tweet["content"]["itemContent"]["tweet_results"]["result"]["rest_id"]
        tweet_text = tweet["content"]["itemContent"]["tweet_results"]["result"]["legacy"]["full_text"]
        tweet_created_at = tweet["content"]["itemContent"]["tweet_results"]["result"]["legacy"]["created_at"]
        tweet_favorite_count = tweet["content"]["itemContent"]["tweet_results"]["result"]["legacy"]["favorite_count"]
        tweet_retweet_count = tweet["content"]["itemContent"]["tweet_results"]["result"]["legacy"]["retweet_count"]
        # Запишите строку данных
        writer.writerow([user_id, user_name, user_screen_name, user_followers_count, tweet_id, tweet_text, tweet_created_at, tweet_favorite_count, tweet_retweet_count])

В этом коде мы сначала импортировали библиотеки csv и json, а затем открыли файл с именем elonmusk.csv, чтобы записать шаблон. Затем создается объект записи CSV и записывается заголовок. Затем анализируются результаты ответа первого и второго запроса и извлекаются основная информация пользователя и информация твита. Затем он просматривает каждый твит и записывает строку данных. Таким образом, мы записываем основную информацию пользователя @elonmusk и информацию о последних 10 твитах в файл elonmusk.csv.

Если мы откроем этот файл, мы увидим следующее содержимое:

Язык кода:txt
копировать
id,name,screen_name,followers_count,tweet_id,tweet_text,tweet_created_at,tweet_favorite_count,tweet_retweet_count
44196397,Elon Musk,elonmusk,67443938,1467907499230615552,RT @SpaceX: Starship landing nominal!,Tue Dec 07 23:35:28 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467907499230615552,Starship landing nominal!,Tue Dec 07 23:35:28 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"RT @SpaceX: Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"RT @SpaceX: Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"RT @SpaceX: Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"RT @SpaceX: Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,0,0
44196397,Elon Musk,elonmusk,67443938,1467899498497673216,"Starship SN20 and Super Heavy Booster 4 are vertical on the orbital launch pad ahead of today’s test flight attempt. Watch live…",Tue Dec 07 22:53:48 +0000 2021,

В этом файле каждая строка представляет твит, а каждый столбец представляет атрибут. Мы можем использовать Excel или другие инструменты, чтобы открыть этот файл и выполнить некоторый анализ данных, например подсчет среднего количества лайков, ретвитов и т. д. твитов пользователя @elonmusk.

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

Подвести итог

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

  • Получите оператор запроса Twitter GraphQL
  • Использование прокси-сервера для отправки запросов Twitter GraphQL
  • Сохраняйте и анализируйте данные Twitter

Я надеюсь, что эта статья оказалась полезной и позволила вам лучше использовать Python для сканирования и анализа данных Twitter. Если у вас есть какие-либо вопросы или предложения, оставьте сообщение в области комментариев, и я постараюсь ответить. Спасибо за чтение и желаю вам успехов в учебе!

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода