15 минут до данных с помощью парсинга веб-страниц на Python
Table Of Content
Позвольте мне начать с того, что я не люблю делать что-либо более одного или двух раз. Думаю, это причина, по которой я стал программистом. Мне нравится решать проблемы и "распутывать загадки", но как только они решены, реализация может быстро потерять интерес для меня. Эта статья - просто самый свежий и интересный пример того, как я использую эту особенность своей личности на работе.
Я написал бота для Slack, чтобы помочь коллеге перезапустить веб-сервис без использования SSH, по сути, чат-операции. В шутку я также добавил возможность отвечать на запрос о шутке и ввел 4 шуточных анекдота в текстовый файл. Это создало для меня новую проблему. Мне нужно было найти еще больше шуток для бота, но поиск, копирование и вставка - не задача, на которую я смотрел с удовольствием. Могу ли я программировать свой путь из этой ситуации? Да, и за удивительно короткие 15 минут.
Проблема номер один: найти шутки в Интернете, которые подходят для работы (это сложнее, чем вы думаете). Большинство шуток, которые вы находите, являются неприемлемыми для работы, не являются однострочниками или имеют плохо отформатированные файлы. Я нашел onelinefun.com (*не связан никаким образом) и их шутки в основном подходят для работы. Если вы посмотрите на их страницу с шутками, она будет выглядеть так:
С пагинацией внизу и большой кнопкой для загрузки большего количества шуток:
Новая цель! Извлечь текст для каждой шутки на странице, вывести их и нажать кнопку следующей страницы. Повторять, пока не будет больше кнопки следующей страницы.
Я уже делал парсинг с помощью beautiful soup, requests, selenium, но давайте попробуем что-то новое! Поиск в Google по запросу "библиотека парсинга веб-страниц на Python" приводит к перспективному пятому результату. Это библиотека под названием scrapy от scrapy.org (*также не связана никаким образом). С заголовком "Быстрый и мощный фреймворк для парсинга и обхода веб-страниц". Звучит заманчиво, давайте посмотрим, оправдывает ли он свое название. Пропустим главную страницу и перейдем прямо к документации, где найдем быстрый старт "Scrapy вкратце". Очень первый пример кода так близок к тому, что мне нужно, я удивлен:
Важные фрагменты кода здесь и мои мысли:
Start_urls - это список URL-адресов, с которых начинается поиск бота.
**for quote in response.css()**
- есть объект ответа, который разбирается с помощью циклов.**quote.xpath('...').get()**
- я могу использовать поиск по xpath! Последнее - просто нажатие ссылок (**response.follow(...)**
).
Что такое xpath? https://www.w3schools.com/xml/xml_xpath.asp Это способ выбора элементов в XML/HTML-документе, и Chrome может легко дать мне эти пути.
Итак, я создал виртуальное окружение.
Выполнил команду pip install scrapy
.
Скопировал и вставил этот код локально и начал разрабатывать.
Я изменил start_url на onelinefun.com. Затем я просто щелкнул правой кнопкой мыши на странице с шутками в Chrome, выбрал "Инспектировать элемент". Затем я выбрал нужный элемент, наведя на него и нажав "копировать XPath".
Это дало мне такой текст **/html/body/div/article/div[1]/p/text()**
, затем мне нужно было:
- удалить [1], чтобы путь выбирал все div, соответствующие шаблону
- заменить get() на getall() (это находится немного ниже в документации)
- найти XPath для кнопки следующей страницы
- обновить код для поиска и нажатия кнопки
- удалить символы новой строки (потому что бот ожидает одну шутку на строку)
Et voila:
12 строк кода на Python, и команда: scrapy spider.py -o jokes.csv
дала мне 1000 шуток в локальном CSV-файле примерно за 30 секунд.
Это потрясающе, что с помощью Python я теперь могу перейти от идеи к реализации и получить данные всего за ~15 минут.
Хотя этот конкретный случай сбора шуток не очень полезен для моей рабочей деятельности, Scrapy является частью моего инструментария. Я не сомневаюсь, что я буду использовать Scrapy в своей работе для реальной работы по сбору данных, теперь, когда я знаю, насколько это просто. Надеюсь, если вы дочитали до этого места и читаете это, вы тоже это сделаете!
Теперь, кто имеет следующую "ооо, блестящую" проблему для решения? Дайте мне знать в комментариях и поставьте лайк, если хотите, чтобы я публиковал больше подобных статей, так как это моя первая публикация.
Огромное спасибо Scrapy за потрясающий код и отличную документацию. Также благодарю onelinefun.com за их развлечение, у них есть гораздо больше, чем просто шутки, и я потратил слишком много своего времени, сохраненного благодаря скрипту, на чтение других шуток.