CoderCastrov logo
CoderCastrov
Парсер

Давайте сделаем немного парсинга с помощью Selenium!

Давайте сделаем немного парсинга с помощью Selenium!
просмотров
4 мин чтение
#Парсер
Table Of Content

Сбор данных иногда становится довольно задачей, или, можно сказать, рутинной или скучной. Да, мы, в частности, ученые-данные и аналитики данных, оказывались в таких ситуациях. Но как мы можем забыть нашего надежного Python, который помогает сделать вещи довольно выполнимыми, не так ли!

Так как Python предлагает некоторые удивительные библиотеки, такие как Selenium, Scrapy и BeautifulSoup, которые помогают в парсинге и сборе данных. Эти библиотеки автоматизируют процесс открытия сайтов, сбора данных и их сохранения либо в базах данных, таких как MongoDB, SQLite, либо сохранения собранных данных в виде таблицы данных с помощью библиотеки pandas. В этой статье мы создадим автоматического бота, который будет парсить веб-сайты.

Но перед этим мы всегда должны просмотреть файл robots.txt веб-сайта, который помогает узнать, какую информацию мы имеем право парсить, а какую нет.

Итак, в этой статье мы собираемся создать проект, который поможет нам собирать информацию о книгах, их названиях и именах авторов с веб-сайта с названием "audible".

В этом проекте мы будем использовать последнюю версию Selenium, которая является 4.7.2.

Первое и самое важное - создать виртуальное окружение. Перед началом любого проекта на Python настоятельно рекомендуется создать его.

# откройте папку, которую вы назвали по своему усмотрению в vscode.
# откройте терминал
python -m virtualenv venv
# это создаст виртуальное окружение, где будут сохранены все ваши библиотеки и их версии
# чтобы активировать виртуальное окружение в командной строке, следуйте следующим шагам
cd venv
cd Scripts
activate .

# это активирует виртуальное окружение, как показано на изображении ниже

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

## импортируйте все необходимые библиотеки
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import pandas as pd
import time

chr_options = Options()
chr_options.add_experimental_option("detach", True)
chr_options.add_experimental_option('excludeSwitches', ['enable-logging'])

## вышеуказанный код помогает открыть сайт на более длительное время, что я заметил,
## иначе, если мы не укажем Options() и add_experimental_option(),
## сайт откроется и мгновенно закроется

## следующим шагом будет указать путь к драйверу Chrome, который мы поместили
## в папку

driver = webdriver.Chrome(service=Service('C:/Users/projects/selenium_driver/chromedriver.exe'),options = chr_options)

## теперь с помощью драйвера мы откроем веб-сайт в браузере

driver.get("https://www.audible.in/adblbestsellers?ref=a_search_t1_navTop_pl1cg0c1r0&pf_rd_p=45682ad3-a4ca-473f-b9dc-aedd02f1e5fb&pf_rd_r=3BP1A3BP16YAWMFQ9CJ5&pageLoadId=f1oszbm5bPQ5DB2o&creativeId=bbff6a49-335a-4726-a316-1f6a3c7070bb")

## для максимизации окна
driver.maximize_window()

"""## при парсинге данных Xpath играет довольно важную роль при ## определении пути или при инспектировании элементов.## для инспектирования элементов на веб-сайте используйте команду Ctrl+Shift+I## на веб-сайте, который мы пытаемся инспектировать, сначала отключите отладку JavaScript## для этого используйте команду Ctrl+Shift+P, затем во всплывающем окне введите JavaScript## нажмите на отключение JavaScript## стрелка в самом верхнем левом углу рядом с элементами поможет вам инспектировать## элементы, и с некоторыми основами Xpath можно определить путь к определенным элементам## которые мы хотим собрать## в этом примере мы получим данные для всех страниц в коллекции бестселлеров audible## для этого мы посмотрим вниз, где есть вкладки и иконки страниц"""

pagination = driver.find_element(By.XPATH,"//ul[contains(@class,'pagingElements')]")
pages = pagination.find_elements(By.TAG_NAME,"li")

"""первая пагинация найдет элементы вкладки страницы, а затем список чисел, которые находятся во вкладке
затем мы создадим целочисленное значение последнего элемента страницы*обратите внимание, здесь мы указываем значение -2, потому что стрелка в конце считается -1"""
last_page = int(pages[-2].text)

current_page =1

## создаем список для хранения названий книг и имен авторов

book_title =[]
author_name =[]

"""Цикл поможет собирать данные, пока мы не соберем все страницы"""
while current_page<= last_page:

    time.sleep(2)
## контейнер будет содержать список значений книг, которые были сохранены
## включая все названия, имена авторов, отзывы и т.д. в основном productlist
    container = driver.find_element(By.CLASS_NAME,'adbl-impression-container')

    #//div[contains(@class,'adbl-impression-container')]//div//ul//li[contains(@class,'productListItem')]

    products = container.find_elements(By.XPATH,'.//li[contains(@class, "productListItem")]')
## в переменной products будут содержаться все элементы productlist, мы использовали XPATH здесь, и в каждом продукте
## будут доступны все названия книг, имена авторов, отзывы и т.д., которые мы можем найти с помощью Xpath



    for product in products:
        # print(product.text)
        book_title.append((product.find_element(By.XPATH,'.//h3//a').text))
        author_name.append(product.find_element(By.XPATH,'.//li[contains(@class,"authorLabel")]//span//a').text)
    
    current_page+=1
## мы сохраняем данные в список, а затем увеличиваем счетчик
## новой страницы и он будет нажимать на следующую страницу с помощью функции click()

    try:
        next_page = driver.find_element(By.XPATH,"//span[contains(@class,'nextButton')]")
        
        next_page.click()
    except:
        pass

audible_data = pd.DataFrame({'book_title':book_title,
                'author_name':author_name})
audible_data.to_csv("pagination_data.csv",index=False)

## после этого мы сохраняем данные в формате таблицы данных

"""если кто-то хочет найти отдельный цикл для получения информации о названии или имени автора, можно использовать следующий код. Если нет, это также можно закомментировать"""
name_of_book = driver.find_elements(By.XPATH,'//h3//a')
for name in name_of_book:
    print(name.text)

author_name = driver.find_elements(By.XPATH,'//li[contains(@class,"authorLabel")]//span//a')


for a_name in author_name:
    print(a_name.text)

"""наконец, необходимо закрыть открытое окно, когда мы закончим с парсингом и сбором данных"""
driver.quit()

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