Парсинг Twitter с помощью Python
Table Of Content
- Подготовка необходимых компонентов
- Установка
- Тестирование настройки
- Что именно мы собираемся извлечь со страницы Twitter?
- Давайте начнем парсить Twitter
- Извлечение имени профиля
- Извлечение профиля
- Извлечение профиля пользователя
- Извлечение категории профиля, ссылки на веб-сайт и даты присоединения
- Извлечение количества подписок и подписчиков
- Полный код
- Использование Scrapingdog для парсинга Twitter
- Заключение
- Дополнительные ресурсы
Все знают, что 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, с помощью которых вы можете собирать любой твит в обычном тексте. Вам даже не придется разбирать данные.
Надеюсь, вам понравился этот небольшой учебник, и если да, то, пожалуйста, не забудьте поделиться им с друзьями и в социальных сетях.
Дополнительные ресурсы
Вот несколько дополнительных ресурсов, которые могут быть полезны во время вашего путешествия по парсингу: