Soupsieve 2.0.1

Содержание:

Beautiful soup

Когда дело доходит до Beautiful soup, это действительно красивый инструмент для веб-парсинга из-за его основных функций. Он может помочь программисту быстро извлечь данные из определенной веб-страницы. Эта библиотека поможет нам извлечь данные из файлов HTML и XML. Но проблема с Beautiful Soup в том, что он не может выполнить всю работу самостоятельно. эта библиотека требует определенных модулей для работы.

Зависимости Beautiful soup

  1. Необходима библиотека  для отправки запроса на веб-сайт, потому что сам Beautiful soup не может сделать запрос на конкретный сервер. Для преодоления этой проблемы требуется помощь одной из популярных библиотек Requests или urlib2. Эти библиотеки помогут нам сделать запрос к серверу.
  2. После загрузки данных HTML или XML на наш локальный компьютер Beautiful Soup требуется внешний анализатор для анализа загруженных данных. Наиболее известные парсеры — это XML-parser lxml, HTML-parser lxml, HTML5lib, html.parser.

Преимущества Beautiful soup:

1. Он легок в обучении и его легко освоить. например, если мы хотим извлечь все ссылки с веб-страницы. Это можно просто сделать следующим образом

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

for link in soup.find_all('a'):
   print(link.get('href'))

В приведенном выше коде мы используем html.parser для анализа содержимого html_doc. это одна из самых веских причин для разработчиков использовать Beautiful soup в качестве инструмента для очистки веб-страниц.

2. Он имеет хорошую всеобъемлющую документацию, которая помогает нам быстро освоить библиотеку.

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

Создание консольного приложения

Наш следующий шаг — структурирование и создание консольного приложения через библиотеку Click.

Click — это Python-пакет для создания красивых интерфейсов командной строки с минимальным количеством кода и возможностью компоновки. Это один из лучших Python-пакетов для создания CLI, и с ним очень удобно работать.

Click позволяет создавать интерфейсы командной строки любого уровня — от самых простых до навороченных (например, Heroku).

В нашем CLI мы реализуем две команды:

1. поиск уязвимости;

2. просмотр уязвимости.

В папке создаем файл под названием и прописываем его базовые настройки:

Поиск уязвимостей

Здесь мы будем импортировать функцию поиска из веб-скрейпера и передавать ей аргумент из командной строки. Таким образом, приложение будет искать уязвимости, совпадающие с ключевым словом:

Для запуска этой команды:

Просмотр уязвимости

Принцип тот же: используем из веб-скрейпера и передаем туда аргумент из команды .

Для запуска этой команды:

Готово! Мы успешно создали инструмент командной строки по поиску с CVE.

Начало

Не так давно я занялся изучением уязвимостей open-source кода и понял, что хочу иметь в арсенале инструмент командной строки, который мог бы находить уязвимости напрямую из терминала. Уязвимости open-source кода обычно публикуются в открытых базах данных. Их можно найти на таких сайтах, как CVE, NVD, WhiteSource Vuln и т.д.

В этой статье мы создадим примитивный скрейпер для поиска и просмотра уязвимостей с сайта CVE, обернем его в простое консольное приложение и опубликуем на PyPI.

Для начала нужно настроить среду разработки и установить необходимые модули. Я предлагаю установить виртуальную среду. Это простое решение, которое позволит избежать конфликтов между версиями модулей.

Для создания виртуальной среды можно воспользоваться командой (для Python 3) либо установить с помощью и создать виртуальную среду через .

После того, как виртуальная среда настроена и активирована, вы можете создать папку проекта и установить необходимые модули:

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

Selenium

Прежде всего, вы должны помнить, что Selenium предназначен для автоматизации тестирования веб-приложений. Он позволяет разработчику писать тесты на нескольких популярных языках программирования, таких как C#, Java, Python, Ruby и другие. Эта среда разработана для автоматизации браузера. Давайте посмотрим на пример кода, который автоматизирует браузер.

# Импорт необходимых модулей
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title
elem = driver.find_element_by_name("q")
elem.send_keys("selenium")
elem.send_keys(Keys.RETURN)
assert "Google" in driver.title
driver.close()

Из приведенного выше кода мы можем заключить, что API очень удобен для начинающих, вы можете легко написать код с помощью Selenium. Вот почему он так популярен в сообществе разработчиков. Selenium в основном используется для автоматизации тестов для веб-приложений, он также может быть использован для разработки веб-пауков, многие люди делали это раньше.

