Некоторое время назад я нашел Goutte командой Symfony в одной из моих разведывательных миссий на GitHub . Это действительно удобная библиотека, помогающая любому, кто просматривает веб-сайты или просто обрабатывает некоторые данные, поступающие с внешних веб-сайтов. Работая с Goutte некоторое время, я заметил, что снова и снова абстрагирую части функциональности. После создания группы помощников, которые я копировал из проекта в проект, я позвонил, чтобы перенести их в библиотеку. |/PHP Скребок родился. Это было мое решение для уменьшения накладных расходов на кодирование в PHP.
Я разместил его на GitHub, добавил сайт Vue Press в качестве основной документации и оставил его на некоторое время. До тех пор, пока у меня снова не возникло желание поскрести. Для моего нового проекта мне пришлось извлекать ссылки с различными атрибутами, такими как “цель”, “rel” и т.д. Это началось с нескольких быстро собранных взломов и оказалось возможностью подтвердить, может ли мой скребок противостоять более продвинутым библиотекам, таким как Python BeautifulSoup . Я решил создать необходимую функциональность, используя свои ограниченные знания Python и BeautifulSoup, а также PHPScraper.
Требования
Обе программы должны были соответствовать этим требованиям:
- запускаться как программа CLI,
- примите URL-адрес в качестве аргумента,
- извлеките HTML-страницу,
- извлеките все ссылки с помощью
- ссылка
- цель
- относительный
- заглавие
- якорный текст
- запишите результат в виде 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 секунд. Это также включает время обработки для дополнительных проверок на наличие таких флагов, как “Не отслеживается” и т.д. который не был удален из стандартной библиотеки.
Другие эксперименты и тесты:
- Извлечение распределения ключевых слов по длине с помощью PHP-скребка
- Извлечение и фильтрация различных наборов ключевых слов с помощью PHP-скребка
Оригинал: “https://dev.to/spekulatius1984/phpscraper-and-python3-beautifulsoup-in-comparison-3aj9”