Написание простого веб-скребка с использованием программирования Bash Перевод

German German 5 Сентября (ред)

В сфере парсинга веб-страниц Python часто оказывается в центре внимания благодаря надежным библиотекам, таким как BeautifulSoup и Scrapy. Но знаете ли вы, что парсинг веб-страниц также можно выполнить с помощью сценариев Bash?

В этом сообщении блога мы углубимся в сценарий Bash, который извлекает ссылки и заголовки с веб-страницы и сохраняет их в файле CSV.

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

#!/bin/bash

# Define the URL to scrape
base_url="https://lite.cnn.com"
url="https://lite.cnn.com/"

# Create a CSV file and add a header
echo "Link,Title" > cnn_links.csv

# Extract links and titles and save them to the CSV file
link_array=($(curl -s "$url" | awk -F 'href="' '/<a/{gsub(/".*/, "", $2); print $2}'))

for link in "${link_array[@]}"; do full_link="${base_url}${link}"
    title=$(curl -s "$full_link" | grep -o '<title[^>]*>[^<]*</title>' | sed -e 's/<title>//g' -e 's/<\/title>//g')
    echo "\"$full_link\",\"$title\"" >> cnn_links.csv
done echo "Scraping and CSV creation complete. Links and titles saved to 'cnn_links.csv'."

Как это работает?

Этот сценарий Bash выполняет следующее:

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

  • Он создает файл CSV cnn_links.csv с именем и строкой заголовка, содержащей столбцы «Ссылка» и «Название».

  • Используя curl, он извлекает HTML-содержимое указанной веб-страницы и извлекает все ссылки, найденные в тегах привязки, (<a>) используя awk.

  • Затем он перебирает массив ссылок и извлекает заголовки страниц, выполняя дополнительные curl запросы к каждой ссылке.

  • Наконец, он добавляет извлеченные ссылки и заголовки в файл CSV в нужном формате.

Итак, вот простой веб-скребок, написанный на bash и использующий такие инструменты командной строки awk, как sed, grep и curl. Поскольку bash доступен в большинстве систем Linux, он может быть полезен для получение данных с веб-страниц без необходимости установки какого-либо дополнительного программного обеспечения.

Читать полностью: https://muhammadraza.me/2023/webscraping-in-bash/

7 Ответов

  1. Evg Evg 5 Сентября (ред.)

    Прикольный инструмент для простых случаев!

    Однако, в общем случае мы не сможем анализировать HTML с помощью регулярных выражений: https://stackoverflow.com/a/1732454 smile

    Парсинг HTML ужас

    P.S. Вообще парсинг html, это ужас… Например тут (получение поста по URL) пришлось отказаться от получения TITLE через регулярку, т.к. были сайты, на которых это не работало (арабские особенно). Вебмастера часто сами помещают туда черт знает что smile

  1. Visman Visman 5 Сентября

    пришлось отказаться от получения TITLE через регулярку,

    Как тогда браузер понимает TITLE? Или речь не про html тег title?

  1. Evg Evg 5 Сентября

    Когда тут надо получить TITLE (чтобы заполнить заголовок поста, это публикация поста через URL) мы используем библиотеки Symfony, анализаторы (пришлось поставить). Ранее делалось через ругулярку, был некоторый процент сайтов, которые плохо обрабатывались.

  1. Visman Visman 5 Сентября

    Всего лишь регулярку нужно было подправить под кривые сайты, если эти кривые сайты не могут вменяемо написать теги <title> и </title> smile

  1. Evg Evg 5 Сентября

    Вы почитайте ответы по ссылке, что я дал выше. Там интересные мнения …

    Вы не можете анализировать [X]HTML с помощью регулярного выражения. Потому что HTML нельзя проанализировать с помощью регулярных выражений. Regex не является инструментом, который можно использовать для правильного анализа HTML! Как я уже много раз отвечал на вопросы по HTML и регулярным выражениям… Регулярные выражения — это инструмент, недостаточно сложный для понимания конструкций, используемых в HTML и т.д.

    Мне нужен был парсер, который я бы использовал и далее. Например, кроме Title забирается ещё и описание, + для каталога надо будет. Плодить регулярки с заплатками, ИМХО, не лучший вариант был. Опираться на Symfony не хочется, но что делать.

  1. fomiash fomiash 5 Сентября

    На php есть библиотека phpQuery для разбора html

  1. Evg Evg 6 Сентября

    Смотрел её, но оригинальная архивирована, а другие какие-то старые и не особо поддерживаются. (