Ключевой особенностью Selenium является

  1. Он может легко работать с основными концепциями Javascript (DOM)
  2. Он может легко обрабатывать запросы AJAX и PJAX.

Как тестировать?

Делаю следующую структуру проекта:

Тесты в пакет класть не буду, поэтому отделяю зёрна от плевел. Изначально папку не создавал, но дальнейшее развитие показало, что мне так удобнее оперировать. Это не обязательно, поэтому по желанию.

Для запуска решил использовать pytest — он умеет отлично работать с тестами из стандартного модуля. Выглядит, возможно, немного нелогично, но стандартный модуль для тестов мне кажется казался чуть удобнее. Сейчас бы я советовал использовать pytest стиль написания.

Но, поговаривают, что ставить (как и любые другие зависимости) в системный python — не очень умная идея…

Публикация консольного приложения на PyPI

После того, как мы создали консольное приложение и убедились в его работоспособности, можно опубликовать его на PyPI в публичном доступе.

PyPI — это хранилище приложений для пакетов Python. Там можно найти практически все пакеты, которые устанавливаются через . Для публикации пакета потребуется аккаунт на PyPI. Если он у вас уже есть, то смело читайте дальше.

Настройка пакета

Следующий шаг — это настройка Python-пакета с помощью . Если вы хотите, чтобы ваш пакет попал на PyPI, то нужно снабдить его базовым описанием. Эта информация указывается в файле .

Откройте в основной директории проекта и поместите в начало файла следующий код:

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

Ваш файл выглядит примерно так:

Теперь давайте рассмотрим параметры настроек:

В коде выше мы добавили множество строк. Но подробнее обсудим только те из них, которые нужны для установки.

1.  — название пакета, которое появится на PyPI;

2.  — текущая версия пакета;

3.  — пакеты и подпакеты с исходным кодом. В ходе установки мы пользуемся модулем . Он автоматически находит все подпакеты;

4.  — используется для перечисления всех зависимостей или сторонних библиотек пакета. В мы пользуемся Requests, Beautifulsoup 4 и Click. Их нужно включить в требования к установке . Нам не нужно добавлять эту информацию вручную, поскольку она присутствует в ;

5.  — используется для создания скриптов, которые вызывают функцию внутри пакета. В данном случае мы создаем новый скрипт , который вызывает внутри файла . Наш основной элемент — это , который вызывает функцию для запуска Click.

До того, как опубликовать пакет на PyPI или выложить в открытый доступ, необходимо снабдить его документацией. То, как будет выглядеть документация, целиком и полностью зависит от самого проекта. Это может быть как простой файл , так и .

Пример хорошо оформленного :

Кроме того, не забудьте создать файл :

Вот и все.

Публикация на PyPI

Теперь ваш пакет готов к публикации на PyPI. Еще раз проверьте, есть ли у вас уже аккаунт на PyPI. Добавьте к нему тестовый аккаунт на тестовом сервере PyPI. Этот аккаунт нужен для тестирования пакетов перед публикацией их на рабочем сервере.

Загружать Python-пакеты на PyPI мы будем с помощью специального инструмента — Twine. По идее, вы уже установили его на одном из предыдущих этапов. Если нет, то это можно сделать через .

Создание и локальное тестирование пакета на тестовом сервере

Python-пакеты, опубликованные на PyPI, не распространяются в виде «голого» кода. Они оборачиваются в дистрибутивы. Самыми распространенными форматами дистрибутивов в Python являются Wheels и Source Archives.

Wheels — это zip-архив с кодом и готовыми расширениями. Source Archives содержит исходный код и вспомогательные файлы, упакованные в tar-архив.

Для локального тестирования пакета выполните:

Теперь мы можем использовать его как:

Для проверки пакета на тестовом сервере PyPI нужно сгенерировать сборку для локального тестирования. При создании этой сборки сгенерируются архивы Wheels и Source Archives.

Создание сборки:

Код ниже сгенерирует два файла в директории :

Затем воспользуемся Twine. Теперь мы можем загрузить пакет на тестовый сервер PyPI:

Затем у вас спросят логин и пароль.

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

Для установки из TestPyPI выполните следующую команду:

