Вы аналитик данных и хотите использовать Python для сканирования некоторых данных в Твиттере, таких как псевдонимы пользователей, аватары, комментарии, лайки, ретвиты и т. д. Вы думаете, что это должно быть очень просто, и вы можете легко сделать это, используя библиотеку запросов и библиотеку BeautifulSoup. Однако когда вы действительно начинаете писать код, вы обнаруживаете, что все идет не так гладко. Вы столкнулись со следующими проблемами:
Эти проблемы вызывают у вас головную боль, и вы хотите отказаться от проекта. Но не волнуйтесь, я здесь, чтобы предоставить вам простое и эффективное решение, позволяющее использовать Python для сканирования данных Twitter без дублирования или пропуска.
Шаг 1. Получите оператор запроса Twitter GraphQL.
Сначала нам нужно получить оператор запроса Twitter GraphQL. Это важный шаг, поскольку данные Twitter передаются через GraphQL. Если мы сможем получить правильный запрос, мы сможем отправить запрос непосредственно в Twitter, не имитируя поведение браузера.
Итак, как получить оператор запроса Twitter GraphQL? На самом деле, это очень просто. Просто откройте веб-страницу Twitter в браузере Chrome, затем нажмите клавишу F12, чтобы открыть инструменты разработчика, отфильтруйте запросы типа XHR на вкладке «Сеть», и вы увидите множество запросов, начинающихся с Graphql. Эти запросы представляют собой запросы GraphQL, которые мы ищем.
Например, если бы мы хотели просканировать последние 10 твитов пользователя (скажем, @elonmusk), мы бы нашли такой запрос:
{
"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 (для английского языка), мы сможем получить следующий результат ответа:
{
"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. Нам нужно отправить еще один запрос, чтобы получить информацию о его твите. На вкладке «Сеть» мы можем продолжать находить следующие запросы:
{
"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 (для английского языка), мы сможем получить следующий результат ответа:
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
}
]
}
}
}
}
Этот ответ содержит информацию о последних 10 твитах пользователя @elonmusk, такую как их идентификатор, текст, созданный_ат, избранное_счет, количество ретвитов и т. д. Мы можем использовать библиотеку json для анализа этого результата и извлечения нужных данных.
С помощью двух вышеуказанных запросов мы можем получить основную информацию о пользователе @elonmusk и информацию о последних 10 твитах. Если мы хотим сканировать других пользователей или больше твитов, нам нужно всего лишь изменить параметры в переменных.
Шаг 2. Используйте прокси-сервер для отправки запроса Twitter GraphQL.
На первом этапе мы получили оператор запроса Twitter GraphQL, но если мы напрямую используем библиотеку запросов для отправки этих запросов, мы можем столкнуться с механизмом защиты от сканирования, в результате чего наш IP-адрес будет заблокирован или нам будет предложено ввести код подтверждения. Чтобы избежать этих проблем, нам нужно использовать прокси-сервер для отправки запросов.
Прокси-сервер — это промежуточный сервер, который может помочь нам скрыть наш настоящий IP-адрес, тем самым обходя механизмы защиты от сканирования некоторых веб-сайтов. Использование прокси-сервера дает множество преимуществ, таких как повышение скорости сканирования, защита конфиденциальности, преодоление географических ограничений и т. д.
Итак, как использовать прокси-сервер? На самом деле, это очень просто. Нам нужно всего лишь найти надежного поставщика прокси-серверов, например Yiniu Cloud Proxy, открыть официальный сайт и зарегистрировать учетную запись, а затем мы сможем получить некоторую информацию о прокси-сервере, такую как IP-адрес и порт. номер, имя пользователя и пароль.
Например, мы можем получить следующую информацию о прокси-сервере:
#Йинююн Расширенная версия сканера прокси-сервер
proxyHost = "www.16yun.cn"
proxyPort = "31111"
# Информация о проверке агента
proxyUser = "16YUN"
proxyPass = "16IP"
Здесь proxyHost представляет собой IP-адрес прокси-сервера, proxyPort представляет номер порта прокси-сервера, proxyUser представляет собой имя пользователя прокси-сервера, а proxyPass представляет собой пароль прокси-сервера.
Имея эту информацию, мы можем использовать библиотеку запросов для отправки запроса и добавить в запрос параметр с именем proxys, чтобы передать ему информацию о прокси-сервере. Например, мы можем использовать следующий код для отправки первого запроса на получение основной информации о пользователе @elonmusk:
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 и добавили к параметрам заголовки, данные и прокси. Наконец, мы печатаем ответ.
Если мы запустим этот код, мы получим такой вывод:
{
"data": {
...
}
}
}
}
Этот вывод представляет собой основную информацию, которую мы хотим получить для пользователя @elonmusk. Мы можем использовать библиотеку json для анализа этого вывода и извлечения нужных данных.
Аналогичным образом мы можем использовать следующий код для отправки второго запроса на получение информации о последних 10 твитах пользователя @elonmusk:
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)
В этом абзаце код,Нам нужно только изменить словарь тела запроса.,Все остальное аналогично первому запросу. Если мы запустим этот код, мы получим такой вывод:
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
},
{
...
}
]
}
}
}
}
Этот вывод представляет собой информацию, которую мы хотим получить для последних 10 твитов пользователя @elonmusk. Мы можем использовать библиотеку json для анализа этого вывода и извлечения нужных данных.
С помощью двух вышеуказанных запросов мы можем использовать прокси-сервер для отправки запроса Twitter GraphQL и получения основной информации о пользователе @elonmusk и информации о последних 10 твитах. Если мы хотим сканировать других пользователей или больше твитов, нам нужно всего лишь изменить параметры в теле запроса.
Шаг третий: сохраните и проанализируйте данные Twitter
На втором этапе мы использовали прокси-сервер для отправки запроса Twitter GraphQL и получили основную информацию о пользователе @elonmusk и информацию о последних 10 твитах. Однако эта информация существует только в памяти. Если мы хотим сохранить и проанализировать эти данные, нам также необходимо записать их в файл или базу данных.
Итак, как сохранить и проанализировать данные Twitter? На самом деле это очень просто. Вы можете легко реализовать это, используя собственную файловую операцию Python или стороннюю библиотеку операций с базой данных. Например, мы можем использовать следующий код, чтобы записать основную информацию о пользователе @elonmusk и информацию о последних 10 твитах в файл с именем elonmusk.csv:
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.
Если мы откроем этот файл, мы увидим следующее содержимое:
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 без дублирования или пропуска. Я представил следующие три шага соответственно:
Я надеюсь, что эта статья оказалась полезной и позволила вам лучше использовать Python для сканирования и анализа данных Twitter. Если у вас есть какие-либо вопросы или предложения, оставьте сообщение в области комментариев, и я постараюсь ответить. Спасибо за чтение и желаю вам успехов в учебе!