Рубрики
Без рубрики

Тот, где мы создаем веб – скраппер и slackbot- Часть 1

В этой статье я пишу об автоматизации и создании веб-скребка с использованием BeautifulSoup4 и selenium.

Автор оригинала: Victory Akaniru.

Как инженеры-программисты, часть того, что мы делаем, вращается вокруг того, чтобы сделать, казалось бы, простые вещи немного проще. кто бы мог подумать, что выполнение этих трех вещей будет рутиной?

  • Посетите Brainyquote
  • Найдите и скопируйте случайную цитату о превосходстве с сайта.
  • Разместите цитату на канале slack.

Это кажется достаточно простым, но если делать это каждый день в течение года, становится скучно и утомительно.

Python-это язык сценариев, созданный для подобных вещей! С помощью python мы могли бы автоматизировать весь этот процесс и не делать одно и то же каждый день.

Ну, это именно то, что мы будем делать”. В этой серии из двух частей мы будем создавать slackbot, который периодически отправляет случайную цитату о превосходстве на указанный канал slack. Некоторые из наших функций MVP включают в себя

  • Инструмент очистки: Это будет отвечать за получение большого количества цитат и сохранение их в файл JSON для дальнейшего использования
  • Слабый бот: это будет отвечать за периодически(может быть, каждое утро?) отправка одной случайной цитаты на канал slack. Эта часть проекта потребует, чтобы мы написали какой-то простой код для отправки сообщения на канал Slack через определенные промежутки времени.

Предпосылки

  • Среда python и некоторые базовые знания Python. Вот и все

Часть 1: Инструмент для очистки

Во-первых, нам нужно проделать некоторую работу, создав базовую настройку проекта, виртуальную среду и установив некоторые пакеты

- cd newly_created_folder
- mkdir scrapping-tool
- cd scrapping-tool
- touch __init__.py main.py scroll.py selenium_driver.py

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

- virtualenv --python=python3 venv
- source venv/bin/activate

Если у вас нет или есть вопросы о том, что такое virtualenv… возможно, вы захотите Прочитать это

Затем установите следующие пакеты сторонних производителей

  • BeautifulSoup чтобы помочь нам очистить любой веб-сайт для получения данных
  • selenium для автоматизации взаимодействия с браузером при этом и lxml для взаимодействия с BeautifulSoup и анализа данных в LXML.

выполните следующую команду на своем терминале

pip3 install BeautifulSoup selenium lxml

Наконец, загрузите драйвер chrome , следуя основным инструкциям здесь . Это позволит нам запускать безголовую версию chrome при использовании selenium для автоматизации. Если вы находитесь на Mac, вы можете просто запустить

brew cask install chromedriver

Настройка иногда может длиться ночь, но код приходит утром… НЕИЗВЕСТНЫЙ

Давайте напишем какой-нибудь код!

В папке scrapping-tool , которую вы создали, найдите selenium_driver.py файл и вставьте следующий код в

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless')
driver = webdriver.Chrome("/usr/local/bin/chromedriver", chrome_options=options)

Этот фрагмент кода импортирует webdriver из selenium и добавляет некоторые параметры конфигурации для webdriver, такие как инкогнито, безголовый режим и т. Д., Наконец, мы используем chromedriver, который мы установили ранее, указав путь, по которому он был загружен. мы сохраняем это в переменной driver для дальнейшего использования.

Добавив __init__.py файл в нашей папке мы сказали python считать каждый файл в этой папке пакетом. Это означает, что функции, переменные и т. Д. По умолчанию доступны из любого места в нашем приложении 😎 .

Часть проблем, связанных с автоматизацией в веб-браузерах, возникает, когда необходимо взаимодействие с человеком. Например, веб-сайт, который мы пытаемся очистить, имеет некоторые функции, которые вы заметите, как только откроете сайт.

  • При первом посещении веб-сайта вам нужно будет нажать и принять политику конфиденциальности
  • После этого мы видим страницу со всеми теми цитатами, которые мы хотели бы получить, но затем эта страница реализует бесконечный свиток.

Мы не будем делать много автоматизации, если мы должны были помочь нашему браузеру нажать эту кнопку или помочь браузеру прокрутить, когда он доберется до нижней части страницы. Эти проблемы подводят нас к следующему шагу scroll.py .

Ключ к правильному удалению веб-сайта заключается в вашей способности нажать проверить и найти тот класс или идентификатор, с помощью которого вы можете получить доступ к этому элементу

В файле scroll.py Скопируйте и вставьте приведенный ниже код.

import time def scroll(driver, timeout): scroll_pause_time = timeout # wait for terms modal to popup and then click
 driver.implicitly_wait(timeout) privacy_button = driver.find_elements_by_css_selector(".qc-cmp-buttons > button:nth-child(2)") privacy_button[0].click() time.sleep(2) # Get scroll height
 last_height = driver.execute_script("return document.body.scrollHeight") while True: # Scroll down to bottom
 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Wait to load page
 time.sleep(scroll_pause_time) # Calculate new scroll height and compare with last scroll height
 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: # If heights are the same it will exit the function
 break last_height = new_height