В тестовой среде вы можете проверить все команды и убедиться в их правильности перед публикацией пакета на рабочем сервере.

Протестировав все команды локально, переходите к публикации пакета на рабочем сервере:

В процессе загрузки укажите свой логин и пароль. Вот и все!

Теперь пакет можно установить через:

Поздравляю! Ваш пакет был опубликован на PyPI. Просмотреть его можно здесь!

Now, we are only actually just outputting HTML along with the text inside it. What if we just want the text?

That’s easy.

We simply pass at the end of it. Just like we did with source. Here’s an example.

Here, we tell Python to store the of the in the 4th element which is in the element, in the variable.

You can check the output by passing to and running in the terminal.

Try getting the names of one of the authors if you can.

You can get an author like this,

Notice how you also get the date along with the name. That’s because both of them share the same element. There is a way to get the author name separately by using Python string methods like and . But we won’t cover that here.

Next up, we will use flask to re-render our received data the way we want on a local server.

In your file, type the following code,

app = Flask(__name__)@app.route('/')def index():   return render_template('index.html,**locals())app.run(debug=True)

Create a new templates folder in your main webscraper folder and call it

The flask part is a little complicated to explain but to put it simply, we created a simple server that will take our index.html from the templates folder and serve it on a local server —

Now, we can combine multiple variables we declared in all the previous code using soup and pass the text to our HTML and use CSS to style them the way we want!

You can use this code for the file,

<!DOCTYPE html><html lang=”en”> <head>  <meta charset=”UTF-8">  <meta name=”viewport” content=”width=device-width, initial-scale=1.0">  <meta http-equiv=”X-UA-Compatible” content=”ie=edge”>  <title>Webscraper in Python using Flask</title> </head> <body>  <!-- Variables from Flask here --> </body></html>

Now, we can use all the code we learned so far to create custom variables and pull specific data from our site. If we are well versed with the structure of our target site, we can use shortcuts like these.

  • Type these inside the function that we created, just above the statement.
  • Save the file
  • Go to

Now we’ll pass these variables into our HTML while it gets rendered so we can see the data on our webpage.

<!DOCTYPE html><html lang=”en”> <head>  <meta charset=”UTF-8">  <meta name=”viewport” content=”width=device-width, initial-scale=1.0">  <meta http-equiv=”X-UA-Compatible” content=”ie=edge”>  <title>Webscraper in Python using Flask</title> </head> <body>  <h1>{{ head }}</div>  <p>{{ second_author }}</p>  <article>{{ first_article }}</article> </body></html>

Now open the terminal and run

Project details

Homepage

License: BSD License (BSD)

Author: Giampaolo Rodola

Requires: Python >=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*

Classifiers

  • Development Status

    5 — Production/Stable

  • Environment

    • Console

    • Win32 (MS Windows)

  • Intended Audience

    • Developers

    • Information Technology

    • System Administrators

  • License

    OSI Approved :: BSD License

  • Operating System

    • MacOS :: MacOS X

    • Microsoft

    • Microsoft :: Windows :: Windows 10

    • Microsoft :: Windows :: Windows 7

    • Microsoft :: Windows :: Windows 8

    • Microsoft :: Windows :: Windows 8.1

    • Microsoft :: Windows :: Windows Server 2003

    • Microsoft :: Windows :: Windows Server 2008

    • Microsoft :: Windows :: Windows Vista

    • OS Independent

    • POSIX

    • POSIX :: AIX

    • POSIX :: BSD

    • POSIX :: BSD :: FreeBSD

    • POSIX :: BSD :: NetBSD

    • POSIX :: BSD :: OpenBSD

    • POSIX :: Linux

    • POSIX :: SunOS/Solaris

  • Programming Language

    • C

    • Python

    • Python :: 2

    • Python :: 2.6

    • Python :: 2.7

    • Python :: 3

    • Python :: Implementation :: CPython

    • Python :: Implementation :: PyPy

  • Topic

    • Software Development :: Libraries

    • Software Development :: Libraries :: Python Modules

    • System :: Benchmark

    • System :: Hardware

    • System :: Hardware :: Hardware Drivers

    • System :: Monitoring

    • System :: Networking

    • System :: Networking :: Monitoring

    • System :: Networking :: Monitoring :: Hardware Watchdog

    • System :: Operating System

    • System :: Systems Administration

    • Utilities

Замечания

Обновления зависимостей

  1. Зафиксировать версию colorama, совместимую с 3.4;
  2. Дропнуть поддержку 3.4 🙂

В пользу второго варианта последним аргументом стало то, что и дропнул поддержку 3.4 в версии 19.1.

Так же есть зафиксированные зависимости в виде анализаторов, форматеров и прочих сервисов. Эти зависимости можно обновлять одновременно. Если повезет, то отделаетесь только подъёмом версией, если нет — то придется подправить код или даже дописать настройки.

Дублированиe мета информации

Версию пакета и некоторые другие параметры требуется указывать для установки пакета (в или ) и в документации. Чтобы избежать дублирования, сделал указание только в пакете :

А затем в явно использую эту переменную

Тоже верно и для в

Вышеописанное справедливо для любой мета информации — , описания проекта, лицензии, имена автора и прочего.

Правда, это приводит к тому, что происходит импорт пакета в момент сборки, что может быть нежелательным.

Организация исходников

Может быть спорным то, что я выделил исходники в папку . Я исходил из следующих соображений:

  • Легче указывать только одну папку различным инструментам;
  • Не раздувать корень проекта, так как со временем количество файлов и папок конфигурации в корне только увеличивается, что затруднит ориентирование;

Но столкнулся с некоторыми неудобствами:

Коммиты и история изменений

Но есть и совсем треш:

Да, 3 коммита с одним и тем же комментарием! Уж очень хотел пофиксить запуск тестов на Travis CI.

Есть отличная статья по тому, как правильно оформлять комментарии. От себя хочу добавить — часто имеет смысл сквошить изменения, чтобы не было кучи однотипных коммитов без смысловой нагрузки.

Стоит пристально следить за историей изменений и за коммитами, так как это очень важно для дальнейшей поддержки проекта. Для удобства можно так же вести

Документация

Многие сервисы по умолчанию предполагают, что используется . Поэтому советовал бы использовать его, если нет явной необходимости в .

Как залить на pypi?

Как собрать пакет?

Снова пишу среду, которая поможет мне собрать необходимый пакет:

Зачем я удаляю папки с помощью python? Хочу соблюсти требование о кроссплатформенности разработки, удобного пути сделать это под Windows и Unix нет.

Запускаю тестовую среду:

В результате в папке получаю:

Заливаю!

Не совсем.

Изначально проект назывался , но при попытке заливки столкнулся с тем, что пакет с таким именем уже есть! И что самое обидное — он тоже умеет конвертировать в римские цифры:) Сильно не расстроился и переименовал в .

