CoderCastrov logo
CoderCastrov
Питон

15 минут до данных с помощью парсинга веб-страниц на Python

15 минут до данных с помощью парсинга веб-страниц на Python
просмотров
4 мин чтение
#Питон
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 за их развлечение, у них есть гораздо больше, чем просто шутки, и я потратил слишком много своего времени, сохраненного благодаря скрипту, на чтение других шуток.