Close

Працюємо з Selenium для автоматизації задач у веб-браузері

У цій статті я розкажу як з допомогою Python та Selenium можна автоматизувати деякі задачі у веб-браузері в операційній системі Linux.

Моя проблема полягала у тому, що соцмережа LinkedIn не надає користувачам розширеного керування своїми дописами. За 5 років у мене назбиралося більше 1000 дописів, тому гортати і скролити їх всіх просто не було сенсу. Вбудований експорт даних LinkedIn теж не дав мені бажаних результатів.

Я почав думати і шукати ідеї як їх спарсити. Невдовзі штучний інтелект привів мене до вирішення цієї задачі з допомогою Selenium WebDriver для браузера Chrome. 

Зміст статті

Що таке Selenium?

Selenium WebDriver logoSelenium – це безкоштовний інструмент з відкритим кодом для автоматизації та тестування веб-додатків, розроблений Джейсоном Хуггінсом. Інструмент складається з різних модулів: Selenium IDE, Selenium Grid, Selenium Standalone Server і Selenium WebDriver.

В основу Selenium WebDriver покладено кросплатформний веб-драйвер, який допомагає здійснювати віддалене керування браузером на основі команд на рівні операційної системи (Selenium Remote Control (RC)). Підтримуються усі доступні на сьогоднішній день браузери: Chrome, Safari, Firefox, Internet Explorer та інші. Драйвер інтегрується з іншими додатками, наприклад Jenkis.

Selenium підтримує чимало мов програмування – C#, Java, JavaScript, Node.js, Python , PHP, .NET, Perl, Ruby, Groovy, Scala. Сумісний з усіма операційними системами – Windows, Linux, MacOS, Android.

Застосовують Selenium – розробники, тестувальники, фахівці з кібербезпеки, системні адміністратори для автоматизації різноманітних задач у браузері, наприклад веб-скрапінгу та парсингу, автоматичного виконання скриптів та сценаріїв.

Selenium WebDriver підтримує такі команди:

  • Команди браузера: get, getTitle, getCurrentUrl.
  • Команди навігації в браузері: назад, вперед, до, оновити.
  • Команди WebElement: clean, click, getText, sendKeys.
  • Команди FindElements: findElement() з параметром як локатор або об’єкт запиту.

Веб-скрапінг стрічки LinkedIn з допомогою Selenium WebDriver: покрокове керівництво

1. Найперше, треба завантажити та встановити Chromedriver останньої версії:
https://chromedriver.chromium.org/downloads
https://googlechromelabs.github.io/chrome-for-testing/

Розпакувати драйвер потрібно в системну папку: /usr/bin/

2. Тепер треба встановити браузер Google Chrome Stable і всі необхідні компоненти та бібліотеки до нього:

sudo apt-get install google-chrome-stable
sudo apt-get install libnss3
sudo apt-get install libnss3-dev

3. Далі створюємо файл з розширенням python зі скриптом, який треба автоматизувати.

Користуючись підказками штучного інтелекту, пройшовши велику кількість виправлень, мені вдалося прийти до робочої версії Python-скрипту, який автоматично скролить і парсить стрічку дописів користувача LinkedIn в файл HTML, який потім можна відкрити у будь-якому браузері і переглянути.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time

# Шлях до chromedriver
chromedriver_path = '/usr/bin/chromedriver'

# Створення екземпляру браузера
options = webdriver.ChromeOptions()
options.binary_location = "/usr/bin/google-chrome-stable"
options.add_argument(f"webdriver.chrome.driver={chromedriver_path}")
driver = webdriver.Chrome(options=options)

# Перехід на сторінку входу в LinkedIn
driver.get("https://www.linkedin.com/login")

# Автоматичне введення облікових даних для входу в акаунт
email_input = driver.find_element(By.ID, 'username')
email_input.send_keys("xxx@xxxxxxxx")
password_input = driver.find_element(By.ID, 'password')
password_input.send_keys("xxxxxxxxxxxxxxxxxxxxxxxx")
login_button = driver.find_element(By.XPATH, '//button[@type="submit"]')
login_button.click()

# Очікування завантаження сторінки LinkedIn
WebDriverWait(driver, 10).until(EC.title_contains("LinkedIn"))

# Перехід на сторінку з дописами LinkedIn вказаного користувача
driver.get("https://www.linkedin.com/in/username/recent-activity/all/")

# Автоматичне прокручування сторінки
def scroll_to_bottom():
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # Зачекайте, поки loader не зникне
    WebDriverWait(driver, 10).until_not(EC.visibility_of_element_located((By.XPATH, '//div[@class="artdeco-loader"]')))
    # Почекайте, поки не завантажаться нові дописи
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, '//div[contains(@class, "feed-shared-update-v2")]')))

# Початкова кількість дописів перед спробою прокрутки
initial_post_count = len(driver.find_elements(By.XPATH, '//div[contains(@class, "feed-shared-update-v2")]'))

# Лічильник помилок при спробах прокрутки
error_count = 0

# Таймаут для завершення прокрутки після виявлення, що нові дописи не завантажуються
timeout = 100  # Можете задати свій бажаний таймаут

# Прокрутка сторінки для завантаження нових дописів
while True:
    try:
        scroll_to_bottom()
        current_post_count = len(driver.find_elements(By.XPATH, '//div[contains(@class, "feed-shared-update-v2")]'))
        if current_post_count == initial_post_count:
            error_count += 1
            if error_count > 2:
                break  # Якщо не завантажено нових дописів протягом кількох спроб, вийти з циклу
        else:
            initial_post_count = current_post_count
            error_count = 0  # Скидання лічильника помилок при кожному новому дописі

            # Пройдемося по кожному допису та скопіюємо посилання
            posts = driver.find_elements(By.XPATH, '//div[contains(@class, "feed-shared-update-v2")]')
            for post in posts:
                # Знаходимо елемент меню керування для кожного допису
                control_menu = post.find_element(By.XPATH, './/div[contains(@class, "feed-shared-update-v2__control-menu")]')

                # Спробуємо клікнути на меню керування за допомогою ActionChains
                ActionChains(driver).move_to_element(control_menu).click().perform()

                # Зачекати, щоб меню з'явилося (опційно, ви можете адаптувати таймаут)
                WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, './/div[contains(@class, "feed-shared-update-v2__control-menu")]')))

                # Знаходимо кнопку "Copy link to post"
                copy_link_button = post.find_element(By.XPATH, './/button[contains(@aria-label, "Copy link to post")]')

                # Спробуємо клікнути на кнопку "Copy link to post" за допомогою ActionChains
                ActionChains(driver).move_to_element(copy_link_button).click().perform()

                # Зачекати, щоб меню зникло (опційно, ви можете адаптувати таймаут)
                WebDriverWait(driver, 5).until_not(EC.presence_of_element_located((By.XPATH, './/div[contains(@class, "feed-shared-update-v2__control-menu")]')))

    except Exception as e:
        pass  # Продовжити спроби прокрутки навіть у разі помилок

# Отримати HTML сторінки з дописами
html_content = driver.page_source

# Зберегти HTML у файл
with open("linkedin_posts.html", "w", encoding="utf-8") as file:
    file.write(html_content)

# Закриття браузера після завершення
driver.quit()

👉 Завантажити готовий скрипт на нашому GitHub>>

Висновки

Таким чином мені вдалось на повному “автоматі” вивантажити всю свою стрічку дописів LinkedIn 5 річної давності з повним збереженням верстки, медіаконтенту, посиланнями, вертикальною прокруткою. Такий веб-документ легко можна скопіювати та повторно відкрити, переглянути, дослідити. Я думаю, що подібним чином можна вивантажувати історію дописів й інших учасників LinkedIn, якщо їх сторінки відкриті.

Web Scraper LinkedIn

Scraped LinkedIn feed posts

Що ж, Selenium – надзвичайно корисний та потужний інструмент автоматизації.

Експерементуйте з ним і відкриєте для себе безліч нових можливостей!

ПОДІЛИТИСЬ У СОЦМЕРЕЖАХ:

0 0 голосів
Рейтинг статті
Підписатися
Сповістити про
guest
0 Коментарі
Вбудовані Відгуки
Переглянути всі коментарі
0
Цікаво почути Вашу думку!x
Отримати комерційну пропозицію
Оформити заявку
Замовити консультацію

Заповніть, будь ласка, форму й наш спеціаліст зв’яжеться з Вами та надасть безкоштовну консультацію!

Замовити дзвінок

Вкажіть, будь ласка, контактний номер телефону. Наш менеджер миттєво зв’яжеться з Вами!