Теперь нужно установить пакет из тестового окружения. Проверку так же стоит автоматизировать:

Теперь нужно только запустить:

Вроде работает 🙂

Да.

Создаю среду для заливки в production репозиторий.

И среду для production проверки.

Создание веб-скрейпера

Для того, чтобы искать и просматривать уязвимости на сайте CVE, потребуется веб-скрейпер. Он поможет нам собирать информацию об уязвимостях. Мы создаем скрейпер в Requests и BeautifulSoup. Вот что будет делать наш скрейпер:

1. искать уязвимости;

2. получать информацию об уязвимости по ее названию на CVE.

Теперь откроем папку и создадим в ней файл под названием . Затем пропишем его базовые настройки:

Поиск уязвимостей

Для поиска уязвимостей на CVE используется URL в следующем формате: . Такой формат позволяет извлекать список уязвимостей, соответствующих ключевому слову.

Например, через URL можно получить список всех уязвимостей, связанных с Python:

Для извлечения данных открываем инструменты разработчика () и исследуем DOM-элемент с нужным представлением. Для этого кликните правой кнопкой по любому месту на странице и выберите “исследовать элемент” () либо нажмите .

Если вы присмотритесь к DOM-структуре выше, то увидите, что результаты представлены в виде таблицы, а каждое значение указано в отдельной строке под таблицей. Такие данные можно запросто извлечь:

В коде выше мы:

1. отправляем запрос в с помощью Requests и получаем DOM-содержимое;

2. преобразуем DOM-содержимое в объекты . Это позволит нам выделять DOM-элементы с помощью CSS-селекторов, и других методов;

3. выделяем все под таблицей . Выделяем первый столбец строки в качестве названия, а в качестве описания берем второй. Затем извлекаем текст.

