Skip to content

Instantly share code, notes, and snippets.

@andmerk93
Created March 16, 2024 19:37
Show Gist options
  • Save andmerk93/6a15238a9cebacc3c2fba09dd191c574 to your computer and use it in GitHub Desktop.
Save andmerk93/6a15238a9cebacc3c2fba09dd191c574 to your computer and use it in GitHub Desktop.
Скрипт на Selenium, парсит текст 10 твитов
'''
Скрипт на Selenium, заходит на https://twitter.com/elonmusk/
и парсит текст 10 последних твитов.
Основная логика в функции twitter.
Программа запускает существующую версию firefox,
пристегивает к ней geckodriver, а к нему Selenium.
Прокси для доступа из РФ должно быть настроено в браузере.
При падении завершает процессы, и выводит ошибку в консоль.
Сделано в качестве тестового задания в марте 2024.
'''
from subprocess import Popen
import time
from selenium.webdriver.common.by import By
from selenium.common.exceptions import ElementNotInteractableException
from selenium.webdriver import FirefoxOptions, Keys, Remote
def twitter(driver):
# Время на подключение к прокси
time.sleep(7)
# главная страница
driver.get('https://twitter.com/elonmusk/')
# Пользователь ждёт, пока всё загрузится
time.sleep(10)
# Получаем первые 5 твитов, недостаточно
blocks = driver.find_elements(By.CSS_SELECTOR, "div[data-testid='cellInnerDiv']")
try:
# листаем страницу вниз, подгружаем ещё
blocks[-1].send_keys(Keys.ARROW_DOWN)
except ElementNotInteractableException:
# Ожидаемое поведение.
# Селениум споткнулся,
# считает, что тег div не может
# взаимодействовать со стрелкой вниз
# на клавиатуре, но твиты подгружает
pass
# Получаем 11 твитов
time.sleep(3)
blocks = driver.find_elements(By.CSS_SELECTOR, "div[data-testid='cellInnerDiv']")
text_list = []
# Берём только 10
for block in blocks[:10]:
# Получаем весь текст
# в блоке одного твита
# и разбиваем
tweet = block.text.split('\n')
# Условие для закреплённого твита
if len(tweet) == 10:
text_list.append(tweet[5])
# Некоторые твиты без текста,
# только картинки,
# тогда [4] укажет на репосты,
# типа "65 тыс."
elif 'тыс.' not in tweet[4]:
text_list.append(tweet[4])
else:
text_list.append('NO TEXT')
# Построчный вывод на 80 строке
return text_list
def runner():
firefox = Popen(
('C:\\Program Files\\Mozilla Firefox\\firefox.exe', '-start-debugger-server', '2828', '-marionette')
)
geckodriver = Popen(
('D:\\python\\geckodriver.exe', '--connect-existing', '--marionette-port', '2828')
)
driver = Remote(
command_executor='http://127.0.0.1:4444',
options=FirefoxOptions()
)
try:
# Выводим построчно
print(*twitter(driver), sep='\n',)
except Exception as exc:
print('Unexpected error')
print(exc)
# Отлов всех остальных ошибок
# с выводом в консоль
geckodriver.terminate()
firefox.terminate()
if __name__ == '__main__':
runner()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment