Когда я впервые начал работать в промышленности, одна из вещей, которую я быстро понял, заключается в том, что иногда вам приходится собирать, организовывать и очищать свои собственные данные. Для этого урока мы соберем данные с сайта краудфандинга под названием FundRazr . Как и многие веб-сайты, сайт имеет свою собственную структуру, форму и множество доступных полезных данных, но получить данные с сайта трудно, так как у него нет структурированного API. В результате мы очистим веб-сайт, чтобы получить эти неструктурированные данные веб-сайта и поместить их в упорядоченную форму для создания нашего собственного набора данных.
Веб-скребок (Scrapy) с использованием Python
Для того, чтобы очистить веб-сайт, мы будем использовать Scrapy . Короче говоря, Scrapy-это фреймворк, созданный для более легкого создания веб-скребков и облегчения их обслуживания. В принципе, это позволяет вам сосредоточиться на извлечении данных с помощью селекторов CSS и выборе выражений XPath, а не на сложных внутренних элементах того, как должны работать пауки. Это сообщение в блоге выходит немного за рамки великого официального учебника из документации scrapy в надежде, что если вам нужно что-то наскрести немного сложнее, вы можете сделать это самостоятельно. С этого и начнем. Если вы заблудились, я рекомендую открыть видео выше в отдельной вкладке.
Начало работы (Предварительные условия)
Если у вас уже есть anaconda и google chrome (или Firefox), перейдите к созданию нового проекта Scrapy.
1. Установите Anaconda (Python) в свою операционную систему. Вы можете либо загрузить anaconda с официального сайта и установить самостоятельно, либо следовать приведенным ниже руководствам по установке anaconda.
Установите Anaconda на Mac | Видео на Youtube | Мак |
Установите Anaconda в Windows | Видео на Youtube | Окна |
Установите Anaconda на Ubuntu | Видео на Youtube | Ubuntu |
Управление средой с помощью Conda (Python 2 + 3, Настройка ноутбуков Jupyter) | Видео на Youtube | Все |
2. Установите Scrapy (anaconda поставляется с ним, но на всякий случай). Вы также можете установить на свой терминал (mac/linux) или в командной строке (Windows). Вы можете ввести следующее:
conda install -c conda-forge scrapy
3. Убедитесь, что у вас есть Google Chrome или Firefox. В этом уроке я использую Google Chrome. Если у вас нет Google Chrome, вы можете установить его здесь, используя эту ссылку /.
Создание нового проекта Scrapy
1. Откройте терминал (mac/linux) или командную строку (windows). Перейдите в нужную папку (см. Изображение ниже, если вам нужна помощь) и введите
scrapy startproject fundrazr
scrapy startproject fundrazr
Это создает каталог fundrazr со следующим содержимым:
каталог проектов fundrazr
Поиск хороших стартовых URL-адресов с помощью Inspect в Google Chrome (или Firefox)
В фреймворке spider start_urls – это список URL-адресов, по которым паук начнет обход, если не указаны конкретные URL-адреса. Мы будем использовать каждый элемент в списке start_urls для получения отдельных ссылок на кампании.
1. На рисунке ниже показано, что в зависимости от выбранной категории вы получаете другой начальный URL-адрес. Выделенная черным цветом часть-это возможные категории сбора средств для очистки.
Поиск хорошего первого start_url
Для этого урока первым в списке start_urls является:
Для этого урока первым в списке || start_urls || является:
2. Эта часть посвящена получению дополнительных элементов для включения в список start_urls . Мы выясняем, как перейти на следующую страницу, чтобы получить дополнительные URL-адреса для ввода start_urls .
Получение дополнительных элементов для вставки start_urls список, проверив кнопку Далее
Второй начальный URL-адрес: https://fundrazr.com/find?category=Health&page=2
Приведенный ниже код будет использован в коде для паука позже в учебнике. Все, что он делает, – это составляет список start_urls. Переменные страницы-это количество дополнительных страниц (после первой страницы), с которых мы хотим получить ссылки на кампанию.
start_urls = ["https://fundrazr.com/find?category=Health"] npages = 2 # This mimics getting the pages using the next button. for i in range(2, npages + 2 ): start_urls.append("https://fundrazr.com/find?category=Health&page="+str(i)+"")
Скребковая оболочка для поиска индивидуальной кампании Связи
Лучший способ узнать, как извлекать данные с помощью Scrapy, – это использовать оболочку Scrapy. Мы будем использовать Xpath, который можно использовать для выбора элементов из HTML-документов.
Первое, для чего мы попытаемся получить xpath, – это ссылки на отдельные кампании. Сначала мы проверяем, чтобы примерно увидеть, где находятся кампании в HTML.
Поиск ссылок на отдельные кампании
Мы будем использовать XPath для извлечения части, заключенной в красный прямоугольник ниже.
Вложенная часть-это частичный URL-адрес, который мы будем изолировать
В терминальном типе (mac/linux):
scrapy shell 'https://fundrazr.com/find?category=Health'
В командной строке введите (windows):
scrapy shell "https://fundrazr.com/find?category=Health"
Введите следующее в оболочку scrapy (чтобы помочь понять код, пожалуйста, посмотрите видео):
response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href").extract()
Существует большая вероятность, что вы получите разные частичные URL-адреса по мере обновления веб-сайтов с течением времени
Приведенный ниже код предназначен для получения всех ссылок кампании для данного начального URL-адреса (подробнее об этом позже в первом разделе Spider)
for href in response.xpath("//h2[contains(@class, 'title headline-font')]/a[contains(@class, 'campaign-link')]//@href"): # add the scheme, eg http:// url = "https:" + href.extract()
Выйдите из оболочки Scrapy, набрав exit() .
выход из скребковой оболочки
Проверка Отдельных Кампаний
В то время как ранее мы должны были работать над пониманием структуры ссылок на отдельные кампании, в этом разделе рассказывается о том, как обстоят дела в отдельных кампаниях.
1. Далее мы переходим на отдельную страницу кампании (см. Ссылку ниже), чтобы очистить (я должен отметить, что некоторые из этих кампаний трудно просматривать)
1. || Далее мы переходим на отдельную страницу кампании (см. Ссылку ниже), чтобы очистить (я должен отметить, что некоторые из этих кампаний трудно просматривать)
2. Используя тот же процесс проверки, что и раньше, мы проверяем заголовок на странице
Проверьте название кампании
3. Теперь мы снова будем использовать scrapy shell, но на этот раз с индивидуальной кампанией. Мы делаем это, потому что хотим узнать, как форматируются отдельные кампании (в том числе узнать, как извлечь заголовок с веб-страницы).
В терминальном типе (mac/linux):
scrapy shell 'https://fundrazr.com/savemyarm'
В командной строке введите (windows):
scrapy shell "https://fundrazr.com/savemyarm"
Код для получения названия кампании
response.xpath("//div[contains(@id, 'campaign-title')]/descendant::text()").extract()[0]
4. Мы можем сделать то же самое для других частей страницы.
привлеченная сумма:
response.xpath("//span[contains(@class,'stat')]/span[contains(@class, 'amount-raised')]/descendant::text()").extract()
цель:
response.xpath("//div[contains(@class, 'stats-primary with-goal')]//span[contains(@class, 'stats-label hidden-phone')]/text()").extract()
тип валюты:
response.xpath("//div[contains(@class, 'stats-primary with-goal')]/@title").extract()
дата окончания кампании:
response.xpath("//div[contains(@id, 'campaign-stats')]//span[contains(@class,'stats-label hidden-phone')]/span[@class='nowrap']/text()").extract()
количество участников:
response.xpath("//div[contains(@class, 'stats-secondary with-goal')]//span[contains(@class, 'donation-count stat')]/text()").extract()
история:
response.xpath("//div[contains(@id, 'full-story')]/descendant::text()").extract()
URL-адрес:
response.xpath("//meta[@property='og:url']/@content").extract()
5. Выйдите из scrapy shell, набрав:
exit()
Предметы
Основной целью очистки является извлечение структурированных данных из неструктурированных источников, как правило, веб-страниц. Scrapy spiders может возвращать извлеченные данные в виде диктовок Python. Несмотря на удобство и привычность, Python диктует отсутствие структуры: легко сделать опечатку в имени поля или вернуть несогласованные данные, особенно в более крупном проекте с большим количеством пауков (почти слово в слово скопировано из большой официальной документации!).
Файл, который мы будем изменять
Код для items.py есть здесь .
Сохраните его в каталоге fundrazr/fundrazr (перезапишите оригинал iems.py файл).
Класс элемента (в основном то, как мы храним наши данные перед их выводом), используемый в этом руководстве, выглядит следующим образом.
items.py код
Паук
Пауки-это классы, которые вы определяете и которые Scrapy использует для удаления информации с веб-сайта (или группы веб-сайтов). Код для нашего паука приведен ниже.
Код для сбора средств
Скачать код можно здесь .
Сохраните его в файле с именем fundrazr_scrape.py в каталоге fundrazr/spiders.
Теперь текущий проект должен иметь следующее содержание:
Файл, который мы будем создавать/добавлять
Запуск Паука
1. Перейдите в каталог fundrazr/fundrazr и введите:
scrapy crawl my_scraper -o MonthDay_Year.csv
scrapy crawl my_scraper -o MonthDay_Year.csv
2. Данные должны быть выведены в каталог fundrazr/fundrazr.
Расположение вывода данных
Наши Данные
1. Данные, выводимые в этом руководстве, должны выглядеть примерно так, как показано на рисунке ниже. Отдельные кампании будут отличаться по мере постоянного обновления веб-сайта. Также возможно, что между каждой отдельной кампанией будут пробелы, поскольку excel интерпретирует csv-файл.
Данные должны грубо будьте в таком формате.
2. Если вы хотите загрузить файл большего размера (это было сделано путем изменения и добавления download_delay = 2), вы можете загрузить файл большего размера с примерно 6000 кампаний, скачав файл с моего github . Файл называется Mini Morning Scrape.csv (это большой файл).
Примерно 6000 Кампаний Наскребли
Заключительные Мысли
Создание набора данных может быть большой работой и часто является упускаемой из виду частью изучения науки о данных. Одна вещь, которую мы не обсудили, заключается в том, что, хотя мы очистили много данных, мы все еще не очистили их достаточно, чтобы провести анализ. Однако это для другого сообщения в блоге. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы здесь или на странице видео YouTube !
Эта статья первоначально появилась в моем блоге medium