CoderCastrov logo
CoderCastrov
Парсер

Извлечение архивов списков рассылки в табличный формат с использованием Webscraper.io

Извлечение архивов списков рассылки в табличный формат с использованием Webscraper.io
просмотров
3 мин чтение
#Парсер

Оригинал опубликован на techupover.com

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

Компоненты

  • Веб-браузер (рекомендуется Firefox, хотя Chrome тоже подойдет)
  • Доступ к списку рассылки с веб-архивами (например, "listserv")
  • Расширение браузера Webscraper.io

Процесс

Для моей цели я хотел получить содержимое определенного списковой рассылки EDUCAUSE Community Group. Недавно она перешла на новую платформу, и старый сервер/сервис рассылки был закрыт.

  • Сначала загрузите и установите расширение браузера webscraper.io
  • Откройте инструменты разработчика и перейдите на вкладку webscraper, которая должна выглядеть примерно так:
  • Затем вы сможете создавать "селекторы", которые являются названием расширения для того, как инструмент будет перемещаться по веб-сайту и где он будет находить данные, которые вы хотите извлечь. Например, если у вас есть структура, подобная списковой рассылке, то вы будете перемещаться со страницы списка рассылки на домашнюю страницу, затем на одну из страниц "месяцев", затем на одну из тем, где вы сможете извлечь тему электронной почты, дату, отправителя и текст сообщения.
  • Вот как выглядит главная страница:

ПРИМЕЧАНИЕ: мы обрабатываем один год за раз из-за проблем с тайм-аутами и неожиданными проблемами с ресурсами. Если вы попытаетесь запустить скрэпер на все 10 лет (для этого примера), он внезапно прервется где-то посередине. Обработка одного года за раз - это компромиссное решение, которое я нашел.

  • Мы получаем дату, отправителя и тему с этой страницы. Но... мы также хотим получить текст сообщения, верно? На отдельной странице электронной почты он отображается во фрейме, что смущает расширение webscraper. Поэтому мы перемещаемся еще на один уровень, выбираем "обычный текст" ссылки и получаем текст оттуда. Обратите внимание на скриншот выше, там есть 3 типа "selectortext" и 1 тип "selectorlink"... вот как мы получаем данные с одной страницы и дополняем их дополнительными данными с последующей страницы.
  • Селектор для обычного текста - самый простой из всех. Просто получите все из тега <pre>:
  • Просто, верно? Переходите со страницы списка рассылки -> выбирайте месяц -> выбирайте тему -> сохраняйте дату, отправителя, тему -> выбирайте версию обычного текста -> сохраняйте версию обычного текста -> результирующая строка данных будет содержать: Дата, Тема, Отправитель, Текст сообщения
  • Теперь вы можете экспортировать данные в формате XLSX или CSV.

СОВЕТ: Используйте XLSX, потому что экспорт в CSV плохо обрабатывает переносы строк и строки в кавычках.

Вот и все! Если вам не хочется заморачиваться, вы можете импортировать эту карту сайта, которую я уже создал для вас (просто выделите все, скопируйте и вставьте в "импорт карты сайта" в расширении).

{"_id":"googleworkspace","startUrl":["http://listserv.educause.edu/scripts/wa.exe?A0=GOOGLEWORKSPACE"],"selectors":[{"id":"monthselector","parentSelectors":["_root"],"type":"SelectorLink","selector":"li:contains('2017') a","multiple":true,"delay":0},{"id":"threadselector","parentSelectors":["monthselector"],"type":"SelectorLink","selector":"span a","multiple":true,"delay":0},{"id":"email_date","parentSelectors":["threadselector"],"type":"SelectorText","selector":"tr.emphasizedgroup tr:nth-of-type(4) td:nth-of-type(3) p","multiple":false,"delay":0,"regex":""},{"id":"email_from","parentSelectors":["threadselector"],"type":"SelectorText","selector":"tr.emphasizedgroup tr:nth-of-type(2) td:nth-of-type(3) p","multiple":false,"delay":0,"regex":""},{"id":"email_subject","parentSelectors":["threadselector"],"type":"SelectorText","selector":"tr.emphasizedgroup tr:nth-of-type(1) td:nth-of-type(3) p","multiple":false,"delay":0,"regex":""},{"id":"textversionselector","parentSelectors":["threadselector"],"type":"SelectorLink","selector":"tr.emphasizedgroup tr tr a:nth-of-type(1)","multiple":false,"delay":0},{"id":"email_body_plaintext","parentSelectors":["textversionselector"],"type":"SelectorText","selector":"pre","multiple":false,"delay":0,"regex":""}]}

Очистка данных

В любом наборе данных всегда требуется выполнить некоторую очистку данных, и в данном случае это не исключение. Чтобы сделать эти данные более удобными для работы, я выполнил следующие действия:

  • Разделил данные отправителя на отдельные поля для отображаемого имени отправителя и адреса электронной почты отправителя (приведенного к нижнему регистру).
  • Нормализовал данные строки темы, чтобы удалить строку "Re: ", чтобы найти связанные сообщения вместе.
  • Извлек домен из адреса электронной почты отправителя, чтобы увидеть, какие домены вносили наибольший вклад в рассылку.

Визуализация / Исследование данных

Для этой работы я использовал Google Data Studio как быстрый способ создания панели инструментов для исследования и визуализации данных. Он хорошо работает (и бесплатен), когда данные хранятся в Google Sheets или в файле Excel, сохраненном в Google Drive.

Вот несколько скриншотов из созданной мной панели инструментов:

Скриншот 1

Скриншот 2

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

Приятного использования!

Надеюсь, это будет полезно для тех, кто хочет сделать то же самое для своих рассылок или для парсинга с другого сайта с подобной структурированной навигацией. Я не использовал Webscraper.io до нескольких дней назад... так что я определенно могу рекомендовать его за его простоту.


Опубликовано на https://www.techupover.com 15 марта 2022 года.