CoderCastrov logo
CoderCastrov
Твиттер

Парсинг Twitter с помощью Python

Парсинг Twitter с помощью Python
просмотров
8 мин чтение
#Твиттер

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

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

В этой статье мы собираемся парсить twitter.com с помощью Python и Selenium.

Подготовка необходимых компонентов

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

Также создайте папку, в которой будете хранить скрипт на Python. Затем создайте файл Python, в котором будете писать код.

mkdir twitter

Затем создайте файл Python внутри этой папки. Я называю его twitter.py. Вы можете использовать любое имя, которое вам нравится.

Кроме того, нам нужно скачать сторонние библиотеки, такие как BeautifulSoup (BS4), Selenium и драйвер chromium.

Установка

Для установки BeautifulSoup используйте следующую команду.

pip install beautifulsoup4

Для установки Selenium используйте следующую команду.

pip install selenium

Selenium - популярный инструмент для парсинга веб-страниц, который используется для автоматизации веб-браузеров. Он часто используется для взаимодействия с динамическими веб-сайтами, где содержимое сайта изменяется в зависимости от взаимодействия пользователя или других событий.

BS4 поможет нам разобрать данные из сырого HTML, которые мы собираемся загрузить с помощью Selenium.

Не забудьте, что вам понадобится такая же версия драйвера Chromium, как и ваш браузер Chrome. В противном случае он не будет работать.

Тестирование настройки

Чтобы убедиться, что все работает исправно, мы настроим наш скрипт на Python и протестируем его, загрузив данные с этой страницы.

from bs4 import BeautifulSoup
from selenium import webdriver
import time



PATH = 'C:\Program Files (x86)\chromedriver.exe'



target_url = "https://twitter.com/scrapingdog"


driver=webdriver.Chrome(PATH)

driver.get(target_url)
time.sleep(5)



resp = driver.page_source
driver.close()

print(resp)

Давайте пошагово разберем, что означает каждая строка.

  • Первые три строки импортируют необходимые библиотеки: BeautifulSoup для парсинга HTML и XML, Selenium для автоматизации веб-браузеров и time для установки задержки.
  • Четвертая строка устанавливает путь к исполняемому файлу chromedriver. Это местоположение, где установлен ваш драйвер Chrome.
  • Затем пятая строка устанавливает целевой URL на страницу Scrapingdog Twitter, которую мы хотим спарсить.
  • Шестая строка создает новый экземпляр ChromeDriver, используя путь, указанный в переменной PATH.
  • Затем, используя метод .get() браузера Selenium, мы переходим на целевую страницу.
  • Следующая строка устанавливает задержку в 5 секунд, чтобы страница полностью загрузилась перед продолжением скрипта.
  • С помощью функции .page_source мы получаем HTML-контент текущей страницы и сохраняем его в переменной resp.
  • Затем, используя метод .close(), мы закрываем окно браузера. Этот шаг позволит избежать сбоя сервера, если вы собираетесь делать несколько запросов одновременно.
  • Последняя строка выводит HTML-контент страницы в консоль.

После запуска этого кода вы получите сырой HTML-код в консоли.

Что именно мы собираемся извлечь со страницы Twitter?

Всегда лучше заранее решить, что именно вы хотите извлечь со страницы. В этом руководстве мы собираемся собрать следующие данные:

  • Имя профиля
  • Имя пользователя
  • Описание профиля
  • Категория профиля
  • URL веб-сайта
  • Дата присоединения
  • Количество подписчиков
  • Количество подписок

Я выделил эти данные на приведенном выше изображении. Если у вас возникнут вопросы, обратитесь к нему.

Давайте начнем парсить Twitter

Продолжая с предыдущего кода, мы сначала найдем расположение каждого элемента, а затем извлечем их с помощью BS4. Мы будем использовать методы .find() и .find_all(), предоставляемые BS4. Если вы хотите узнать больше о BS4, вы можете обратиться к руководству по BeautifulSoup.

Сначала давайте начнем с поиска позиции имени профиля.

Извлечение имени профиля

Как обычно, нам нужно воспользоваться инструментами разработчика Chrome. Мы должны проверить элемент и затем найти точное местоположение.

Здесь вы увидите, что есть четыре элемента с тегом div и классом r-1vr29t4, но имя профиля находится первым в списке. Как вы знаете, функция .find() в BS4 - это метод, используемый для поиска и извлечения первого вхождения определенного HTML-элемента в разобранный документ.

С помощью этого метода мы можем очень легко извлечь имя профиля.

l=list()
o={}

soup=BeautifulSoup(resp,'html.parser')

try:
    o["profile_name"]=soup.find("div",{"class":"r-1vr29t4"}).text
except:
    o["profile_name"]=None
  • Здесь мы объявили пустой список l и пустой объект o.
  • Затем мы создали объект BeautifulSoup. Результирующий объект soup является экземпляром класса BeautifulSoup, который предоставляет несколько методов для поиска и манипулирования разобранным HTML-документом.
  • Затем, используя метод .find(), мы извлекаем текст.

Пока ничего сложного. Довольно просто.

Извлечение профиля

Для извлечения профиля мы будем использовать ту же технику, что мы только что использовали при извлечении имени.

В этом случае имя находится внутри тега div с классом r-1wvb978. Но опять же, есть почти 10 элементов с тем же тегом и классом. Когда вы будете искать этот класс в инструменте разработчика Chrome, вы увидите, что элемент, где хранится имя, является первым в списке из этих 10 элементов. Поэтому, используя метод .find(), мы можем извлечь первое вхождение HTML элемента.

try:
    o["profile_handle"]=soup.find("div",{"class":"r-1wvb978"}).text
except:
    o["profile_handle"]=None

С помощью этого кода мы легко можем извлечь имя профиля.

Извлечение профиля пользователя

Это довольно просто.

Как вы можете видеть, биография профиля хранится в теге div с атрибутом data-testid и значением UserDescription.

try:
    o["profile_bio"]=soup.find("div",{"data-testid":"UserDescription"}).text
except:
    o["profile_bio"]=None

Извлечение категории профиля, ссылки на веб-сайт и даты присоединения

Как вы можете видеть, все три элемента данных хранятся внутри этого тега div с атрибутом data-testid и значением UserProfileHeader_Items. Поэтому наша первая задача - найти его.

profile_header = soup.find("div",{"data-testid":"UserProfileHeader_Items"})

Теперь вы заметите, что категория профиля хранится внутри тега span с атрибутом data-testid и значением UserProfessionalCategory.

Мы можем использовать метод .find() для поиска этого элемента внутри объекта profile_header.

try:
    o["profile_category"]=profile_header.find("span",{"data-testid":"UserProfessionalCategory"}).text
except:
    o["profile_category"]=None

Аналогично, вы можете видеть, что ссылка на веб-сайт хранится внутри тега a. Поэтому мне просто нужно найти тег a внутри profile_header.

try:
    o["profile_website"]=profile_header.find('a').get('href')
except:
    o["profile_website"]=None

Я использовал метод .get() из BS4 для получения значения атрибута из объекта тега.

Дата присоединения также может быть найдена внутри profile_header с тегом span и атрибутом data-testid и значением UserJoinDate.

try:
    o["profile_joining_date"]=profile_header.find("span",{"data-testid":"UserJoinDate"}).text
except:
    o["profile_joining_date"]=None

Извлечение количества подписок и подписчиков

Элементы "подписки" и "подписчики" можно найти внутри тега a с классом r-rjixqe. Вы найдете семь таких элементов. Я даже выделил их на приведенном выше изображении. Однако количество подписок и подписчиков находятся в первых двух элементах. Поэтому все, что нам нужно сделать, это использовать метод .find_all() из BS4. Помните, что .find_all() всегда возвращает список элементов, соответствующих заданным критериям.

try:
    o["profile_following"]=soup.find_all("a",{"class":"r-rjixqe"})[0].text
except:
    o["profile_following"]=None

try:
    o["profile_followers"]=soup.find_all("a",{"class":"r-rjixqe"})[1].text
except:
    o["profile_followers"]=None

Я использовал **0** для количества подписок, потому что это первый элемент в списке, и **1** для подписчиков, потому что это второй элемент в списке.

Таким образом, наш процесс парсинга Twitter и извлечения нескольких данных завершен.

Полный код

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

from bs4 import BeautifulSoup
from selenium import webdriver
import time



PATH = 'C:\Program Files (x86)\chromedriver.exe'



l=list()
o={}

target_url = "https://twitter.com/scrapingdog"


driver=webdriver.Chrome(PATH)

driver.get(target_url)
time.sleep(2)



resp = driver.page_source
driver.close()

soup=BeautifulSoup(resp,'html.parser')

try:
    o["profile_name"]=soup.find("div",{"class":"r-1vr29t4"}).text
except:
    o["profile_name"]=None

try:
    o["profile_handle"]=soup.find("div",{"class":"r-1wvb978"}).text
except:
    o["profile_handle"]=None

try:
    o["profile_bio"]=soup.find("div",{"data-testid":"UserDescription"}).text
except:
    o["profile_bio"]=None

profile_header = soup.find("div",{"data-testid":"UserProfileHeader_Items"})

try:
    o["profile_category"]=profile_header.find("span",{"data-testid":"UserProfessionalCategory"}).text
except:
    o["profile_category"]=None

try:
    o["profile_website"]=profile_header.find('a').get('href')
except:
    o["profile_website"]=None

try:
    o["profile_joining_date"]=profile_header.find("span",{"data-testid":"UserJoinDate"}).text
except:
    o["profile_joining_date"]=None

try:
    o["profile_following"]=soup.find_all("a",{"class":"r-rjixqe"})[0].text
except:
    o["profile_following"]=None

try:
    o["profile_followers"]=soup.find_all("a",{"class":"r-rjixqe"})[1].text
except:
    o["profile_followers"]=None


l.append(o)

print(l)

После запуска этого кода вы получите следующий вывод.

Использование Scrapingdog для парсинга Twitter

Преимущества использования Scrapingdog:

  • Вам больше не нужно управлять заголовками.
  • Каждый запрос будет выполняться через новый IP. Это обеспечивает анонимность вашего IP-адреса.
  • Наш API автоматически повторит запрос, если первый не удался.
  • Scrapingdog использует резиденциальные прокси для парсинга Twitter. Это повышает успешность парсинга Twitter или любого другого подобного веб-сайта.

Вам нужно зарегистрироваться для бесплатного аккаунта, чтобы начать использовать его. Вам потребуется всего 10 секунд, чтобы начать работу с Scrapingdog.

После регистрации вы будете перенаправлены на свою панель управления. Панель управления будет выглядеть примерно так.

Вам нужно использовать свой API-ключ.

Теперь вы можете вставить ссылку на вашу страницу Twitter слева, а затем выбрать JS Rendering как Yes. После этого нажмите Copy Code справа. Теперь используйте этот API в своем скрипте для парсинга Twitter.

from bs4 import BeautifulSoup
import requests



l=list()
o={}


resp=requests.get('https://api.scrapingdog.com/scrape?api_key=xxxxxxxxxxxxxxxxxxxx&url=https://twitter.com/scrapingdog')



soup=BeautifulSoup(resp.text,'html.parser')

try:
    o["profile_name"]=soup.find("div",{"class":"r-1vr29t4"}).text
except:
    o["profile_name"]=None

try:
    o["profile_handle"]=soup.find("div",{"class":"r-1wvb978"}).text
except:
    o["profile_handle"]=None

try:
    o["profile_bio"]=soup.find("div",{"data-testid":"UserDescription"}).text
except:
    o["profile_bio"]=None

profile_header = soup.find("div",{"data-testid":"UserProfileHeader_Items"})

try:
    o["profile_category"]=profile_header.find("span",{"data-testid":"UserProfessionalCategory"}).text
except:
    o["profile_category"]=None

try:
    o["profile_website"]=profile_header.find('a').get('href')
except:
    o["profile_website"]=None

try:
    o["profile_joining_date"]=profile_header.find("span",{"data-testid":"UserJoinDate"}).text
except:
    o["profile_joining_date"]=None

try:
    o["profile_following"]=soup.find_all("a",{"class":"r-rjixqe"})[0].text
except:
    o["profile_following"]=None

try:
    o["profile_followers"]=soup.find_all("a",{"class":"r-rjixqe"})[1].text
except:
    o["profile_followers"]=None


l.append(o)

print(l)

С помощью Scrapingdog вам больше не нужно беспокоиться о драйверах Chrome. Они будут автоматически обработаны для вас. Вам просто нужно сделать обычный GET-запрос к API.

С помощью Scrapingdog вы сможете парсить Twitter с молниеносной скоростью, не боясь быть заблокированным.

Заключение

В этой статье нам удалось собрать определенные данные профиля Twitter. С помощью той же техники парсинга вы можете собирать общедоступные твиты и информацию о профиле с Twitter.

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

Надеюсь, вам понравился этот небольшой учебник, и если да, то, пожалуйста, не забудьте поделиться им с друзьями и в социальных сетях.

Дополнительные ресурсы

Вот несколько дополнительных ресурсов, которые могут быть полезны во время вашего путешествия по парсингу: