Окончательное руководство по созданию масштабируемых веб-скребки с scrapy

Веб-выскабливание — это способ захвата данных с веб-сайтов без доступа к AIS или базе данных веб-сайта. Вам нужен только доступ к данным сайта — до тех пор, как ваш браузер может получить доступ к данным, вы сможете очистить его.

Реально, большую часть времени вы могли бы просто пройти через веб-сайт вручную и захватить данные «вручную» с помощью копии и пасты, но во многих случаях, которые будут принимать вас много часов ручной работы, которая может в конечном итоге стоить вам гораздо больше, чем данные стоит , особенно если вы наняли кого-то, чтобы сделать задачу за вас. Зачем нанимать кого-то для работы по 1-2 минуты за запрос, когда вы можете получить программу для выполнения запроса автоматически каждые несколько секунд?

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

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

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

Несколько предостережений, прежде чем мы начнем:

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

Большинство сайтов также имеют файл под названием robots.txt в их главном каталоге. Этот файл устанавливает правила для того, что каталоги сайты не хотят скребки для доступа. Страница «Условия и условия» веб-сайта обычно позволяет узнать, какова их политика в отношении соскабливания данных. Например, на странице условий IMDB есть следующее положение:

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

Прежде чем мы попытаемся получить данные веб-сайта, мы всегда должны проверить условия веб-сайта и robots.txt убедиться, что мы получаем юридические данные. При создании наших скребков, мы также должны убедиться, что мы не подавлять сервер с запросами, которые он не может справиться.

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

Википедия позволяет соскабливания данных, до тех пор, как боты не собирается «слишком быстро», как указано в их robots.txt . Они также предоставляют загружаемые наборы данных, чтобы люди могли обрабатывать данные на своих собственных машинах. Если мы идем слишком быстро, серверы будут автоматически блокировать наш IP, поэтому мы будем осуществлять таймеры, чтобы держать в рамках своих правил.

Начало работы, установка соответствующих библиотек с использованием Pip

Прежде всего, для начала, давайте установим Scrapy.

Windows

Установите последнюю версию Python из https://www.python.org/downloads/windows/

Примечание: Пользователям Windows также понадобится Microsoft Visual C’14.0, которую вы можете захватить из «Microsoft Visual C» Build Tools здесь.

Вы также хотите, чтобы убедиться, что у вас есть последняя версия пункта.

В cmd.exe, введите:

python -m pip install --upgrade pip

pip install pypiwin32

pip install scrapy

Это автоматически установит Scrapy и все зависимости.

Linux

Сначала вы хотите установить все зависимости:

В терминале введите:

sudo apt-get install python3 python3-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev

Как только это все установлено, просто введите:

pip install --upgrade pip

Чтобы убедиться, что пипс обновляется, а затем:

pip install scrapy

И все это сделано.

Mac

Сначала вам нужно убедиться, что у вас есть c-компилятор в вашей системе. В терминале введите:

xcode-select --install

После этого, установить доморощенный из https://brew.sh/.

Обновите переменную PATH так, чтобы доморощенные пакеты использовались перед системнымпакетами:

echo "export PATH=/usr/local/bin:/usr/local/sbin:$PATH" >> ~/.bashrc

source ~/.bashrc

Установка Python:

brew install python

А потом убедитесь, что все обновляется:

brew update; brew upgrade python

После того, как это будет сделано, просто установите Scrapy с помощью пипса:

pip install Scrapy

(гнёт);

Обзор Scrapy, как части Fit вместе, Parsers, пауки, Etc

Вы будете писать сценарий под названием «Паук» для Scrapy для запуска, но не волнуйтесь, Scrapy пауки не страшно на всех, несмотря на их имя. Единственное сходство Scrapy пауков и реальных пауков в том, что они любят ползать в Интернете.

Внутри паука является class то, что вы определяете, что говорит Scrapy, что делать. Например, где начать сканирование, типы запросов, которые он делает, как следовать ссылкам на страницах, и как он разбирает данные. Вы даже можете добавить пользовательские функции для обработки данных, а также, прежде чем ввести обратно в файл.

Дать ваш первый паук, написать простой паук, чтобы позволить для практического обучения

Чтобы начать наш первый паук, мы должны сначала создать проект Scrapy. Для этого введите это в свою командную строку:

scrapy startproject oscars

Это создаст папку с вашим проектом.

Начнем с основного паука. Следующий код должен быть введен в скрипт python. Откройте новый скрипт python /oscars/spiders и назовите егоoscars_spider.py

Мы будем импортировать Скребки.

import scrapy

Затем мы начинаем определять наш класс Spider. Во-первых, мы устанавливаем имя, а затем домены, что паук разрешено царапать. Наконец, мы говорим пауку, с чего начать выскабливание.

class OscarsSpider(scrapy.Spider):
   name = "oscars"
   allowed_domains = ["en.wikipedia.org"]
   start_urls = ['https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture']

Далее, нам нужна функция, которая будет фиксировать информацию, которую мы хотим. На данный момент, мы просто захватить название страницы. Мы используем CSS, чтобы найти тег, который несет заголовок текста, а затем мы извлекаем его. Наконец, мы возвращаем информацию обратно в Scrapy для регистрации или записи в файл.

def parse(self, response):
   data = {}
   data['title'] = response.css('title::text').extract()
   yield data

Теперь сохраните код в/oscars/spiders/oscars_spider.py

Чтобы запустить этот паук, просто перейдите к вашей командной строке и введите:

scrapy crawl oscars

Вы должны увидеть выход следующим образом:

2019-05-02 14:39:31 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: oscars)
...
 (referer: None)
2019-05-02 14:39:34 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None)
2019-05-02 14:39:34 [scrapy.core.scraper] DEBUG: Scraped from 
{'title': ['Academy Award for Best Picture - Wikipedia']}
2019-05-02 14:39:34 [scrapy.core.engine] INFO: Closing spider (finished)
2019-05-02 14:39:34 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 589,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 74517,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2019, 5, 2, 7, 39, 34, 264319),
 'item_scraped_count': 1,
 'log_count/DEBUG': 3,
 'log_count/INFO': 9,
 'response_received_count': 2,
 'robotstxt/request_count': 1,
 'robotstxt/response_count': 1,
 'robotstxt/response_status_count/200': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2019, 5, 2, 7, 39, 31, 431535)}
2019-05-02 14:39:34 [scrapy.core.engine] INFO: Spider closed (finished)

Поздравляем, вы построили свой первый основной scrapy скребок!

Полный код:

import scrapy

class OscarsSpider(scrapy.Spider):
   name = "oscars"
   allowed_domains = ["en.wikipedia.org"]
   start_urls = ["https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture"]

   def parse(self, response):
       data = {}
       data['title'] = response.css('title::text').extract()
       yield data

Очевидно, что мы хотим, чтобы сделать немного больше, так что давайте посмотрим, как использовать Scrapy для анализа данных.

Во-первых, давайте познакомимся с оболочкой Scrapy. Оболочка Scrapy может помочь вам протестировать код, чтобы убедиться, что Scrapy захватывает нужные данные.

Чтобы получить доступ к оболочке, введите это в командную строку:

scrapy shell “https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture”

Это будет в основном открыть страницу, что вы направили его, и это позволит вам запустить одиночные строки кода. Например, можно просмотреть необработанный HTML страницы, введя:

print(response.text)

Или откройте страницу в браузере по умолчанию, введя:

view(response)

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

Самый простой способ найти нужный нам код — открыть страницу в нашем браузере и проверить его. В этом примере я использую Chrome DevTools. Просто право нажмите на любой фильм название и выбрать «проверить»:

Using Chrome DevTools to inspect HTML and CSS
Окно Chrome DevTools. (Большой предварительный просмотр)

Как вы можете видеть, лауреаты Оскара имеют желтый фон, в то время как номинанты имеют простой фон. Там также ссылку на статью о названии фильма, и ссылки на фильмы заканчиваются film) в . Теперь, когда мы знаем это, мы можем использовать селектор CSS для захвата данных. В оболочке Scrapy введите:

response.css(r"tr[style='background:#FAEB86'] a[href*='film)']").extract()

Как вы можете видеть, теперь у вас есть список всех Оскар Лучший фильм Победители!

> response.css(r"tr[style='background:#FAEB86'] a[href*='film']").extract()
['<a href="/wiki/Wings_(1927_film)" title="Wings (1927 film)">Wings</a>', 
...
 '<a href="/wiki/Green_Book_(film)" title="Green Book (film)">Green Book</a>', '<a href="/wiki/Jim_Burke_(film_producer)" title="Jim Burke (film producer)">Jim Burke</a>']

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

Нам придется переписать несколько вещей и добавить новую функцию, но не волнуйтесь, это довольно просто.

Начнем с того, что инацизгем скребок так же, как и раньше.

import scrapy, time

class OscarsSpider(scrapy.Spider):
   name = "oscars"
   allowed_domains = ["en.wikipedia.org"]
   start_urls = ["https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture"]

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

def parse(self, response):
   for href in response.css(r"tr[style='background:#FAEB86'] a[href*='film)']::attr(href)").extract():
       url = response.urljoin(href)
       print(url)
       req = scrapy.Request(url, callback=self.parse_titles)
       time.sleep(5)
       yield req

Здесь мы делаем цикл, чтобы искать каждую ссылку на странице, которая заканчивается film) с желтым фоном в нем, а затем мы объединяем эти ссылки вместе в список URL-адресов, которые мы отправим в parse_titles функцию, чтобы пройти дальше. Мы также скольжения в таймер для того, чтобы только запросить страницы каждые 5 секунд. Помните, что мы можем использовать оболочку Scrapy для проверки наших полей response.css, чтобы убедиться, что мы получаем правильные данные!

def parse_titles(self, response):
   for sel in response.css('html').extract():
       data = {}
       data['title'] = response.css(r"h1[id='firstHeading'] i::text").extract()
       data['director'] = response.css(r"tr:contains('Directed by') a[href*='/wiki/']::text").extract()
       data['starring'] = response.css(r"tr:contains('Starring') a[href*='/wiki/']::text").extract()
       data['releasedate'] = response.css(r"tr:contains('Release date') li::text").extract()
       data['runtime'] = response.css(r"tr:contains('Running time') td::text").extract()
   yield data

Реальная работа выполняется в нашей parse_data функции, где мы создаем словарь data называется, а затем заполнить каждый ключ с информацией, которую мы хотим. Опять же, все эти селекторы были найдены с помощью Chrome DevTools, как показано ранее, а затем протестированы с оболочкой Scrapy.

Заключительная строка возвращает словарь данных обратно в Scrapy для хранения.

Полный код:

import scrapy, time

class OscarsSpider(scrapy.Spider):
   name = "oscars"
   allowed_domains = ["en.wikipedia.org"]
   start_urls = ["https://en.wikipedia.org/wiki/Academy_Award_for_Best_Picture"]

   def parse(self, response):
       for href in response.css(r"tr[style='background:#FAEB86'] a[href*='film)']::attr(href)").extract():
           url = response.urljoin(href)
           print(url)
           req = scrapy.Request(url, callback=self.parse_titles)
           time.sleep(5)
           yield req

   def parse_titles(self, response):
       for sel in response.css('html').extract():
           data = {}
           data['title'] = response.css(r"h1[id='firstHeading'] i::text").extract()
           data['director'] = response.css(r"tr:contains('Directed by') a[href*='/wiki/']::text").extract()
           data['starring'] = response.css(r"tr:contains('Starring') a[href*='/wiki/']::text").extract()
           data['releasedate'] = response.css(r"tr:contains('Release date') li::text").extract()
           data['runtime'] = response.css(r"tr:contains('Running time') td::text").extract()
       yield data

Иногда мы хотим использовать прокси, как веб-сайты будут пытаться блокировать наши попытки соскабливания.

Для этого нам нужно только кое-что изменить. Используя наш пример, в def parse() нашем, мы должны изменить его на следующее:

def parse(self, response):
   for href in (r"tr[style='background:#FAEB86'] a[href*='film)']::attr(href)").extract()
:
       url = response.urljoin(href)
       print(url)
       req = scrapy.Request(url, callback=self.parse_titles)
       req.meta['proxy'] = "http://yourproxy.com:80"
       yield req

Это будет маршрутизатизм запросов через ваш прокси-сервер.

Развертывание и регистрация, показать, как на самом деле управлять пауком в производстве

Теперь пришло время запустить наш паук. Чтобы заставить Scrapy начать выскабливание, а затем вывести в файл CSV, введите следующий запрос команды:

scrapy crawl oscars -o oscars.csv

Вы увидите большой выход, и через пару минут, он будет завершен, и вы будете иметь CSV файл сидит в папке проекта.

Составление результатов, показать, как использовать результаты, собранные в предыдущих шагах

Когда вы откроете файл CSV, вы увидите всю информацию, которую мы хотели (отсортированы по столбкам с заголовками). Это действительно так просто.

A CSV of Oscar winning movies and associated information
Оскар победы фильмы список и информацию. (Большой предварительный просмотр)

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

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

Дополнительные ресурсы для изучения более подробной информации о scrapy и веб-соскребания в целом

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: