Сегодня поговорим о веб скрапинге. Допустим, стоит задача выгрузить информацию с сайта или нескольких и представить ее в таблице. Для примера я возьму techcrunch и mashable. На выходе хочу получить таблицу с колонками [текст], [краткое описание], [ссылка], чтобы не тратить время на бесконечное зависание на сайтах, ну вы знаете как это бывает=)
Библиотеки
Начнем с импорта. Для работы с http лучший выбор это requests, а для парсинга html будем классически работать с Beautiful Soup. Ну и pandas для удобной работы с данными и выгрузки в csv.
|
|
Нахождение нужных нам элементов
Напишем скрипт, выполняющий get-запрос, записав его в переменную, затем преобразуем полученный текст страницы в объект BeautifulSoup.
В качестве аргумента get-запроса передадим ссылку на раздел startups, там все веселье.
|
|
Здесь мы получим на выходе кусок html, который выглядит примерно так(для примера приведен только отрывок).
|
|
Открываем нашу ссылку в браузере через F12 и находим нужные нам элементы - тег с названием(будем искать по title), описанием(description) и url.
В случае с techcrunch все нужные нам ссылки находятся в “диве” block-content, в котором находится каждый пост.

Для подобного сценария в BS есть метод find_all(), который находит все возможные вхождения тега с заданными параметрами.
Затем мы создаем простой for луп и пустой список, куда записываем нужные нам данные, которые также ищем по тегам внутри block-content.
|
|
Для удобства обрезаем пробелы с помощью метода strip(), и последние десять символов в desc, обратившись к ним по индексу[:-10], т.к. они представляют собой фразу “Read More” для каждого поста.
На выходе мы получили список из кортежей, где находятся наши данные.
Проделаем тоже самое с mashable
|
|
Тут не всегда есть подробные описания, поэтому мы остановимся на названии и ссылке.
Обработка с помощью pandas
Создадим два датафрейма pandas для того, чтобы красиво соединить наши данные. Для визуального разделения данных сделаем пустой ряд - empty row с помощью вставки not a number - “NaN” из numpy, после каждого набора данных.
|
|
После этого соединим наши датафреймы с помощью метода concat()
|
|
Открываем таблицу
Запишем результаты в csv
|
|
- откроем csv файл с помощью текстового редактора и зададим разделение sep=, в самом начале если нужно открыть в экселе
- либо откроем в google sheets
Картинка ниже как именно выглядит результат

Готово. Можете применить подобную операцию ко всем сайтам в интересной вам индустрии, и на выходе получить сводку всех новостей в одной таблице, определив что вам полезно, а что нет. И не тратить время на бесконечный скроллинг веба=)
Предварительно ознакомьтесь с правилами сайта, для этого прибавьте к корневому url адресу /robots.txt и узнайте, можно ли его “скрейпить”.
Некоторые сайты предоставляют отдельное api для скрейпинга, но об этом уже в другой раз.