Несколько вещей, которые следует отметить

  • Мы создаем функцию scroll , которая принимает два параметра: driver (источник нашей страницы) и timeout (время ожидания).
  • Мы используем некоторые методы, доступные для объекта драйвера, такие как find_elements_by_css_selector это поможет нам найти элементы. как и в нашем случае, найдите кнопку конфиденциальности и где начать бесконечную прокрутку.
  • Мы также используем метод execute_script , который использует объект окна вашего браузера в качестве параметра, чтобы мы могли прокручивать веб-сайт, определять высоту страницы и т. Д
  • Обратите внимание на цикл while ? Этот цикл проверяет наш браузер и вычисляет новую высоту прокрутки, сравнивая нашу текущую высоту с последней высотой прокрутки. если обе высоты одинаковы, мы разрываем цикл, что означает, что мы находимся в конце страницы.

Собрав все это вместе, мы построим сам скребок.

В main.py все еще в папке scrapping-tool добавьте следующий код

import re
import json
from bs4 import BeautifulSoup
from selenium_driver import driver # here we import the driver we configured earlier
from scroll import scroll # the scroll method
 def get_quotes(url): try: # implicitly_wait tells the driver to wait before throwing an exception
 driver.implicitly_wait(30) # driver.get(url) opens the page
 driver.get(url) # This starts the scrolling by passing the driver and a timeout
 scroll(driver, 5) # Once scroll returns bs4 parsers the page_source
 soup = BeautifulSoup(driver.page_source, "lxml") # Them we close the driver as soup_a is storing the page source
 driver.close() # Empty array to store the links
 quotes = [] regex_quotes = re.compile('^b-qt') regex_authors = re.compile('^bq-aut') quotes_list = soup.find_all('a', attrs={'class': regex_quotes}) authors_list = soup.find_all('a', attrs={'class': regex_authors}) quotes = [] zipped_quotes = list(zip(quotes_list, authors_list)) for i, x in enumerate(zipped_quotes): quote = x[0] author = x[1] quotes.append({ "id": f"id-{i}", "quote": quote.get_text(), "author": author.get_text(), "author-link": author.get('href') }) with open("quotes.json", 'w') as json_file: json.dump(quotes, json_file) except Exception as e: print(e, '>>>>>>>>>>>>>>>Exception>>>>>>>>>>>>>>') get_quotes('https://www.brainyquote.com/topics/excellence-quotes')

Что у нас здесь?

  • Мы импортируем библиотеку BeautifulSoup4 , некоторые встроенные пакеты python, такие как re(регулярное выражение ) и json.
  • Мы также импортируем пакеты функций, которые мы создали ранее, такие как scroll и driver.
  • Мы создаем функцию get_quotes , которая принимает URL-адрес в качестве параметра.
  • При этом мы говорим нашему браузеру подождать Lil , прежде чем выдавать ошибку(иногда проблемы с сетью могут замедлить работу).
  • Мы вызвали функцию прокрутки, чтобы сделать свое дело.
  • И как только это будет сделано, мы передадим driver.page_source в BeautifulSoup4. печать driver.page_source в этот момент покажет кучу HTML-тегов-мы вызываем close, чтобы остановить взаимодействие с браузером, у нас есть все, что нам нужно сейчас

Цель состоит в том, чтобы очистить цитату, ее автора и ссылку, чтобы получить все цитаты этого автора. на данный момент у нас есть все эти данные, хотя и в формате, с которым мы пока не можем работать(HTML-теги), также обратите внимание из кода, что мы извлекаем данные для автора отдельно и то же самое для цитат. Как мы связываем каждую цитату с ее автором? нам также нужно создать словарь python, содержащий все эти фрагменты информации, дать им уникальные идентификаторы, а также сформировать ссылки автора. Python zip функция на помощь, проще говоря, эта функция берет два списка и генерирует серию кортежей, содержащих элементы из каждого списка. Мы также использовали функцию enumerate это означает, что мы можем распаковать индекс и данные из кортежей, возвращенных из функции zip. После этого мы распаковываем и перебираем возвращенный кортеж, создаем словарь python, содержащий нужные нам данные, и добавляем его в массив кавычек. Мы также вызвали метод BeautifulSoup4 get_text() для автора и цитаты, чтобы включить

Для запуска скребка

python scrapping-tool/main.py

Чтобы увидеть все это в действии, вы можете закомментировать этот фрагмент кода options.add_argument('--headless') в файле selenium_driver.py .

Йо! На данный момент все. Не стесняйтесь оставлять комментарии, отзывы или мнения в комментариях. Во второй части этой статьи мы рассмотрим создание slackbot, который будет отображать эти отброшенные котировки на канале slack. Это также означало бы, что мы настраиваем проект flask, который позволит нам запустить сервер и реализовать планировщик!

Чтобы просмотреть полный код этой статьи нажмите здесь