Давайте сделаем немного парсинга с помощью Selenium!
Table Of Content
- откройте папку, которую вы назвали по своему усмотрению в vscode.
- откройте терминал
- это создаст виртуальное окружение, где будут сохранены все ваши библиотеки и их версии
- чтобы активировать виртуальное окружение в командной строке, следуйте следующим шагам
- это активирует виртуальное окружение, как показано на изображении ниже
- импортируйте все необходимые библиотеки
- вышеуказанный код помогает открыть сайт на более длительное время, что я заметил,
- иначе, если мы не укажем Options() и add_experimental_option(),
- сайт откроется и мгновенно закроется
- следующим шагом будет указать путь к драйверу Chrome, который мы поместили
- в папку
- теперь с помощью драйвера мы откроем веб-сайт в браузере
- для максимизации окна
- создаем список для хранения названий книг и имен авторов
- контейнер будет содержать список значений книг, которые были сохранены
- включая все названия, имена авторов, отзывы и т.д. в основном productlist
- в переменной products будут содержаться все элементы productlist, мы использовали XPATH здесь, и в каждом продукте
- будут доступны все названия книг, имена авторов, отзывы и т.д., которые мы можем найти с помощью Xpath
- мы сохраняем данные в список, а затем увеличиваем счетчик
- новой страницы и он будет нажимать на следующую страницу с помощью функции click()
- после этого мы сохраняем данные в формате таблицы данных
Сбор данных иногда становится довольно задачей, или, можно сказать, рутинной или скучной. Да, мы, в частности, ученые-данные и аналитики данных, оказывались в таких ситуациях. Но как мы можем забыть нашего надежного 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. Если вам понравилось, подпишитесь на меня, чтобы получать больше подобных статей, которые я публикую еженедельно.