Просмотр информации об уязвимостях

Чтобы просмотреть информацию об уязвимости, нужно взять ее и передать по этому адресу: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-ID.

Откройте инструменты разработчика и исследуйте DOM-структуру.

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

Готово! Мы успешно создали веб-скрейпер с CVE. Теперь добавим в него две функции ( и ), которые будут искать уязвимости и получать информацию по ним через .

Выбор подходящей библиотеки

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

Ключевые факторы, на которые мы должны обратить внимание:

Гибкость

Scrapy: Архитектура Scrapy хорошо спроектирована так, чтобы настраивать промежуточное ПО для добавления наших собственных функциональных возможностей. Эта особенность помогает нам сделать наш проект более надежным и гибким.

Одним из самых больших преимуществ Scrapy является то, что мы можем очень легко перенести наш существующий проект в другой проект. Поэтому для больших / сложных проектов Scrapy — лучший выбор для разработки.

Если вашему проекту нужны прокси, конвейер данных, то Scrapy будет лучшим выбором.

Beautiful Soup: Когда речь идет о небольшом проекте, или о низкоуровневом сложном проекте Beautiful Soup может выполнить задачу довольно хорошо. Это помогает нам поддерживать наш код простым и гибким.

Если вы новичок, и хотите быстро что-то освоить, хотите выполнить операции по поиску в Интернете, то Beautiful Soup — лучший выбор.

Selenium: когда вы имеете дело с Javascript на сайте, Selenium будет лучшим выбором. но размер данных должен быть ограничен.

Производительность

Scrapy: самый быстрый из всех.

Beautiful Soup: довольно медленно выполняет определенную задачу, но мы можем преодолеть эту проблему с помощью концепции многопоточности, но программисту необходимо знать концепцию многопоточности очень хорошо. Это обратная сторона Beautiful Soup.

Selenium: он может работать довольно быстро, но не эквивалентно Scrapy.

Экосистема

Scrapy: у него хорошая экосистема, мы можем использовать прокси и VPN для автоматизации задач. Это одна из причин выбора библиотеки для сложных проектов. мы можем отправлять несколько запросов с нескольких прокси-адресов.

BeautifulSoup: эта библиотека имеет много зависимостей в экосистеме. Это один из недостатков этой библиотеки для сложного проекта

Selenium: у него хорошая экосистема для развития, но проблема в том, что мы не можем использовать прокси «из коробки».

Scrapy

Scrapy — это платформа для совместной работы с открытым исходным кодом для извлечения данных с веб-сайтов. Его производительность невероятно высока, и это одна из самых мощных доступных библиотек. Одним из ключевых преимуществ scrapy является то, что он построен на основе Twisted, асинхронной сетевой структуры, что означает, что scrapy использует неблокирующий механизм при отправке запросов пользователям.

Ключевые особенности Scrapy:

  1. Scrapy имеет встроенную поддержку для извлечения данных из источников HTML с использованием выражений XPath и CSS.
  2. Это кросплатформенная библиотека, т.е. (Написана на Python и работает на Linux, Windows, Mac и BSD)
  3. Легко расширяема
  4. Быстрее, чем другие существующие библиотеки. Он может извлекать сайты в 20 раз быстрее, чем другие инструменты.
  5. Он потребляет намного меньше памяти и ресурсов процессора.
  6. Может помочь нам создать надежное и гибкое приложение с множеством функций.
  7. Он имеет хорошую поддержку сообщества для разработчиков, но документация не очень хороша для начинающих.

Документация

Далее нужно проделать минимальные шаги для настройки:

Поэтому пришлось переписать его в формате . А если бы хоть раз дочитал до конца стартовый мануал, то понял, что умеет и в Markdown.
Включаю файл в

  1. Добавляю папку с пакетом в . Это позволит делать импорты нашего кода для анализа.
  2. Добавляю папку и закидываю туда файл описания каждого модуля. Документация должна автомагически сгенерироваться из комментариев:

Использую команду явно, вместо , так как ее под Windows нет. А я не хочу нарушать принцип о кроссплатформенной разработке.

Как только сделанные изменения замержены, автоматически соберет документацию и опубликует.

И создаю специальный конфиг файл для , в котором описываю среду для запуска билда:

Снова добавляю бейдж:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *