Рубрики
Uncategorized

PHP-скребок и Python3 BeautifulSoup в сравнении

Некоторое время назад я нашел Goutte командой Symfony во время одной из моих разведывательных миссий на GitHub. Это действительно так… Помечено как веб-очистка, скребок, beautifulsoup, php.

Некоторое время назад я нашел Goutte командой Symfony в одной из моих разведывательных миссий на GitHub . Это действительно удобная библиотека, помогающая любому, кто просматривает веб-сайты или просто обрабатывает некоторые данные, поступающие с внешних веб-сайтов. Работая с Goutte некоторое время, я заметил, что снова и снова абстрагирую части функциональности. После создания группы помощников, которые я копировал из проекта в проект, я позвонил, чтобы перенести их в библиотеку. |/PHP Скребок родился. Это было мое решение для уменьшения накладных расходов на кодирование в PHP.

Я разместил его на GitHub, добавил сайт Vue Press в качестве основной документации и оставил его на некоторое время. До тех пор, пока у меня снова не возникло желание поскрести. Для моего нового проекта мне пришлось извлекать ссылки с различными атрибутами, такими как “цель”, “rel” и т.д. Это началось с нескольких быстро собранных взломов и оказалось возможностью подтвердить, может ли мой скребок противостоять более продвинутым библиотекам, таким как Python BeautifulSoup . Я решил создать необходимую функциональность, используя свои ограниченные знания Python и BeautifulSoup, а также PHPScraper.

Требования

Обе программы должны были соответствовать этим требованиям:

  1. запускаться как программа CLI,
  2. примите URL-адрес в качестве аргумента,
  3. извлеките HTML-страницу,
  4. извлеките все ссылки с помощью
    • ссылка
    • цель
    • относительный
    • заглавие
    • якорный текст
  5. запишите результат в виде json в файл

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

Очистка ссылок с помощью Python 3 и BeautifulSoup 4

Как упоминалось изначально, мои знания Python ограничены, и Google должен был помогать мне здесь и там. Различные менеджеры пакетов и сильные различия между Python2 и 3 сделали его немного более трудоемким, чем ожидалось. Хотя исходный код, вероятно, все еще можно было бы оптимизировать дальше, он соответствует требованиям. В целом, исходный код по-прежнему прост и не слишком длинный:

from bs4 import BeautifulSoup
import sys
import urllib.request
import json

# Prep the request
url = sys.argv[1]
req = urllib.request.Request(
    url,
    data=None,
    headers={
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:80.0) Gecko/20100101 Firefox/80.0'
    }
)

# Get the site
f = urllib.request.urlopen(req)
content = f.read().decode('utf-8')

# Parse the content
soup = BeautifulSoup(content, "html.parser")

data = []
for link in soup.find_all('a'):
    data.append({
        'href': link.get('href'),
        'title': link.get('title'),
        'rel': link.get('rel'),
        'target': link.get('target'),
        'text': link.getText(),
    })

with open('./links.json', 'w') as outfile:
    json.dump(data, outfile)

Как уже упоминалось, это, скорее всего, не идеально.

Реализация экстрактора ссылок PHP-скребка

Как упоминалось выше, для версии PHP я использовал свою библиотеку PHP Scraper/| . Сначала я инициализировал новый проект композитора, а затем запустил “композитор требует spekulatius/php scraper”. Исходный код довольно прост:

go($argv[1]);

// Extract the links
$links = $web->linksWithDetails;

// Write the result
file_put_contents('./links.json', json_encode($links));

Поскольку код из четырех функциональных строк прокомментирован, я думаю, что здесь не нужно много слов…

Сравнение производительности: BeautifulSoup и PHP-скребок

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

  • тесты выполняются на выделенном сервере,

  • каждый скрипт получает одни и те же 30 случайно выбранных URL-адресов один за другим (см. Здесь)

  • время измеряется с помощью встроенного в Linux командного времени для полного выполнения.

  • тесты выполняются 5 раз для каждого сценария

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

Тестовая установка может быть улучшена, например, за счет,

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

  • предварительная выборка HTML-кода и передача его в скрипт для исключения сетевых задержек.

Тесты были выполнены с использованием следующих команд:

время, пока читается URL; выполните python3 python3-beautifulsoup-link-extractor/link-extractor.py “$url”; готово < url-адреса

и

время, пока читаешь url; выполняй php phpscraper-link-extractor/link-extractor.php “$url”; готово < url-адреса

Результаты тестирования производительности

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

Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:

  • Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:
  • Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:
  • Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:
  • Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:
  • Скрипту Python с BeautifulSoup потребовалось следующее время для обработки списка URL-адресов:

В среднем на извлечение и обработку списка из 30 URL-адресов уходит около 17,5 секунд.

PHP-скрипт с PHP-скребком достиг следующих результатов:

  • PHP Скребок
  • PHP Скребок
  • PHP Скребок
  • PHP Скребок
  • PHP Скребок

В среднем на извлечение и обработку списка из 30 URL-адресов уходит около 12,0 секунд. Это также включает время обработки для дополнительных проверок на наличие таких флагов, как “Не отслеживается” и т.д. который не был удален из стандартной библиотеки.

Другие эксперименты и тесты:

Оригинал: “https://dev.to/spekulatius1984/phpscraper-and-python3-beautifulsoup-in-comparison-3aj9”