Рубрики
Без рубрики

Веб-скребок в Python с использованием Scrapy

Когда я впервые начал работать в промышленности, одна из вещей, которую я быстро понял, заключается в том, что иногда вам приходится собирать, организовывать и очищать свои собственные данные. Для этого урока мы соберем данные с сайта краудфандинга под названием FundRazr. Как и многие веб-сайты, сайт имеет свою собственную структуру, форму и множество доступных полезных данных, но получить данные с сайта трудно, так как у него нет структурированного API. В результате мы очистим веб-сайт, чтобы получить эти неструктурированные данные веб-сайта и поместить их в упорядоченную форму для создания нашего собственного набора данных.

Автор оригинала: Michael.

Когда я впервые начал работать в промышленности, одна из вещей, которую я быстро понял, заключается в том, что иногда вам приходится собирать, организовывать и очищать свои собственные данные. Для этого урока мы соберем данные с сайта краудфандинга под названием 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