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

Как царапать сеть с помощью Python с Scrapy Spiders

Иногда Kaggle недостаточно, и вам нужно создать свой собственный набор данных. Может быть, вам нужна картинка … Теги от программирования, Python, Scrapy, Web Scraping.

Иногда Kaggle недостаточно, и вам нужно создать свой собственный набор данных.

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

В этой статье мы будем использовать SCRAPY для царапин reddit subreddit и получить картинки. Некоторые скажут мне Использование API Reddit гораздо более практичный метод получения их данных, и это строго верно. Так что правда, я скоро напишу статью об этом в ближайшее время. Но до тех пор, пока мы делаем это в очень маленькой дозе, и не перегруженные насыщенные серверы Reddit, это должно быть в порядке. Так что имейте в виду, этот учебник только для образовательных целей, и если вам когда-нибудь понадобится данные Reddit, вы должны использовать официальные каналы, как и их Удивительный API Отказ

Итак, как мы пойдем о сосконии сайта? Давайте начнем с самого начала.

Проверка Robots.txt.

Сначала мы пойдем в reddit.com/robots.txt . Это обычно для сайта сделать их Robots.txt Файл доступен из их основного домена. Это уважает следующий формат:

User-agent: \
Disallow: \

Где u_ser-agent_ описывает тип устройства (мы падаем *, образец подстановки), а Запретить Указывает на список URL-шаблонов, которые мы не можем ползти. Я не вижу/r/* там, поэтому я думаю Это нормально, чтобы соскрести главной страницы Subreddit. Я все равно посоветую вам использовать API для любого серьезного проекта, как этикет.

Не уважать сайт Robots.txt Файл может иметь правовые последствия, но в основном он просто заставляет вас выглядеть как средний человек, и мы не хотим этого.

Настройка нашего проекта.

Для того, чтобы соскрести веб-сайт в Python, мы будем использовать Scrapy, его основную структуру соска. Некоторые люди предпочитают Beautifulsoup, но я нахожу кляпию быть более динамичным.

Базовые подразделения Scrapy для соскабливания называются _spiders, _and мы начнем эту программу, создав пустой.

Итак, прежде всего, мы установим сценапию:

pip install --user scrapy

И тогда мы начнем сцепной проект:

scrapy startproject project\_name

Здесь вы можете ввести что-либо вместо проекта_name. Что эта команда сделает, это создать каталог с большим количеством файлов и сценариев Python в нем.

Теперь для нашей последней команды инициализации мы создадим наш первый паук. Для этого мы запускаем Scrapy’s Genspider команда, которая берет паутину Имя и a_domain URL_ как его аргументы. Я назову мой Kitten-Getter _ (Остерегайтесь: спойлеры) и ползти _reddit.com/r/cats Отказ

scrapy genspider kitten\_getter reddit.com/r/cats

Теперь мы просто пойдем в/ пауки каталог и не фокусироваться в остальном. Как всегда, я сделал свой код доступен в Этот проект GitHub Отказ

Настройка нашего первого паука

В пауки Каталог, мы откроем файл под названием _kitten_getter.py _and вставьте этот код:

Что тут происходит? Ну, каждый паук нуждается в 3 вещи: а анализ Метод, а start_requests Метод и A Имя Отказ

  • Паук Имя Будет использоваться всякий раз, когда мы начнем паук с консоли.
  • Запуск паука с консоли заставит его начать с start_requests рутина.
  • Мы делаем рутину делать http . Запросы на список URL и позвоните нашему parse_method на их _http Ответы.

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

scrapy crawl kitten\_getter

Чтобы освободить своих пауков бесплатно! Позвольте им бродить в Интернете, вырвать свои драгоценные данные.

Если вы запустите эту команду, он запустит паук, который мы только что написали, поэтому он сделает запрос, получите HTML для первого URL в URL_LIST Мы поставляем и анализируем так, как мы его просили. В этом случае все, что мы делаем, пишет весь ответ прямо в файл (~ 140 КБ в размере) файла под названием «Kitten_Response0».

Если вы откроете его, вы увидите, что это просто код HTML для веб-сайта, который мы выскабливаем. Это пригодится для нашей следующей цели.

Определение шаблонов

Если вы перейдете к ссылке reddit.com/r/cats С намерением выскабливания подчинителя для фотографий котенка, вы заметите, что есть два вида постов.

  • Посты, ссылающиеся на раздел их комментариев при нажатии.
  • Посты, которые ведут прямо на картинку

Мы также заметили, что мы не можем соскрести все, что соответствует reddit.com/r/*/Comments/* _Without Нарушение Robots.txt, Так что извлечение картины с поста будет неправ. Однако мы можем получить URL-адреса изображения, если они напрямую связаны с главной страницы Subreddit. Мы видим, что эти ссылки всегда _href Недвижимость в тег, так что мы сделаем, чтобы получить их, называют объектом ответа XPath метод.

XPath _ – способ перемещения в HTML-дереве веб-сайта и получить некоторые из его элементов. Скапли также предоставляет нам _css _method, что позволяет различным способом индексации и элементов метки. Я лично нахожу правильно, щелкнув к элементу в браузере, ударяя проверку, а затем _Copy XPath Быстрый способ начать, а потом я просто играю с выводом немного.

В этом конкретном случае, поскольку все, что нам нужно, это href Значение для каждого _ _Element, мы позвоним

response.xpath('//a/@href')

В ответ, который вернет итератор для каждого href Значение (объект из библиотеки SCRAPY). Затем мы извлекаем строкую форму этого значения, вызвав метод извлечения, и проверьте, действительно ли это ссылка на изображение, увидев, если он заканчивается «.png» или ‘.jpg’. Вот весь улучшенный метод анализа, который теперь также создает HTML-файл для отображения всех изображений, не загружая их:

Таким образом, мы делаем наш паук ползти снова, и вывод должен выглядеть что-то подобное:

Crawled (200) \ (referer: None)
[https://i.imgur.com/Au0aqkj.jpg](https://i.imgur.com/Au0aqkj.jpg)
[https://i.imgur.com/Xw90WFo.jpg](https://i.imgur.com/Xw90WFo.jpg)
[https://i.imgur.com/fOINLvP.jpg](https://i.imgur.com/fOINLvP.jpg)

Где каждая ссылка – это изображение милого котенка. Как бонус, файл _kittens.html_should должен быть переполнен с помощью привлекательности.

Вот и все! Вы успешно ползали свой первый сайт!

Сохранение изображений

Предположим, вместо того чтобы сделать HTML-файл, мы хотели скачать изображения. То, что мы сделаем тогда, это импорт Python’s Запросы Библиотека и Unicodedata_one. _ Запросы Сделаю руческую работу, но нам понадобится Unicodedata Так как извлеченные строки находятся в Unicode По умолчанию и Запросы ожидает ASCII один.

Теперь вместо метода анализа мы пройдем наше Снапировка Запрос Функция функции следующей как аргумент обратного вызова:

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

Игра вокруг: Интерактивная оболочка

Скапли обеспечивает нам интерактивную оболочку, где мы можем попробовать разные команды, выражения и XPaths Отказ Это гораздо более продуктивный способ итерации и отладки паука, чем проведение всей вещи и снова с помощью ползти команда. Все, что нам нужно сделать, чтобы начать оболочку запущено это:

scrapy shell 'http://reddit.com/r/cats'

Конечно, URL может быть заменен любым другим.

Расширение нашего паука

Если бы мы хотели получить больше изображений, мы могли бы сделать download_pictures _method call _scrapy. Запрос на URL следующей страницы, которая может быть получена из href Атрибут кнопки «Следующая страница». Мы также могли бы сделать паук взять подстраивание в качестве аргумента или изменить загруженные расширения файлов.

В общем, лучшее решение, как правило, самый простой, и поэтому использование API Reddit сэкономит нам много головных болей.

Я надеюсь, что теперь вы чувствуете способность сделать свой собственный паук и получить ваши собственные данные. Пожалуйста, скажите мне, если вы нашли это полезно, и какой хороший набор данных Вы думаете, что можете генерировать с помощью этого инструмента – тем более креативным, тем лучше.

Наконец, есть книга O’Reilly, я люблю. Я нашел это очень полезным, когда начал свой путешествие по науке о данных, и он обнародовал меня к другому, проще в использовании (хотя и менее гибкой) веб-структуры Scraping. Это называется Наука данных с нуля с Python , и, вероятно, половина причина, по которой я получил свою работу. Если вы прочитаете это далеко, вы можете наслаждаться этим!

Следуй за мной Середина или Твиттер Для получения дополнительных учебников Python, советы и трюков! Если вам понравилась моя статья, поделитесь этим с другом или Tweet!

Пост Как царапать веб, используя Python с Scrapy Spiders появился первым на Вещих данных Отказ

Оригинал: “https://dev.to/strikingloo/how-to-scrape-the-web-using-python-with-scrapy-spiders-37dk”