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

2 min


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

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

Установка Scrapy

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

Scrapy доступен через библиотеку Pip Installs Python (PIP), здесь вы можете узнать, как установить PIP в Windows, Mac и Linux.

,

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

Создайте каталог и инициализируйте виртуальную среду.

mkdir crawler
cd crawler
virtualenv venv
. venv/bin/activate

Теперь вы можете установить Scrapy в этот каталог, используя команду PIP.

pip install scrapy

Быстрая проверка, чтобы убедиться, что Scrapy установлен правильно

scrapy
# prints
Scrapy 1.4.0 - no active project

Usage:
  scrapy  [options] [args]

Available commands:
  bench         Run quick benchmark test
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
...

Как создать веб-сканер

Теперь, когда среда готова, вы можете приступить к созданию веб-сканера. Давайте соберем некоторую информацию со страницы Википедии об аккумуляторах: https://en.wikipedia.org/wiki/Battery_(electricity),

Первым шагом для написания сканера является определение класса Python, который расширяется от Scrapy.Spider, Это дает вам доступ ко всем функциям и возможностям Scrapy. Давайте назовем этот класс spider1,

Классу паука нужно немного информации:

  • имя для идентификации паука
  • start_urls переменная, содержащая список URL для сканирования (пример из этого руководства – URL-адрес Wikipedia)
  • синтаксический анализ () метод, который используется для обработки веб-страницы для извлечения информации
import scrapy

class spider1(scrapy.Spider):
    name = 'Wikipedia'
    start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)']

    def parse(self, response):
        pass

Быстрый тест, чтобы убедиться, что все работает правильно.

scrapy runspider spider1.py
# prints
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: scrapybot)
2017-11-23 09:09:21 [scrapy.utils.log] INFO: Overridden settings: {'SPIDER_LOADER_WARN_ONLY': True}
2017-11-23 09:09:21 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.memusage.MemoryUsage',
 'scrapy.extensions.logstats.LogStats',
...

Отключение регистрации

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

import logging
logging.getLogger('scrapy').setLevel(logging.WARNING)

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

Использование Chrome Inspector

Все на веб-странице хранится в элементах HTML. Элементы расположены в объектной модели документа (DOM). Понимание DOM имеет решающее значение

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

В Google Chrome есть инструменты, которые помогут вам быстрее находить элементы HTML. Вы можете найти HTML-код для любого элемента, который вы видите на веб-странице, с помощью инспектора.

  • Перейдите на страницу в Chrome
  • Поместите мышь на элемент, который вы хотите просмотреть
  • Щелкните правой кнопкой мыши и выберите Осмотреть из меню

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

Извлечение заголовка

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

Запустите скрипт, добавив немного кода в синтаксический анализ () метод, который извлекает заголовок.

...
    def parse(self, response):
        print response.css('h1#firstHeading::text').extract()
...

ответ Аргумент поддерживает метод с именем CSS () который выбирает элементы на странице, используя предоставленное вами местоположение.

В этом примере элемент h1.firstHeading, Добавление ::text к сценарию это то, что дает вам текстовое содержимое элемента. Наконец, Экстракт () Метод возвращает выбранный элемент.

Запуск этого скрипта в Scrapy печатает заголовок в текстовом виде.

[u'Battery (electricity)']

Нахождение описания

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

Вот дерево элементов в консоли разработчика Chrome:

div#mw-content-text>div>p

Стрелка вправо (>) указывает на родительско-дочерние отношения между элементами.

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

response.css('div#mw-content-text>div>p')[0]

Как и заголовок, вы добавляете CSS-экстрактор ::text чтобы получить текстовое содержимое элемента.

response.css('div#mw-content-text>div>p')[0].css('::text')

Последнее выражение использует Экстракт () вернуть список. Вы можете использовать Питон присоединиться() функция присоединения к списку после завершения сканирования.

    def parse(self, response):
        print ''.join(response.css('div#mw-content-text>div>p')[0].css('::text').extract())

Результатом является первый абзац текста!

An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is
...

Сбор данных JSON

Scrapy может извлекать информацию в текстовом виде, что полезно. Scrapy также позволяет просматривать данные JavaScript Object Notation (JSON). JSON – это удобный способ организации информации, который широко используется в веб-разработке. JSON прекрасно работает с Python

также.

Когда вам нужно собрать данные как JSON, вы можете использовать Уступать Заявление встроено в Scrapy.

Вот новая версия скрипта с использованием оператора yield. Вместо того, чтобы получить первый элемент p в текстовом формате, он соберет все элементы p и организует его в формате JSON.

...
    def parse(self, response):
        for e in response.css('div#mw-content-text>div>p'):
            yield { 'para' : ''.join(e.css('::text').extract()).strip() }
...

Теперь вы можете запустить паука, указав выходной файл JSON:

scrapy runspider spider3.py -o joe.json

Скрипт теперь напечатает все элементы p.

[
{"para": "An electric battery is a device consisting of one or more electrochemical cells with external connections provided to power electrical devices such as flashlights, smartphones, and electric cars.[1] When a battery is supplying electric power, its positive terminal is the cathode and its negative terminal is the anode.[2] The terminal marked negative is the source of electrons that when connected to an external circuit will flow and deliver energy to an external device. When a battery is connected to an external circuit, electrolytes are able to move as ions within, allowing the chemical reactions to be completed at the separate terminals and so deliver energy to the external circuit. It is the movement of those ions within the battery which allows current to flow out of the battery to perform work.[3] Historically the term "battery" specifically referred to a device composed of multiple cells, however the usage has evolved additionally to include devices composed of a single cell.[4]"},
{"para": "Primary (single-use or "disposable") batteries are used once and discarded; the electrode materials are irreversibly changed during discharge. Common examples are the alkaline battery used for flashlights and a multitude of portable electronic devices. Secondary (rechargeable) batteries can be discharged and recharged multiple
...

Выскабливание нескольких элементов

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

Давайте соберем лучшие хиты IMDb Box Office на выходные. Эта информация взята из http://www.imdb.com/chart/boxofficeв таблице со строками для каждой метрики.

синтаксический анализ () Метод может извлечь более одного поля из строки. С помощью Chrome Developer Tools вы можете найти элементы, вложенные в таблицу.

...
    def parse(self, response):
        for e in response.css('div#boxoffice>table>tbody>tr'):
            yield {
                'title': ''.join(e.css('td.titleColumn>a::text').extract()).strip(),
                'weekend': ''.join(e.css('td.ratingColumn')[0].css('::text').extract()).strip(),
                'gross': ''.join(e.css('td.ratingColumn')[1].css('span.secondaryInfo::text').extract()).strip(),
                'weeks': ''.join(e.css('td.weeksColumn::text').extract()).strip(),
                'image': e.css('td.posterColumn img::attr(src)').extract_first(),
            }
...

образ селектор указывает, что IMG является потомком td.posterColumn, Чтобы извлечь правильный атрибут, используйте выражение ::attr(src),

Запуск паука возвращает JSON:

[
{"gross": "$93.8M", "weeks": "1", "weekend": "$93.8M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Justice League"},
{"gross": "$27.5M", "weeks": "1", "weekend": "$27.5M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg", "title": "Wonder"},
{"gross": "$247.3M", "weeks": "3", "weekend": "$21.7M", "image": "https://images-na.ssl-images-amazon.com/images/M/MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI@._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Thor: Ragnarok"},
...
]

Больше веб скребков и ботов

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

Если вы ищете дополнительные способы создания сканеров или ботов, вы можете попробовать создать боты для Twitter и Instagram с помощью Python.

, Python может создавать удивительные вещи в веб-разработке, поэтому стоит изучить не только сканеры веб-страниц, когда изучаете этот язык.


0 Comments

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