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

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

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





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





Установка Scrapy

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





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

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



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

как играть по рейтингу в Overwatch
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. Паук . Это дает вам доступ ко всем функциям и возможностям Scrapy. Назовем этот класс паук1 .

Классу паука нужна небольшая информация:

  • к имя для идентификации паука
  • к start_urls переменная, содержащая список URL-адресов для сканирования (URL-адрес Википедии будет примером в этом руководстве)
  • к анализировать () метод, который используется для обработки веб-страницы для извлечения информации
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

Все на веб-странице хранится в элементах 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')

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

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 (JSON). JSON - это удобный способ организации информации, который широко используется в веб-разработке. JSON прекрасно работает с Python также.

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

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

как мне найти IP-адрес моего принтера
...
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 за выходные. Эта информация взята из http://www.imdb.com/chart/boxoffice в таблице со строками для каждого показателя.

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

...
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': '.8M', 'weeks': '1', 'weekend': '.8M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTItOGIwYS00NmRkLWJlYjctMWM0ZjFmMDU4ZjEzXkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_UY67_CR0,0,45,67_AL_.jpg', 'title': 'Justice League'},
{'gross': '.5M', 'weeks': '1', 'weekend': '.5M', 'image': 'https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgtNDkzMC00YWJkLTk1NGEtYWUxNjhmMmQ5ZjYyXkEyXkFqcGdeQXVyMjMxOTE0ODA@._V1_UX45_CR0,0,45,67_AL_.jpg', 'title': 'Wonder'},
{'gross': '7.3M', 'weeks': '3', 'weekend': '.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 может создавать удивительные вещи в веб-разработке, поэтому при изучении этого языка стоит выйти за рамки веб-сканеров.

Делиться Делиться Твитнуть Эл. адрес 15 команд командной строки Windows (CMD), которые вы должны знать

Командная строка по-прежнему остается мощным инструментом Windows. Вот самые полезные команды CMD, которые должен знать каждый пользователь Windows.

Читать далее
Похожие темы
  • Программирование
  • Инструменты для веб-мастеров
  • Программирование
  • Python
  • Учебники по кодированию
  • Веб-сканеры
Об авторе Энтони Грант(Опубликовано 40 статей)

Энтони Грант - внештатный писатель, освещающий программирование и программное обеспечение. Он специализируется в области компьютерных наук, занимается программированием, Excel, программным обеспечением и технологиями.

Ещё от Anthony Grant

Подписывайтесь на нашу новостную рассылку

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

Нажмите здесь, чтобы подписаться