Created
March 16, 2024 19:37
-
-
Save andmerk93/6a15238a9cebacc3c2fba09dd191c574 to your computer and use it in GitHub Desktop.
Скрипт на Selenium, парсит текст 10 твитов
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Скрипт на 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