Как создать базовый поисковый робот с помощью Scrapy

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

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

Используйте Scrapy для создания поисковых роботов

  1. Установить Scrapy
  2. Как создать веб-сканер
    1. Отключить ведение журнала
    2. Используйте Chrome Inspector
    3. Извлечь заголовок
    4. Найти описание
  3. Собирать данные JSON
  4. Используйте множество факторов

Установить Scrapy

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

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

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

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

mkdir crawler cd crawler virtualenv venv. Venv / bin / активировать

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

pip install scrapy

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

scrapy # prints Scrapy 1.4.0 — нет активного проекта Использование: scrapy [options] [args] Доступные команды: bench Запустить быстрый тестовый тест fetch Получить URL-адрес с помощью загрузчика Scrapy genspider Сгенерировать нового паука с использованием предопределенных шаблонов runspider Запустить автономного паука (без создания проекта). scrapy # prints Scrapy 1.4.0 — нет активного проекта Использование: scrapy [options] [args] Доступные команды: bench Запустить быстрый тестовый тест fetch Получить URL-адрес с помощью загрузчика Scrapy genspider Сгенерировать нового паука с использованием предопределенных шаблонов runspider Запустить автономного паука (без создания проекта).
Изображение 1: как создать базовый поисковый робот с помощью Scrapy

Scrapy

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

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

https://en.wikipedia.org/wiki/Battery_(electricity)

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

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

  1. Имя (имя) для идентификации паука
  2. Переменная start_urls содержит список URL-адресов для сканирования (URL-адреса Википедии будут примерами в этом руководстве).
  3. Метод parse () используется для обработки веб-страниц и извлечения информации.

import scrapy class spider1 (scrapy.Spider): name = «Wikipedia» start_urls = [‘https://en.wikipedia.org/wiki/Battery_(electricity)’] def parse (self, response): пройти

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

scrapy runspider spider1.py # отпечатки 2017-11-23 09:09:21 [scrapy.utils.log] ИНФОРМАЦИЯ: Scrapy 1.4.0 запущен (бот: scrapybot) 2017-11-23 09:09:21 [scrapy.utils.log] ИНФОРМАЦИЯ: переопределенные настройки: {‘SPIDER_LOADER_WARN_ONLY’: True} 2017-11-23 09:09:21 [scrapy.middleware] ИНФОРМАЦИЯ: Включенные расширения: [‘scrapy.extensions.memusage.MemoryUsage’, ‘scrapy.extensions.logstats.LogStats’,

Turn off logging

Running Scrapy with this class will export log information which will not help at the moment. Make things simple by removing this redundant log information. Add the following code to the beginning of the file.

import logging logging.getLogger(‘scrapy’).setLevel(logging.WARNING)

Now when you run the script again, the log information will not be printed.

Use Chrome Inspector

Everything on a web page is stored in HTML elements. Elements are organized in the Document Object Model (DOM). Understanding the DOM is important to make the most of the web crawler. Web crawlers search through all the HTML elements on a page to find information, so it’s important to understand how they are organized.

Google Chrome has tools to help you find HTML elements faster. You can position the HTML in any element you see on the web with the inspector.

  1. Navigate to a page in Chrome
  2. Place your mouse over the element you want to see
  3. Right click and select Inspect from the menu

These steps will open the developer console with the Elements tab selected. At the bottom of the console, you will see a tree diagram containing the elements. This tree diagram is how you will get information for the script.

Extract title

Use the script to do some work. Gather simple information to get the site’s title text.

Start the script by adding some code to the parse () method to extract the title.

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

The response argument supports a method called CSS () that selects elements from the page using the location you provide.

In this example, the element is h1.firstHeading. Adding :: text to the script is what is needed to give you the content of the element. Finally, the extract () method returns the selected element.

Run this script in Scrapy to export the title in text form.

[u’Battery (electricity)’]

Найти описание

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

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

div # мв-контент-текст> div> p

Стрелка вправо (>) указывает родительско-дочерние отношения между элементами. Эта позиция вернет все совпадающие элементы p, включая полное описание. Чтобы получить первый элемент p, вы можете написать этот код:

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

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

response.css (‘div # mw-content-text> div> p’)[0].css (‘:: текст’)

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

def parse (self, response): print » .join (response.css (‘div # mw-content-text> div> p’)[0].css (‘:: текст’). extract ())

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

Электрическая батарея — это устройство, состоящее из одного или нескольких электрохимических ячеек с внешними соединениями, обеспечивающими питание электрических устройств, таких как фонарики, смартфоны и электромобили.[1] Когда аккумулятор подает электроэнергию, его положительный полюс.

Собирать данные JSON

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

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

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

. def parse (self, response): для e в 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] Когда батарея подает электроэнергию, ее положительный вывод является катодом, а отрицательный вывод — анодом.[2] Клемма с отрицательной маркировкой является источником электронов, которые при подключении к внешней цепи будут течь и передавать энергию внешнему устройству. Когда батарея подключена к внешней цепи, электролиты могут перемещаться внутри как ионы, позволяя завершить химические реакции на отдельных клеммах и, таким образом, передавать энергию во внешнюю цепь. Именно движение этих ионов внутри батареи позволяет току выходить из батареи для выполнения работы.[3] Исторически термин «батарея» конкретно относился к устройству, состоящему из нескольких ячеек, однако его использование расширилось и теперь включает устройства, состоящие из одной ячейки.[4]»}, {» para «:» Основные (одноразовые или «одноразовые») батареи используются один раз и выбрасываются; материалы электродов необратимо меняются во время разряда. Распространенными примерами являются щелочные батареи, используемые для фонарей и множества портативных электронных устройств. Вторичные (аккумуляторные) батареи можно разряжать и перезаряжать несколько раз.

Используйте множество факторов

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

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

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

. def parse (self, response): для e в response.css (‘div # boxoffice> table> tbody> tr’): yield {‘title’: » .join (e.css (‘td.titleColumn> a: : text ‘). extract ()). strip (),’ выходные ‘:’ ‘.join (e.css (‘ td.ratingColumn ‘)[0].css (‘:: текст’). extract ()). strip (), ‘брутто’: » .join (e.css (‘td.ratingColumn’)[1].css (‘span.secondaryInfo :: text’). extract ()). strip (), ‘weeks’: » .join (e.css (‘td.weeksColumn :: text’). extract ()). strip (), ‘изображение’: 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»}, . ]

Похожие записи

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *