Scrapy — Обзор
Scrapy — это быстрый веб-фреймворк с открытым исходным кодом, написанный на Python, который используется для извлечения данных с веб-страницы с помощью селекторов на основе XPath.
Scrapy был впервые выпущен 26 июня 2008 года по лицензии BSD, а в июне 2015 года был выпущен Milestone 1.0.
Зачем использовать Scrapy?
-
Легче создавать и масштабировать большие проекты сканирования.
-
Он имеет встроенный механизм, называемый селекторами, для извлечения данных с веб-сайтов.
-
Он обрабатывает запросы асинхронно и быстро.
-
Он автоматически регулирует скорость сканирования с помощью механизма автоматического дросселирования .
-
Обеспечивает доступность для разработчиков.
Легче создавать и масштабировать большие проекты сканирования.
Он имеет встроенный механизм, называемый селекторами, для извлечения данных с веб-сайтов.
Он обрабатывает запросы асинхронно и быстро.
Он автоматически регулирует скорость сканирования с помощью механизма автоматического дросселирования .
Обеспечивает доступность для разработчиков.
Особенности Scrapy
-
Scrapy — это открытый исходный код, который можно использовать для сканирования веб-страниц.
-
Scrapy генерирует экспорт кормов в таких форматах, как JSON, CSV и XML.
-
Scrapy имеет встроенную поддержку для выбора и извлечения данных из источников с помощью выражений XPath или CSS.
-
Scrapy на основе сканера, позволяет автоматически извлекать данные с веб-страниц.
Scrapy — это открытый исходный код, который можно использовать для сканирования веб-страниц.
Scrapy генерирует экспорт кормов в таких форматах, как JSON, CSV и XML.
Scrapy имеет встроенную поддержку для выбора и извлечения данных из источников с помощью выражений XPath или CSS.
Scrapy на основе сканера, позволяет автоматически извлекать данные с веб-страниц.
преимущества
-
Скрапия легко расширяемая, быстрая и мощная.
-
Это кроссплатформенный каркас приложений (Windows, Linux, Mac OS и BSD).
-
Запросы Scrapy запланированы и обработаны асинхронно.
-
Scrapy поставляется со встроенным сервисом Scrapyd, который позволяет загружать проекты и управлять пауками с помощью веб-сервиса JSON.
-
Можно удалить любой веб-сайт, хотя этот веб-сайт не имеет API для доступа к необработанным данным.
Скрапия легко расширяемая, быстрая и мощная.
Это кроссплатформенный каркас приложений (Windows, Linux, Mac OS и BSD).
Запросы Scrapy запланированы и обработаны асинхронно.
Scrapy поставляется со встроенным сервисом Scrapyd, который позволяет загружать проекты и управлять пауками с помощью веб-сервиса JSON.
Можно удалить любой веб-сайт, хотя этот веб-сайт не имеет API для доступа к необработанным данным.
Недостатки
-
Scrapy только для Python 2.7. +
-
Установка отличается для разных операционных систем.
Scrapy только для Python 2.7. +
Установка отличается для разных операционных систем.
Scrapy — Окружающая среда
В этой главе мы обсудим, как установить и настроить Scrapy. Scrapy должен быть установлен с Python.
Scrapy можно установить с помощью pip . Для установки выполните следующую команду —
pip install Scrapy
Windows
Примечание. Python 3 не поддерживается в ОС Windows.
Шаг 1 — Установите Python 2.7 из Python
Установите переменные среды, добавив следующие пути к PATH —
C:\Python27\;C:\Python27\Scripts\;
Вы можете проверить версию Python, используя следующую команду —
python --version
Шаг 2 — Установите OpenSSL .
Добавьте C: \ OpenSSL-Win32 \ bin в переменные окружения.
Примечание. OpenSSL предустановлен во всех операционных системах, кроме Windows.
Шаг 3 — Установите распространяемые файлы Visual C ++ 2008 .
Шаг 4 — Установите pywin32 .
Шаг 5 — Установите pip для версий Python старше 2.7.9.
Вы можете проверить версию пипса, используя следующую команду —
pip --version
Шаг 6 — Чтобы установить scrapy, выполните следующую команду —
pip install Scrapy
анаконда
Если на вашем компьютере установлена anaconda или miniconda , выполните следующую команду, чтобы установить Scrapy с помощью conda:
conda install -c scrapinghub scrapy
Компания Scrapinghub поддерживает официальные пакеты conda для Linux, Windows и OS X.
Примечание. Рекомендуется установить Scrapy с помощью приведенной выше команды, если у вас есть проблемы с установкой через pip.
Ubuntu 9.10 или выше
Последняя версия Python предустановлена на ОС Ubuntu. Используйте aptgettable для пакетов Ubuntu, предоставляемых Scrapinghub. Чтобы использовать пакеты —
Шаг 1. Вам необходимо импортировать ключ GPG, используемый для подписи пакетов Scrapy, в связку ключей APT.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 627220E7
Шаг 2 — Затем используйте следующую команду для создания файла /etc/apt/sources.list.d/scrapy.list —
echo 'deb http://archive.scrapy.org/ubuntu scrapy main' | sudo tee /etc/apt/sources.list.d/scrapy.list
Шаг 3 — Обновление списка пакетов и установка scrapy —
sudo apt-get update && sudo apt-get install scrapy
Archlinux
Вы можете установить Scrapy из пакета AUR Scrapy с помощью следующей команды —
yaourt -S scrapy
Mac OS X
Используйте следующую команду для установки инструментов командной строки Xcode —
xcode-select --install
Вместо использования системного Python установите новую обновленную версию, которая не конфликтует с остальной частью вашей системы.
Шаг 1 — Установите доморощенный .
Шаг 2 — Установите переменную среды PATH, чтобы указать, что пакеты homebrew должны использоваться до системных пакетов.
echo "export PATH = /usr/local/bin:/usr/local/sbin:$PATH" >> ~/.bashrc
Шаг 3 — Чтобы убедиться, что изменения сделаны, перезагрузите .bashrc, используя следующую команду —
source ~/.bashrc
Шаг 4 — Затем установите Python с помощью следующей команды —
brew install python
Шаг 5 — Установите Scrapy с помощью следующей команды —
pip install Scrapy
Scrapy — инструменты командной строки
Описание
Инструмент командной строки Scrapy используется для управления Scrapy, который часто называют «Scrapy tool» . Он включает в себя команды для различных объектов с группой аргументов и опций.
Настройки конфигурации
Scrapy найдет параметры конфигурации в файле scrapy.cfg . Ниже приведены несколько мест —
-
C: \ scrapy (папка проекта) \ scrapy.cfg в системе
-
~ / .config / scrapy.cfg ($ XDG_CONFIG_HOME) и ~ / .scrapy.cfg ($ HOME) для глобальных настроек
-
Вы можете найти scrapy.cfg в корне проекта.
C: \ scrapy (папка проекта) \ scrapy.cfg в системе
~ / .config / scrapy.cfg ($ XDG_CONFIG_HOME) и ~ / .scrapy.cfg ($ HOME) для глобальных настроек
Вы можете найти scrapy.cfg в корне проекта.
Scrapy также может быть настроен с использованием следующих переменных среды:
- SCRAPY_SETTINGS_MODULE
- SCRAPY_PROJECT
- SCRAPY_PYTHON_SHELL
По умолчанию структура Scrapy Project
Следующая структура показывает файловую структуру по умолчанию для проекта Scrapy.
scrapy.cfg - Deploy the configuration file project_name/ - Name of the project _init_.py items.py - It is project's items file pipelines.py - It is project's pipelines file settings.py - It is project's settings file spiders - It is the spiders directory _init_.py spider_name.py . . .
Файл scrapy.cfg является корневым каталогом проекта, который включает имя проекта с настройками проекта. Например —
[settings] default = [name of the project].settings [deploy] #url = http://localhost:6800/ project = [name of the project]
Используя Scrapy Tool
Инструмент Scrapy предоставляет некоторые возможности использования и доступные команды следующим образом:
Scrapy X.Y - no active project Usage: scrapy [options] [arguments] Available commands: crawl It puts spider (handle the URL) to work for crawling data fetch It fetches the response from the given URL
Создание проекта
Вы можете использовать следующую команду для создания проекта в Scrapy —
scrapy startproject project_name
Это создаст проект с именем каталог_проекта . Затем перейдите к вновь созданному проекту, используя следующую команду —
cd project_name
Контроллинг проектов
Вы можете контролировать проект и управлять им, используя инструмент Scrapy, а также создать нового паука, используя следующую команду —
scrapy genspider mydomain mydomain.com
Такие команды, как сканирование и т. Д., Должны использоваться внутри проекта Scrapy. В следующем разделе вы узнаете, какие команды должны выполняться внутри проекта Scrapy.
Scrapy содержит несколько встроенных команд, которые можно использовать для вашего проекта. Чтобы увидеть список доступных команд, используйте следующую команду —
scrapy -h
Когда вы выполните следующую команду, Scrapy отобразит список доступных команд, как указано ниже:
-
fetch — выбирает URL с помощью загрузчика Scrapy.
-
runspider — используется для запуска автономного паука без создания проекта.
-
параметры настройки — это определяет значение настройки проекта.
-
shell — это интерактивный модуль очистки по заданному URL.
-
startproject — создает новый проект Scrapy.
-
версия — отображает версию Scrapy.
-
view — получает URL с помощью загрузчика Scrapy и отображает содержимое в браузере.
fetch — выбирает URL с помощью загрузчика Scrapy.
runspider — используется для запуска автономного паука без создания проекта.
параметры настройки — это определяет значение настройки проекта.
shell — это интерактивный модуль очистки по заданному URL.
startproject — создает новый проект Scrapy.
версия — отображает версию Scrapy.
view — получает URL с помощью загрузчика Scrapy и отображает содержимое в браузере.
Вы можете иметь несколько связанных с проектом команд, как указано в списке —
-
crawl — используется для сканирования данных с помощью паука.
-
check — Проверяет элементы, возвращенные командой сканирования.
-
list — отображает список доступных пауков, присутствующих в проекте.
-
редактировать — вы можете редактировать пауков с помощью редактора.
-
parse — анализирует данный URL с пауком
-
bench — используется для запуска быстрого теста производительности (Benchmark сообщает, сколько страниц Scrawling может сканировать в минуту).
crawl — используется для сканирования данных с помощью паука.
check — Проверяет элементы, возвращенные командой сканирования.
list — отображает список доступных пауков, присутствующих в проекте.
редактировать — вы можете редактировать пауков с помощью редактора.
parse — анализирует данный URL с пауком
bench — используется для запуска быстрого теста производительности (Benchmark сообщает, сколько страниц Scrawling может сканировать в минуту).
Пользовательские команды проекта
Вы можете создать собственную команду проекта с параметром COMMANDS_MODULE в проекте Scrapy. Он включает в себя пустую строку по умолчанию в настройке. Вы можете добавить следующую пользовательскую команду —
COMMANDS_MODULE = 'mycmd.commands'
Команды Scrapy можно добавить с помощью раздела scrapy.commands в файле setup.py, который показан ниже:
from setuptools import setup, find_packages setup(name = 'scrapy-module_demo', entry_points = { 'scrapy.commands': [ 'cmd_demo = my_module.commands:CmdDemo', ], }, )
Приведенный выше код добавляет команду cmd_demo в файл setup.py .
Scrapy — Пауки
Описание
Spider — это класс, отвечающий за определение того, как переходить по ссылкам через веб-сайт и извлекать информацию со страниц.
Пауки Scrapy по умолчанию следующие:
scrapy.Spider
Это паук, от которого все остальные пауки должны наследовать. У него есть следующий класс —
class scrapy.spiders.Spider
В следующей таблице приведены поля scrapy.Spider class —
Sr.No | Поле и описание |
---|---|
1 |
название Это имя вашего паука. |
2 |
allowed_domains Это список доменов, по которым ползает паук. |
3 |
start_urls Это список URL-адресов, которые будут корнями для последующих сканирований, откуда начнет сканировать паук. |
4 |
Пользовательские настройки Эти настройки, при запуске паука, будут переопределены в конфигурации всего проекта. |
5 |
гусеничный трактор Это атрибут, который ссылается на объект Crawler, к которому привязан экземпляр паука. |
6 |
настройки Это настройки для запуска паука. |
7 |
лесоруб Это регистратор Python, используемый для отправки сообщений журнала. |
8 |
from_crawler (гусеничный, * Args, ** kwargs) Это метод класса, который создает вашего паука. Параметры —
|
9 |
start_requests () Если конкретные URL-адреса не указаны, а паук открыт для списания, Scrapy вызывает метод start_requests () . |
10 |
make_requests_from_url (URL) Это метод, используемый для преобразования URL-адресов в запросы. |
11 |
синтаксический анализ (ответ) Этот метод обрабатывает ответ и возвращает отмененные данные по следующим URL-адресам. |
12 |
журнал (сообщение [уровень, компонент]) Это метод, который отправляет сообщение журнала через регистратор пауков. |
13 |
закрытая (причина) Этот метод вызывается, когда паук закрывается. |
название
Это имя вашего паука.
allowed_domains
Это список доменов, по которым ползает паук.
start_urls
Это список URL-адресов, которые будут корнями для последующих сканирований, откуда начнет сканировать паук.
Пользовательские настройки
Эти настройки, при запуске паука, будут переопределены в конфигурации всего проекта.
гусеничный трактор
Это атрибут, который ссылается на объект Crawler, к которому привязан экземпляр паука.
настройки
Это настройки для запуска паука.
лесоруб
Это регистратор Python, используемый для отправки сообщений журнала.
from_crawler (гусеничный, * Args, ** kwargs)
Это метод класса, который создает вашего паука. Параметры —
сканер — сканер, к которому будет привязан экземпляр паука.
args (list) — эти аргументы передаются методу _init_ () .
kwargs (dict) — эти ключевые аргументы передаются методу _init_ () .
start_requests ()
Если конкретные URL-адреса не указаны, а паук открыт для списания, Scrapy вызывает метод start_requests () .
make_requests_from_url (URL)
Это метод, используемый для преобразования URL-адресов в запросы.
синтаксический анализ (ответ)
Этот метод обрабатывает ответ и возвращает отмененные данные по следующим URL-адресам.
журнал (сообщение [уровень, компонент])
Это метод, который отправляет сообщение журнала через регистратор пауков.
закрытая (причина)
Этот метод вызывается, когда паук закрывается.
Аргументы Паука
Аргументы Spider используются для указания начальных URL-адресов и передаются с помощью команды сканирования с параметром -a , который показан ниже:
scrapy crawl first_scrapy -a group = accessories
Следующий код демонстрирует, как паук получает аргументы —
import scrapy class FirstSpider(scrapy.Spider): name = "first" def __init__(self, group = None, *args, **kwargs): super(FirstSpider, self).__init__(*args, **kwargs) self.start_urls = ["http://www.example.com/group/%s" % group]
Универсальные пауки
Вы можете использовать общих пауков, чтобы подклассы ваших пауков от. Их цель состоит в том, чтобы следовать всем ссылкам на веб-сайте на основе определенных правил для извлечения данных со всех страниц.
Для примеров, используемых в следующих пауках, давайте предположим, что у нас есть проект со следующими полями:
import scrapy from scrapy.item import Item, Field class First_scrapyItem(scrapy.Item): product_title = Field() product_link = Field() product_description = Field()
CrawlSpider
CrawlSpider определяет набор правил для перехода по ссылкам и удаления более одной страницы. У него есть следующий класс —
class scrapy.spiders.CrawlSpider
Ниже приведены атрибуты класса CrawlSpider —
правила
Это список объектов правил, который определяет, как сканер следует по ссылке.
В следующей таблице приведены правила класса CrawlSpider —
Sr.No | Правило и описание |
---|---|
1 |
LinkExtractor Он определяет, как паук следует по ссылкам и извлекает данные. |
2 |
Перезвоните Это должно быть вызвано после того, как каждая страница очищена. |
3 |
следовать Указывает, следует ли продолжать следующие ссылки или нет. |
LinkExtractor
Он определяет, как паук следует по ссылкам и извлекает данные.
Перезвоните
Это должно быть вызвано после того, как каждая страница очищена.
следовать
Указывает, следует ли продолжать следующие ссылки или нет.
parse_start_url (ответ)
Он возвращает либо элемент, либо объект запроса, позволяя проанализировать начальные ответы.
Примечание. Убедитесь, что вы переименовываете функцию разбора, отличную от разбора, при написании правил, потому что функция разбора используется CrawlSpider для реализации своей логики.
Давайте посмотрим на следующий пример, где spider начинает сканировать домашнюю страницу demoexample.com, собирая все страницы, ссылки и анализ с помощью метода parse_items —
import scrapy from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor class DemoSpider(CrawlSpider): name = "demo" allowed_domains = ["www.demoexample.com"] start_urls = ["http://www.demoexample.com"] rules = ( Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)), callback = "parse_item", follow = True), ) def parse_item(self, response): item = DemoItem() item["product_title"] = response.xpath("a/text()").extract() item["product_link"] = response.xpath("a/@href").extract() item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract() return items
XMLFeedSpider
Это базовый класс для пауков, которые очищают от XML-каналов и перебирают узлы. У него есть следующий класс —
class scrapy.spiders.XMLFeedSpider
В следующей таблице показаны атрибуты класса, используемые для установки итератора и имени тега.
Sr.No | Атрибут и описание |
---|---|
1 |
итератор Он определяет используемый итератор. Это может быть iternodes, html или xml . По умолчанию это iternodes . |
2 |
itertag Это строка с именем узла для повторения. |
3 |
Пространства имен Он определяется списком (prefix, uri) кортежей, которые автоматически регистрируют пространства имен с помощью метода register_namespace () . |
4 |
adapt_response (ответ) Он получает ответ и изменяет тело ответа, как только он прибывает из промежуточного программного обеспечения паука, прежде чем паук начнет его анализировать. |
5 |
parse_node (ответ, селектор) Он получает ответ и селектор при вызове для каждого узла, соответствующего указанному имени тега. Примечание. Ваш паук не будет работать, если вы не переопределите этот метод. |
6 |
process_results (ответ, итоги) Возвращает список результатов и ответ, возвращенный пауком. |
итератор
Он определяет используемый итератор. Это может быть iternodes, html или xml . По умолчанию это iternodes .
itertag
Это строка с именем узла для повторения.
Пространства имен
Он определяется списком (prefix, uri) кортежей, которые автоматически регистрируют пространства имен с помощью метода register_namespace () .
adapt_response (ответ)
Он получает ответ и изменяет тело ответа, как только он прибывает из промежуточного программного обеспечения паука, прежде чем паук начнет его анализировать.
parse_node (ответ, селектор)
Он получает ответ и селектор при вызове для каждого узла, соответствующего указанному имени тега.
Примечание. Ваш паук не будет работать, если вы не переопределите этот метод.
process_results (ответ, итоги)
Возвращает список результатов и ответ, возвращенный пауком.
CSVFeedSpider
Он перебирает каждую из своих строк, получает CSV-файл в качестве ответа и вызывает метод parse_row () . У него есть следующий класс —
class scrapy.spiders.CSVFeedSpider
В следующей таблице показаны параметры, которые можно установить для файла CSV.
Sr.No | Вариант и описание |
---|---|
1 |
ограничитель Это строка, содержащая разделитель запятой (‘,’) для каждого поля. |
2 |
QuoteChar Это строка, содержащая кавычку (‘»‘) для каждого поля. |
3 |
заголовки Это список операторов, из которых можно извлечь поля. |
4 |
parse_row (ответ, строка) Он получает ответ и каждую строку вместе с ключом для заголовка. |
ограничитель
Это строка, содержащая разделитель запятой (‘,’) для каждого поля.
QuoteChar
Это строка, содержащая кавычку (‘»‘) для каждого поля.
заголовки
Это список операторов, из которых можно извлечь поля.
parse_row (ответ, строка)
Он получает ответ и каждую строку вместе с ключом для заголовка.
Пример CSVFeedSpider
from scrapy.spiders import CSVFeedSpider from demoproject.items import DemoItem class DemoSpider(CSVFeedSpider): name = "demo" allowed_domains = ["www.demoexample.com"] start_urls = ["http://www.demoexample.com/feed.csv"] delimiter = ";" quotechar = "'" headers = ["product_title", "product_link", "product_description"] def parse_row(self, response, row): self.logger.info("This is row: %r", row) item = DemoItem() item["product_title"] = row["product_title"] item["product_link"] = row["product_link"] item["product_description"] = row["product_description"] return item
SitemapSpider
SitemapSpider с помощью файлов Sitemap сканирует веб-сайт, находя URL-адреса из файла robots.txt. У него есть следующий класс —
class scrapy.spiders.SitemapSpider
В следующей таблице показаны поля SitemapSpider —
Sr.No | Поле и описание |
---|---|
1 |
sitemap_urls Список URL-адресов, которые вы хотите сканировать, указывая на карты сайта. |
2 |
sitemap_rules Это список кортежей (регулярное выражение, обратный вызов), где регулярное выражение является регулярным выражением, а обратный вызов используется для обработки URL-адресов, соответствующих регулярному выражению. |
3 |
sitemap_follow Это список регулярных выражений карты сайта. |
4 |
sitemap_alternate_links Определяет альтернативные ссылки, по которым нужно перейти для одного URL. |
sitemap_urls
Список URL-адресов, которые вы хотите сканировать, указывая на карты сайта.
sitemap_rules
Это список кортежей (регулярное выражение, обратный вызов), где регулярное выражение является регулярным выражением, а обратный вызов используется для обработки URL-адресов, соответствующих регулярному выражению.
sitemap_follow
Это список регулярных выражений карты сайта.
sitemap_alternate_links
Определяет альтернативные ссылки, по которым нужно перейти для одного URL.
Пример SitemapSpider
Следующий SitemapSpider обрабатывает все URL —
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/sitemap.xml"] def parse(self, response): # You can scrap items here
Следующий SitemapSpider обрабатывает некоторые URL с обратным вызовом —
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/sitemap.xml"] rules = [ ("/item/", "parse_item"), ("/group/", "parse_group"), ] def parse_item(self, response): # you can scrap item here def parse_group(self, response): # you can scrap group here
В следующем коде показаны файлы Sitemap в файле robots.txt, URL которого содержит / sitemap_company —
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] sitemap_follow = ["/sitemap_company"] def parse_company(self, response): # you can scrap company here
Вы даже можете комбинировать SitemapSpider с другими URL-адресами, как показано в следующей команде.
from scrapy.spiders import SitemapSpider class DemoSpider(SitemapSpider): urls = ["http://www.demoexample.com/robots.txt"] rules = [ ("/company/", "parse_company"), ] other_urls = ["http://www.demoexample.com/contact-us"] def start_requests(self): requests = list(super(DemoSpider, self).start_requests()) requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] return requests def parse_company(self, response): # you can scrap company here... def parse_other(self, response): # you can scrap other here...
Scrapy — Селекторы
Описание
Когда вы просматриваете веб-страницы, вам нужно извлечь определенную часть исходного кода HTML с помощью механизма селекторов , который достигается с помощью выражений XPath или CSS. Селекторы построены на библиотеке lxml , которая обрабатывает XML и HTML на языке Python.
Используйте следующий фрагмент кода, чтобы определить различные концепции селекторов —
<html> <head> <title>My Website</title> </head> <body> <span>Hello world!!!</span> <div class = 'links'> <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a> <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a> <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a> </div> </body> </html>
Построение селекторов
Вы можете создать экземпляры класса селектора, передав текст или объект TextResponse . На основе предоставленного типа ввода селектор выбирает следующие правила:
from scrapy.selector import Selector from scrapy.http import HtmlResponse
Используя приведенный выше код, вы можете построить из текста как —
Selector(text = body).xpath('//span/text()').extract()
Он будет отображать результат как —
[u'Hello world!!!']
Вы можете построить из ответа как —
response = HtmlResponse(url = 'http://mysite.com', body = body) Selector(response = response).xpath('//span/text()').extract()
Он будет отображать результат как —
[u'Hello world!!!']
Использование селекторов
Используя приведенный выше простой фрагмент кода, вы можете создать XPath для выделения текста, который определен в теге title, как показано ниже:
>>response.selector.xpath('//title/text()')
Теперь вы можете извлечь текстовые данные, используя метод .extract (), показанный ниже:
>>response.xpath('//title/text()').extract()
Это даст результат как —
[u'My Website']
Вы можете отобразить имя всех элементов, показанных ниже:
>>response.xpath('//div[@class = "links"]/a/text()').extract()
Это будет отображать элементы как —
Link 1 Link 2 Link 3
Если вы хотите извлечь первый элемент, используйте метод .extract_first () , показанный ниже:
>>response.xpath('//div[@class = "links"]/a/text()').extract_first()
Он будет отображать элемент как —
Link 1
Вложенные селекторы
Используя приведенный выше код, вы можете вкладывать селекторы для отображения ссылки на страницу и источника изображения, используя метод .xpath () , показанный ниже:
links = response.xpath('//a[contains(@href, "image")]') for index, link in enumerate(links): args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) print 'The link %d pointing to url %s and image %s' % args
Он будет отображать результат как —
Link 1 pointing to url [u'one.html'] and image [u'image1.jpg'] Link 2 pointing to url [u'two.html'] and image [u'image2.jpg'] Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']
Селекторы, использующие регулярные выражения
Scrapy позволяет извлекать данные с помощью регулярных выражений, используя метод .re () . Из приведенного выше HTML-кода мы извлечем имена изображений, показанные ниже:
>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
Выше строка отображает имена изображений в виде —
[u'Link 1', u'Link 2', u'Link 3']
Использование относительных XPath
Когда вы работаете с XPath, который начинается с / , вложенные селекторы и XPath связаны с абсолютным путем документа, а не с относительным путем селектора.
Если вы хотите извлечь элементы <p> , то сначала получите все элементы div —
>>mydiv = response.xpath('//div')
Затем вы можете извлечь все элементы ‘p’ внутри, добавив к XPath точку с точкой .//p, как показано ниже —
>>for p in mydiv.xpath('.//p').extract()
Использование расширений EXSLT
EXSLT — это сообщество, которое выпускает расширения для XSLT (преобразования языка расширяемой таблицы стилей), который преобразует XML-документы в XHTML-документы. Вы можете использовать расширения EXSLT с зарегистрированным пространством имен в выражениях XPath, как показано в следующей таблице:
Sr.No | Префикс и использование | Пространство имен |
---|---|---|
1 |
ре регулярные выражения |
|
2 |
задавать манипулирование множеством |
ре
регулярные выражения
http://exslt.org/regexp/index.html
задавать
манипулирование множеством
http://exslt.org/set/index.html
Вы можете проверить простой формат кода для извлечения данных, используя регулярные выражения в предыдущем разделе.
Есть несколько советов по XPath, которые полезны при использовании XPath с селекторами Scrapy. Для получения дополнительной информации, нажмите на эту ссылку .
Scrapy — Предметы
Описание
Процесс Scrapy можно использовать для извлечения данных из таких источников, как веб-страницы, используя пауков. Scrapy использует класс Item для создания выходных данных, чьи объекты используются для сбора очищенных данных.
Объявление предметов
Вы можете объявить элементы, используя синтаксис определения класса вместе с объектами поля, показанными следующим образом:
import scrapy class MyProducts(scrapy.Item): productName = Field() productLink = Field() imageURL = Field() price = Field() size = Field()
Поля предметов
Поля элемента используются для отображения метаданных для каждого поля. Поскольку нет ограничений на значения для объектов поля, доступные ключи метаданных не содержат никакого списка ссылок метаданных. Объекты поля используются для указания всех метаданных поля, и вы можете указать любой другой ключ поля согласно вашему требованию в проекте. К объектам поля можно получить доступ с помощью атрибута Item.fields.
Работа с предметами
Есть несколько общих функций, которые можно определить при работе с элементами. Для получения дополнительной информации, нажмите на эту ссылку .
Расширение предметов
Элементы могут быть расширены путем указания подкласса исходного элемента. Например —
class MyProductDetails(Product): original_rate = scrapy.Field(serializer = str) discount_rate = scrapy.Field()
Вы можете использовать существующие метаданные поля для расширения метаданных поля, добавив дополнительные значения или изменив существующие значения, как показано в следующем коде:
class MyProductPackage(Product): name = scrapy.Field(Product.fields['name'], serializer = serializer_demo)
Предмет Объекты
Объекты элемента могут быть определены с использованием следующего класса, который предоставляет новый инициализированный элемент из данного аргумента —
class scrapy.item.Item([arg])
Item предоставляет копию конструктора и предоставляет дополнительный атрибут, который задается элементами в полях.
Полевые объекты
Объекты поля могут быть указаны с использованием следующего класса, в котором класс Field не выдает дополнительный процесс или атрибуты:
class scrapy.item.Field([arg])
Scrapy — Загрузчики предметов
Описание
Загрузчики элементов предоставляют удобный способ заполнять элементы, которые соскребаются с веб-сайтов.
Объявление загрузчиков предметов
Объявление Загрузчиков Предметов подобно Предметам.
Например —
from scrapy.loader import ItemLoader from scrapy.loader.processors import TakeFirst, MapCompose, Join class DemoLoader(ItemLoader): default_output_processor = TakeFirst() title_in = MapCompose(unicode.title) title_out = Join() size_in = MapCompose(unicode.strip) # you can continue scraping here
В приведенном выше коде вы можете видеть, что входные процессоры объявлены с использованием суффикса _in, а выходные процессоры объявлены с использованием суффикса _out .
Атрибуты ItemLoader.default_input_processor и ItemLoader.default_output_processor используются для объявления процессоров ввода / вывода по умолчанию.
Использование загрузчиков элементов для заполнения элементов
Чтобы использовать Item Loader, сначала создайте экземпляр с помощью dict-like объекта или без него, где элемент использует класс Item, указанный в атрибуте ItemLoader.default_item_class .
-
Вы можете использовать селекторы для сбора значений в Загрузчик элементов.
-
Вы можете добавить больше значений в том же поле элемента, где загрузчик элементов будет использовать соответствующий обработчик для добавления этих значений.
Вы можете использовать селекторы для сбора значений в Загрузчик элементов.
Вы можете добавить больше значений в том же поле элемента, где загрузчик элементов будет использовать соответствующий обработчик для добавления этих значений.
Следующий код демонстрирует, как элементы заполняются с помощью загрузчиков элементов.
from scrapy.loader import ItemLoader from demoproject.items import Demo def parse(self, response): l = ItemLoader(item = Product(), response = response) l.add_xpath("title", "//div[@class = 'product_title']") l.add_xpath("title", "//div[@class = 'product_name']") l.add_xpath("desc", "//div[@class = 'desc']") l.add_css("size", "div#size]") l.add_value("last_updated", "yesterday") return l.load_item()
Как показано выше, есть два разных XPath, из которых поле заголовка извлекается с помощью метода add_xpath () —
1. //div[@class = "product_title"]
2. //div[@class = "product_name"]
После этого аналогичный запрос используется для поля desc . Данные о размере извлекаются с использованием метода add_css (), а last_updated заполняется значением «вчера» с использованием метода add_value () .
Как только все данные собраны, вызовите метод ItemLoader.load_item (), который возвращает элементы, заполненные данными, извлеченными с использованием методов add_xpath () , add_css () и add_value () .
Процессоры ввода и вывода
Каждое поле загрузчика элементов содержит один входной процессор и один выходной процессор.
-
Когда данные извлекаются, процессор ввода обрабатывает их и их результат сохраняется в ItemLoader.
-
Затем, после сбора данных, вызовите метод ItemLoader.load_item (), чтобы получить заполненный объект Item.
-
Наконец, вы можете присвоить результат обработчику вывода элементу.
Когда данные извлекаются, процессор ввода обрабатывает их и их результат сохраняется в ItemLoader.
Затем, после сбора данных, вызовите метод ItemLoader.load_item (), чтобы получить заполненный объект Item.
Наконец, вы можете присвоить результат обработчику вывода элементу.
Следующий код демонстрирует, как вызывать процессоры ввода и вывода для определенного поля:
l = ItemLoader(Product(), some_selector) l.add_xpath("title", xpath1) # [1] l.add_xpath("title", xpath2) # [2] l.add_css("title", css) # [3] l.add_value("title", "demo") # [4] return l.load_item() # [5]
Строка 1 — данные заголовка извлекаются из xpath1 и передаются через процессор ввода, а их результат собирается и сохраняется в ItemLoader.
Строка 2 — аналогично, заголовок извлекается из xpath2 и проходит через тот же процессор ввода, а его результат добавляется к данным, собранным для [1].
Строка 3 — заголовок извлекается из селектора css и передается через тот же процессор ввода, а результат добавляется к данным, собранным для [1] и [2].
Строка 4 — Далее значение «demo» назначается и передается через процессоры ввода.
Строка 5 — Наконец, данные собираются внутри всех полей и передаются в выходной процессор, и окончательное значение присваивается Элементу.
Объявление процессоров ввода и вывода
Процессоры ввода и вывода объявлены в определении ItemLoader. Кроме того, они также могут быть указаны в метаданных поля элемента .
Например —
import scrapy from scrapy.loader.processors import Join, MapCompose, TakeFirst from w3lib.html import remove_tags def filter_size(value): if value.isdigit(): return value class Item(scrapy.Item): name = scrapy.Field( input_processor = MapCompose(remove_tags), output_processor = Join(), ) size = scrapy.Field( input_processor = MapCompose(remove_tags, filter_price), output_processor = TakeFirst(), ) >>> from scrapy.loader import ItemLoader >>> il = ItemLoader(item = Product()) >>> il.add_value('title', [u'Hello', u'<strong>world</strong>']) >>> il.add_value('size', [u'<span>100 kg</span>']) >>> il.load_item()
Он отображает вывод как —
{'title': u'Hello world', 'size': u'100 kg'}
Контекст загрузчика элементов
Контекст загрузчика элементов — это набор произвольных значений ключей, общих для процессоров ввода и вывода.
Например, предположим, что у вас есть функция parse_length —
def parse_length(text, loader_context): unit = loader_context.get('unit', 'cm') # You can write parsing code of length here return parsed_length
Получая аргументы loader_context, он сообщает загрузчику элементов, что он может получить контекст загрузчика элементов. Есть несколько способов изменить значение контекста Item Loader —
-
Изменить текущий активный контекст загрузчика элементов —
Изменить текущий активный контекст загрузчика элементов —
loader = ItemLoader (product) loader.context ["unit"] = "mm"
-
На экземпляре Item Loader —
На экземпляре Item Loader —
loader = ItemLoader(product, unit = "mm")
-
В объявлении Item Loader для процессоров ввода / вывода, которые создаются с контекстом Item Loader —
В объявлении Item Loader для процессоров ввода / вывода, которые создаются с контекстом Item Loader —
class ProductLoader(ItemLoader): length_out = MapCompose(parse_length, unit = "mm")
ItemLoader Objects
Это объект, который возвращает загрузчик нового элемента, чтобы заполнить данный элемент. У него есть следующий класс —
class scrapy.loader.ItemLoader([item, selector, response, ]**kwargs)
В следующей таблице приведены параметры объектов ItemLoader —
Sr.No | Параметр и описание |
---|---|
1 |
вещь Это элемент для заполнения с помощью вызова add_xpath (), add_css () или add_value (). |
2 |
селектор Он используется для извлечения данных с веб-сайтов. |
3 |
ответ Он используется для создания селектора с использованием default_selector_class. |
вещь
Это элемент для заполнения с помощью вызова add_xpath (), add_css () или add_value ().
селектор
Он используется для извлечения данных с веб-сайтов.
ответ
Он используется для создания селектора с использованием default_selector_class.
В следующей таблице показаны методы объектов ItemLoader —
Sr.No | Метод и описание | пример |
---|---|---|
1 |
get_value (значение, * процессоры, ** kwargs) При заданном аргументе процессора и ключевого слова значение обрабатывается методом get_value (). |
>>> from scrapy.loader.processors import TakeFirst >>> loader.get_value(u'title: demoweb', TakeFirst(), unicode.upper, re = 'title: (.+)') 'DEMOWEB` |
2 |
add_value (field_name, value, * processors, ** kwargs) Он обрабатывает значение и добавляет его в поле, где оно сначала передается через get_value, передавая процессоры и аргументы ключевых слов перед передачей через поле ввода процессора. |
loader.add_value('title', u'DVD') loader.add_value('colors', [u'black', u'white']) loader.add_value('length', u'80') loader.add_value('price', u'2500') |
3 |
replace_value (имя_поля, значение, * процессоры, ** kwargs) Он заменяет собранные данные новым значением. |
loader.replace_value('title', u'DVD') loader.replace_value('colors', [u'black', u'white']) loader.replace_value('length', u'80') loader.replace_value('price', u'2500') |
4 |
get_xpath (xpath, * процессоры, ** kwargs) Он используется для извлечения строк Юникода, давая процессоры и аргументы ключевых слов, получая XPath . |
# HTML code: <div class = "item-name">DVD</div> loader.get_xpath("//div[@class = 'item-name']") # HTML code: <div id = "length">the length is 45cm</div> loader.get_xpath("//div[@id = 'length']", TakeFirst(), re = "the length is (.*)") |
5 |
add_xpath (имя_поля, xpath, * процессоры, ** kwargs) Он получает XPath в поле, которое извлекает строки Unicode. |
# HTML code: <div class = "item-name">DVD</div> loader.add_xpath('name', '//div[@class = "item-name"]') # HTML code: <div id = "length">the length is 45cm</div> loader.add_xpath('length', '//div[@id = "length"]', re = 'the length is (.*)') |
6 |
replace_xpath (field_name, xpath, * процессоры, ** kwargs) Он заменяет собранные данные с помощью XPath с сайтов. |
# HTML code: <div class = "item-name">DVD</div> loader.replace_xpath('name', '//div[@class = "item-name"]') # HTML code: <div id = "length">the length is 45cm</div> loader.replace_xpath('length', '//div[@id = "length"]', re = 'the length is (.*)') |
7 |
get_css (css, * процессоры, ** kwargs) Он получает селектор CSS, используемый для извлечения Unicode-строк. |
loader.get_css("div.item-name") loader.get_css("div#length", TakeFirst(), re = "the length is (.*)") |
8 |
add_css (имя_поля, css, * процессоры, ** kwargs) Он похож на метод add_value () с одним отличием в том, что он добавляет селектор CSS в поле. |
loader.add_css('name', 'div.item-name') loader.add_css('length', 'div#length', re = 'the length is (.*)') |
9 |
replace_css (имя_поля, css, * процессоры, ** kwargs) Он заменяет извлеченные данные с помощью селектора CSS. |
loader.replace_css('name', 'div.item-name') loader.replace_css('length', 'div#length', re = 'the length is (.*)') |
10 |
load_item () Когда данные собраны, этот метод заполняет элемент собранными данными и возвращает их. |
def parse(self, response): l = ItemLoader(item = Product(), response = response) l.add_xpath('title', '//div[@class = "product_title"]') loader.load_item() |
11 |
nested_xpath (XPath) Он используется для создания вложенных загрузчиков с помощью селектора XPath. |
loader = ItemLoader(item = Item()) loader.add_xpath('social', 'a[@class = "social"]/@href') loader.add_xpath('email', 'a[@class = "email"]/@href') |
12 |
nested_css (CSS) Он используется для создания вложенных загрузчиков с помощью селектора CSS. |
loader = ItemLoader(item = Item()) loader.add_css('social', 'a[@class = "social"]/@href') loader.add_css('email', 'a[@class = "email"]/@href') |
get_value (значение, * процессоры, ** kwargs)
При заданном аргументе процессора и ключевого слова значение обрабатывается методом get_value ().
add_value (field_name, value, * processors, ** kwargs)
Он обрабатывает значение и добавляет его в поле, где оно сначала передается через get_value, передавая процессоры и аргументы ключевых слов перед передачей через поле ввода процессора.
replace_value (имя_поля, значение, * процессоры, ** kwargs)
Он заменяет собранные данные новым значением.
get_xpath (xpath, * процессоры, ** kwargs)
Он используется для извлечения строк Юникода, давая процессоры и аргументы ключевых слов, получая XPath .
add_xpath (имя_поля, xpath, * процессоры, ** kwargs)
Он получает XPath в поле, которое извлекает строки Unicode.
replace_xpath (field_name, xpath, * процессоры, ** kwargs)
Он заменяет собранные данные с помощью XPath с сайтов.
get_css (css, * процессоры, ** kwargs)
Он получает селектор CSS, используемый для извлечения Unicode-строк.
add_css (имя_поля, css, * процессоры, ** kwargs)
Он похож на метод add_value () с одним отличием в том, что он добавляет селектор CSS в поле.
replace_css (имя_поля, css, * процессоры, ** kwargs)
Он заменяет извлеченные данные с помощью селектора CSS.
load_item ()
Когда данные собраны, этот метод заполняет элемент собранными данными и возвращает их.
nested_xpath (XPath)
Он используется для создания вложенных загрузчиков с помощью селектора XPath.
nested_css (CSS)
Он используется для создания вложенных загрузчиков с помощью селектора CSS.
В следующей таблице показаны атрибуты объектов ItemLoader —
Sr.No | Атрибут и описание |
---|---|
1 |
вещь Это объект, на котором Item Loader выполняет разбор. |
2 |
контекст Это текущий контекст загрузчика элементов, который активен. |
3 |
default_item_class Он используется для представления элементов, если он не указан в конструкторе. |
4 |
default_input_processor Поля, в которых не указан процессор ввода, являются единственными, для которых используются default_input_processors. |
5 |
default_output_processor Поля, в которых не указан выходной процессор, являются единственными, для которых используются default_output_processors. |
6 |
default_selector_class Это класс, используемый для создания селектора, если он не задан в конструкторе. |
7 |
селектор Это объект, который можно использовать для извлечения данных с сайтов. |
вещь
Это объект, на котором Item Loader выполняет разбор.
контекст
Это текущий контекст загрузчика элементов, который активен.
default_item_class
Он используется для представления элементов, если он не указан в конструкторе.
default_input_processor
Поля, в которых не указан процессор ввода, являются единственными, для которых используются default_input_processors.
default_output_processor
Поля, в которых не указан выходной процессор, являются единственными, для которых используются default_output_processors.
default_selector_class
Это класс, используемый для создания селектора, если он не задан в конструкторе.
селектор
Это объект, который можно использовать для извлечения данных с сайтов.
Вложенные Погрузчики
Он используется для создания вложенных загрузчиков при разборе значений из подраздела документа. Если вы не создаете вложенные загрузчики, вам нужно указать полный XPath или CSS для каждого значения, которое вы хотите извлечь.
Например, предположим, что данные извлекаются из страницы заголовка —
<header> <a class = "social" href = "http://facebook.com/whatever">facebook</a> <a class = "social" href = "http://twitter.com/whatever">twitter</a> <a class = "email" href = "mailto:[email protected]">send mail</a> </header>
Затем вы можете создать вложенный загрузчик с селектором заголовка, добавив связанные значения в заголовок —
loader = ItemLoader(item = Item()) header_loader = loader.nested_xpath('//header') header_loader.add_xpath('social', 'a[@class = "social"]/@href') header_loader.add_xpath('email', 'a[@class = "email"]/@href') loader.load_item()
Повторное использование и расширение загрузчиков предметов
Загрузчики предметов предназначены для облегчения обслуживания, которое становится фундаментальной проблемой, когда ваш проект приобретает больше пауков.
Например, предположим, что на сайте название продукта заключено в три черты (например, —DVD —). Вы можете удалить эти черточки, повторно используя загрузчик элементов товара по умолчанию, если вы не хотите, чтобы он был в окончательных названиях продуктов, как показано в следующем коде —
from scrapy.loader.processors import MapCompose from demoproject.ItemLoaders import DemoLoader def strip_dashes(x): return x.strip('-') class SiteSpecificLoader(DemoLoader): title_in = MapCompose(strip_dashes, DemoLoader.title_in)
Доступные встроенные процессоры
Ниже приведены некоторые из наиболее часто используемых встроенных процессоров:
класс scrapy.loader.processors.Identity
Возвращает исходное значение без изменения. Например —
>>> from scrapy.loader.processors import Identity >>> proc = Identity() >>> proc(['a', 'b', 'c']) ['a', 'b', 'c']
класс scrapy.loader.processors.TakeFirst
Возвращает первое значение, которое не является нулевым / непустым из списка полученных значений. Например —
>>> from scrapy.loader.processors import TakeFirst >>> proc = TakeFirst() >>> proc(['', 'a', 'b', 'c']) 'a'
класс scrapy.loader.processors.Join (разделитель = u »)
Возвращает значение, прикрепленное к разделителю. Разделителем по умолчанию является u », и он эквивалентен функции u » .join . Например —
>>> from scrapy.loader.processors import Join >>> proc = Join() >>> proc(['a', 'b', 'c']) u'a b c' >>> proc = Join('<br>') >>> proc(['a', 'b', 'c']) u'a<br>b<br>c'
класс scrapy.loader.processors.Compose (* функции, ** default_loader_context)
Он определяется процессором, в котором каждое его входное значение передается первой функции, а результат этой функции передается второй функции и т. Д., Пока функция ast не вернет конечное значение в качестве вывода.
Например —
>>> from scrapy.loader.processors import Compose >>> proc = Compose(lambda v: v[0], str.upper) >>> proc(['python', 'scrapy']) 'PYTHON'
класс scrapy.loader.processors.MapCompose (* функции, ** default_loader_context)
Это процессор, в котором входное значение повторяется, и первая функция применяется к каждому элементу. Затем результат этих вызовов функций объединяется для создания новой итерации, которая затем применяется ко второй функции и т. Д. До последней функции.
Например —
>>> def filter_scrapy(x): return None if x == 'scrapy' else x >>> from scrapy.loader.processors import MapCompose >>> proc = MapCompose(filter_scrapy, unicode.upper) >>> proc([u'hi', u'everyone', u'im', u'pythonscrapy']) [u'HI, u'IM', u'PYTHONSCRAPY']
класс scrapy.loader.processors.SelectJmes (json_path)
Этот класс запрашивает значение, используя предоставленный путь json, и возвращает выходные данные.
Например —
>>> from scrapy.loader.processors import SelectJmes, Compose, MapCompose >>> proc = SelectJmes("hello") >>> proc({'hello': 'scrapy'}) 'scrapy' >>> proc({'hello': {'scrapy': 'world'}}) {'scrapy': 'world'}
Ниже приведен код, который запрашивает значение путем импорта json —
>>> import json >>> proc_single_json_str = Compose(json.loads, SelectJmes("hello")) >>> proc_single_json_str('{"hello": "scrapy"}') u'scrapy' >>> proc_json_list = Compose(json.loads, MapCompose(SelectJmes('hello'))) >>> proc_json_list('[{"hello":"scrapy"}, {"world":"env"}]') [u'scrapy']
Scrapy — Shell
Описание
Оболочку Scrapy можно использовать для очистки данных с помощью безошибочного кода, без использования паука. Основная цель оболочки Scrapy — проверить извлеченный код, XPath или CSS-выражения. Это также помогает указать веб-страницы, с которых вы копируете данные.
Настройка оболочки
Оболочку можно настроить, установив консоль IPython (используется для интерактивных вычислений), которая представляет собой мощную интерактивную оболочку, которая обеспечивает автоматическое завершение, цветной вывод и т. Д.
Если вы работаете на платформе Unix, то лучше установить IPython. Вы также можете использовать bpython , если IPython недоступен.
Вы можете настроить оболочку, установив переменную среды SCRAPY_PYTHON_SHELL или определив файл scrapy.cfg следующим образом:
[settings] shell = bpython
Запуск оболочки
Оболочка Scrapy может быть запущена с помощью следующей команды —
scrapy shell <url>
URL-адрес указывает URL-адрес, для которого необходимо очистить данные.
Используя Shell
Оболочка предоставляет некоторые дополнительные ярлыки и объекты Scrapy, как описано в следующей таблице:
Доступные ярлыки
Shell предоставляет следующие доступные ярлыки в проекте —
Sr.No | Ярлык и описание |
---|---|
1 |
shelp () Он предоставляет доступные объекты и ярлыки с помощью опции справки. |
2 |
выборки (request_or_url) Он собирает ответ от запроса или URL, и связанные объекты будут обновляться должным образом. |
3 |
Вид (ответ) Вы можете просмотреть ответ на данный запрос в локальном браузере для наблюдения и, чтобы правильно отобразить внешнюю ссылку, он добавляет базовый тег к телу ответа. |
shelp ()
Он предоставляет доступные объекты и ярлыки с помощью опции справки.
выборки (request_or_url)
Он собирает ответ от запроса или URL, и связанные объекты будут обновляться должным образом.
Вид (ответ)
Вы можете просмотреть ответ на данный запрос в локальном браузере для наблюдения и, чтобы правильно отобразить внешнюю ссылку, он добавляет базовый тег к телу ответа.
Доступные объекты Scrapy
Shell предоставляет следующие доступные объекты Scrapy в проекте —
Sr.No | Объект и описание |
---|---|
1 |
гусеничный трактор Он указывает текущий объект сканера. |
2 |
паук Если для текущего URL нет паука, он будет обрабатывать объект URL или паука, определяя нового паука. |
3 |
запрос Указывает объект запроса для последней собранной страницы. |
4 |
ответ Он указывает объект ответа для последней собранной страницы. |
5 |
настройки Он предоставляет текущие настройки Scrapy. |
гусеничный трактор
Он указывает текущий объект сканера.
паук
Если для текущего URL нет паука, он будет обрабатывать объект URL или паука, определяя нового паука.
запрос
Указывает объект запроса для последней собранной страницы.
ответ
Он указывает объект ответа для последней собранной страницы.
настройки
Он предоставляет текущие настройки Scrapy.
Пример сессии Shell
Давайте попробуем очистить сайт scrapy.org, а затем начнем собирать данные с reddit.com, как описано.
Прежде чем двигаться вперед, сначала запустим оболочку, как показано в следующей команде —
scrapy shell 'http://scrapy.org' --nolog
Scrapy будет отображать доступные объекты при использовании вышеуказанного URL —
[s] Available Scrapy objects: [s] crawler <scrapy.crawler.Crawler object at 0x1e16b50> [s] item {} [s] request <GET http://scrapy.org > [s] response <200 http://scrapy.org > [s] settings <scrapy.settings.Settings object at 0x2bfd650> [s] spider <Spider 'default' at 0x20c6f50> [s] Useful shortcuts: [s] shelp() Provides available objects and shortcuts with help option [s] fetch(req_or_url) Collects the response from the request or URL and associated objects will get update [s] view(response) View the response for the given request
Далее начнем с обработки объектов, показанных следующим образом —
>> response.xpath('//title/text()').extract_first() u'Scrapy | A Fast and Powerful Scraping and Web Crawling Framework' >> fetch("http://reddit.com") [s] Available Scrapy objects: [s] crawler [s] item {} [s] request [s] response <200 https://www.reddit.com/> [s] settings [s] spider [s] Useful shortcuts: [s] shelp() Shell help (print this help) [s] fetch(req_or_url) Fetch request (or URL) and update local objects [s] view(response) View response in a browser >> response.xpath('//title/text()').extract() [u'reddit: the front page of the internet'] >> request = request.replace(method="POST") >> fetch(request) [s] Available Scrapy objects: [s] crawler ...
Вызов оболочки от пауков для проверки ответов
Вы можете проверить ответы, которые обрабатываются пауком, только если вы ожидаете получить этот ответ.
Например —
import scrapy class SpiderDemo(scrapy.Spider): name = "spiderdemo" start_urls = [ "http://mysite.com", "http://mysite1.org", "http://mysite2.net", ] def parse(self, response): # You can inspect one specific response if ".net" in response.url: from scrapy.shell import inspect_response inspect_response(response, self)
Как показано в приведенном выше коде, вы можете вызывать оболочку от пауков для проверки ответов, используя следующую функцию —
scrapy.shell.inspect_response
Теперь запустите паука, и вы получите следующий экран —
2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None) 2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None) 2016-02-08 18:15:20-0400 [scrapy] DEBUG: Crawled (200) (referer: None) [s] Available Scrapy objects: [s] crawler ... >> response.url 'http://mysite2.org'
Вы можете проверить, работает ли извлеченный код, используя следующий код —
>> response.xpath('//div[@class = "val"]')
Он отображает вывод как
[]
Выше строка показала только пустой вывод. Теперь вы можете вызвать оболочку для проверки ответа следующим образом:
>> view(response)
Он отображает ответ как
True
Scrapy — Item Pipeline
Описание
Конвейер элементов — это метод обработки отбракованных элементов. Когда элемент отправляется в конвейер элементов, он обрабатывается пауком и обрабатывается с использованием нескольких компонентов, которые выполняются последовательно.
Всякий раз, когда предмет получен, он решает одно из следующих действий:
- Продолжайте обрабатывать предмет.
- Брось это из трубопровода.
- Прекратить обработку элемента.
Товаропроводы обычно используются для следующих целей —
- Хранение очищенных элементов в базе данных.
- Если полученный предмет повторяется, он отбрасывает повторяющийся предмет.
- Он проверит, относится ли элемент к целевым полям.
- Очистка данных HTML.
Синтаксис
Вы можете написать Item Pipeline, используя следующий метод —
process_item(self, item, spider)
Вышеуказанный метод содержит следующие параметры:
- Предмет (предметный предмет или словарь) — указывает очищаемый предмет.
- паук (объект паука) — паук, который очистил предмет.
Вы можете использовать дополнительные методы, приведенные в следующей таблице —
Sr.No | Метод и описание | параметры |
---|---|---|
1 |
open_spider ( сам, паук ) Он выбирается при открытии паука. |
паук (объект паука) — относится к открытому пауку. |
2 |
close_spider ( сам, паук ) Выбирается, когда паук закрыт. |
паук (объект паука) — относится к пауку, который был закрыт. |
3 |
from_crawler ( cls, crawler ) С помощью сканера, конвейер может получить доступ к основным компонентам, таким как сигналы и настройки Scrapy. |
crawler (объект Crawler) — относится к сканеру, который использует этот конвейер. |
open_spider ( сам, паук )
Он выбирается при открытии паука.
паук (объект паука) — относится к открытому пауку.
close_spider ( сам, паук )
Выбирается, когда паук закрыт.
паук (объект паука) — относится к пауку, который был закрыт.
from_crawler ( cls, crawler )
С помощью сканера, конвейер может получить доступ к основным компонентам, таким как сигналы и настройки Scrapy.
crawler (объект Crawler) — относится к сканеру, который использует этот конвейер.
пример
Ниже приведены примеры конвейера элементов, используемых в различных концепциях.
Отбрасывание предметов без тега
В следующем коде конвейер балансирует атрибут (цена) для тех товаров, которые не включают НДС (атрибут exclude_vat), и игнорирует те товары, у которых нет ценника.
from Scrapy.exceptions import DropItem class PricePipeline(object): vat = 2.25 def process_item(self, item, spider): if item['price']: if item['excludes_vat']: item['price'] = item['price'] * self.vat return item else: raise DropItem("Missing price in %s" % item)
Запись элементов в файл JSON
Следующий код будет хранить все очищенные элементы от всех пауков в одном файле items.jl , который содержит один элемент на строку в сериализованной форме в формате JSON. Класс JsonWriterPipeline используется в коде, чтобы показать, как писать конвейер элементов —
import json class JsonWriterPipeline(object): def __init__(self): self.file = open('items.jl', 'wb') def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line) return item
Запись элементов в MongoDB
Вы можете указать адрес и имя базы данных MongoDB в настройках Scrapy, а коллекцию MongoDB можно назвать по имени класса элемента. Следующий код описывает, как использовать метод from_crawler () для правильного сбора ресурсов:
import pymongo class MongoPipeline(object): collection_name = 'Scrapy_list' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db @classmethod def from_crawler(cls, crawler): return cls( mongo_uri = crawler.settings.get('MONGO_URI'), mongo_db = crawler.settings.get('MONGO_DB', 'lists') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def close_spider(self, spider): self.client.close() def process_item(self, item, spider): self.db[self.collection_name].insert(dict(item)) return item
Дублирующие фильтры
Фильтр проверит повторяющиеся элементы и отбросит уже обработанные элементы. В следующем коде мы использовали уникальный идентификатор для наших элементов, но spider возвращает много элементов с одинаковым идентификатором —
from scrapy.exceptions import DropItem class DuplicatesPipeline(object): def __init__(self): self.ids_seen = set() def process_item(self, item, spider): if item['id'] in self.ids_seen: raise DropItem("Repeated items found: %s" % item) else: self.ids_seen.add(item['id']) return item
Активация конвейера предметов
Вы можете активировать компонент Item Pipeline, добавив его класс в настройку ITEM_PIPELINES, как показано в следующем коде. Вы можете присваивать целочисленные значения классам в порядке их выполнения (порядок может быть ниже для классов с более высокими значениями), и значения будут находиться в диапазоне 0-1000.
ITEM_PIPELINES = { 'myproject.pipelines.PricePipeline': 100, 'myproject.pipelines.JsonWriterPipeline': 600, }
Scrapy — Экспорт кормов
Описание
Экспорт фидов — это метод хранения данных, извлеченных с сайтов, который создает «файл экспорта» .
Форматы сериализации
Используя несколько форматов сериализации и хранилища данных, Feed Exports использует экспортеры элементов и генерирует ленту с очищенными элементами.
В следующей таблице приведены поддерживаемые форматы
Sr.No | Формат и описание |
---|---|
1 |
JSON FEED_FORMAT — это JSON Используется экспортер класса scrapy.exporters.JsonItemExporter |
2 |
Строки JSON FEED_FROMAT — это jsonlines Используется экспортер класса scrapy.exporters.JsonLinesItemExporter |
3 |
CSV FEED_FORMAT — это CSV Используемым экспортером является класс scrapy.exporters.CsvItemExporter |
4 |
XML FEED_FORMAT — это xml Используется экспортер класса scrapy.exporters.XmlItemExporter |
JSON
FEED_FORMAT — это JSON
Используется экспортер класса scrapy.exporters.JsonItemExporter
Строки JSON
FEED_FROMAT — это jsonlines
Используется экспортер класса scrapy.exporters.JsonLinesItemExporter
CSV
FEED_FORMAT — это CSV
Используемым экспортером является класс scrapy.exporters.CsvItemExporter
XML
FEED_FORMAT — это xml
Используется экспортер класса scrapy.exporters.XmlItemExporter
Используя настройки FEED_EXPORTERS , поддерживаемые форматы также могут быть расширены —
Sr.No | Формат и описание |
---|---|
1 |
Соленый огурец FEED_FORMAT это пикель Используется экспортер класса scrapy.exporters.PickleItemExporter |
2 |
маршал FEED_FORMAT является маршалом Используется экспортер класса scrapy.exporters.MarshalItemExporter |
Соленый огурец
FEED_FORMAT это пикель
Используется экспортер класса scrapy.exporters.PickleItemExporter
маршал
FEED_FORMAT является маршалом
Используется экспортер класса scrapy.exporters.MarshalItemExporter
Хранение Backends
Бэкэнд хранилища определяет, где хранить канал, используя URI.
В следующей таблице приведены поддерживаемые бэкэнды хранилища.
Sr.No | Хранение Backend & Описание |
---|---|
1 |
Локальная файловая система Схема URI является файловой и используется для хранения каналов. |
2 |
FTP Схема URI — ftp, и она используется для хранения каналов. |
3 |
S3 Схема URI — S3, а каналы хранятся в Amazon S3. Требуются внешние библиотеки botocore или boto . |
4 |
Стандартный вывод Схема URI — это стандартный вывод, и каналы сохраняются для стандартного вывода. |
Локальная файловая система
Схема URI является файловой и используется для хранения каналов.
FTP
Схема URI — ftp, и она используется для хранения каналов.
S3
Схема URI — S3, а каналы хранятся в Amazon S3. Требуются внешние библиотеки botocore или boto .
Стандартный вывод
Схема URI — это стандартный вывод, и каналы сохраняются для стандартного вывода.
Параметры URI хранилища
Ниже приведены параметры URL-адреса хранилища, который заменяется при создании канала.
- % (время) с: этот параметр заменяется меткой времени.
- % (name) s: этот параметр заменяется именем паука.
настройки
В следующей таблице приведены параметры, с помощью которых можно настроить экспорт каналов.
Sr.No | Настройка и описание |
---|---|
1 |
FEED_URI Это URI фида экспорта, используемый для включения экспорта фидов. |
2 |
FEED_FORMAT Это формат сериализации, используемый для канала. |
3 |
FEED_EXPORT_FIELDS Используется для определения полей, которые необходимо экспортировать. |
4 |
FEED_STORE_EMPTY Определяет, экспортировать ли каналы без элементов. |
5 |
FEED_STORAGES Это словарь с дополнительными хранилищами каналов. |
6 |
FEED_STORAGES_BASE Это словарь со встроенным хранилищем каналов. |
7 |
FEED_EXPORTERS Это словарь с дополнительными кормами для экспортеров. |
8 |
FEED_EXPORTERS_BASE Это словарь со встроенными фидами экспортеров. |
FEED_URI
Это URI фида экспорта, используемый для включения экспорта фидов.
FEED_FORMAT
Это формат сериализации, используемый для канала.
FEED_EXPORT_FIELDS
Используется для определения полей, которые необходимо экспортировать.
FEED_STORE_EMPTY
Определяет, экспортировать ли каналы без элементов.
FEED_STORAGES
Это словарь с дополнительными хранилищами каналов.
FEED_STORAGES_BASE
Это словарь со встроенным хранилищем каналов.
FEED_EXPORTERS
Это словарь с дополнительными кормами для экспортеров.
FEED_EXPORTERS_BASE
Это словарь со встроенными фидами экспортеров.
Scrapy — Запросы и ответы
Описание
Scrapy может сканировать веб-сайты, используя объекты запросов и ответов . Объекты запроса проходят через систему, используют пауки для выполнения запроса и возвращаются к запросу, когда он возвращает объект ответа.
Объекты запроса
Объект запроса — это HTTP-запрос, который генерирует ответ. У него есть следующий класс —
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
В следующей таблице приведены параметры объектов запроса —
Sr.No | Параметр и описание |
---|---|
1 |
URL Это строка, которая указывает URL-запрос. |
2 |
Перезвоните Это вызываемая функция, которая использует ответ на запрос в качестве первого параметра. |
3 |
метод Это строка, определяющая запрос метода HTTP. |
4 |
заголовки Это словарь с заголовками запросов. |
5 |
тело Это строка или Unicode, которая имеет тело запроса. |
6 |
печенье Это список, содержащий запрос куки. |
7 |
мета Это словарь, который содержит значения для метаданных запроса. |
8 |
кодирование Это строка, содержащая кодировку utf-8, используемую для кодирования URL. |
9 |
приоритет Это целое число, в котором планировщик использует приоритет для определения порядка обработки запросов. |
10 |
dont_filter Это логическое значение, указывающее, что планировщик не должен фильтровать запрос. |
11 |
errback Это вызываемая функция, которая вызывается при возникновении исключения во время обработки запроса. |
URL
Это строка, которая указывает URL-запрос.
Перезвоните
Это вызываемая функция, которая использует ответ на запрос в качестве первого параметра.
метод
Это строка, определяющая запрос метода HTTP.
заголовки
Это словарь с заголовками запросов.
тело
Это строка или Unicode, которая имеет тело запроса.
печенье
Это список, содержащий запрос куки.
мета
Это словарь, который содержит значения для метаданных запроса.
кодирование
Это строка, содержащая кодировку utf-8, используемую для кодирования URL.
приоритет
Это целое число, в котором планировщик использует приоритет для определения порядка обработки запросов.
dont_filter
Это логическое значение, указывающее, что планировщик не должен фильтровать запрос.
errback
Это вызываемая функция, которая вызывается при возникновении исключения во время обработки запроса.
Передача дополнительных данных в функции обратного вызова
Функция обратного вызова запроса вызывается, когда ответ загружается в качестве первого параметра.
Например —
def parse_page1(self, response): return scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) def parse_page2(self, response): self.logger.info("%s page visited", response.url)
Вы можете использовать атрибут Request.meta , если хотите передать аргументы вызываемым функциям и получить эти аргументы во втором обратном вызове , как показано в следующем примере —
def parse_page1(self, response): item = DemoItem() item['foremost_link'] = response.url request = scrapy.Request("http://www.something.com/some_page.html", callback = self.parse_page2) request.meta['item'] = item return request def parse_page2(self, response): item = response.meta['item'] item['other_link'] = response.url return item
Использование ошибок для отлова исключений в обработке запросов
Ошибка — это вызываемая функция, которая вызывается при возникновении исключения во время обработки запроса.
Следующий пример демонстрирует это —
import scrapy from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import DNSLookupError from twisted.internet.error import TimeoutError, TCPTimedOutError class DemoSpider(scrapy.Spider): name = "demo" start_urls = [ "http://www.httpbin.org/", # HTTP 200 expected "http://www.httpbin.org/status/404", # Webpage not found "http://www.httpbin.org/status/500", # Internal server error "http://www.httpbin.org:12345/", # timeout expected "http://www.httphttpbinbin.org/", # DNS error expected ] def start_requests(self): for u in self.start_urls: yield scrapy.Request(u, callback = self.parse_httpbin, errback = self.errback_httpbin, dont_filter=True) def parse_httpbin(self, response): self.logger.info('Recieved response from {}'.format(response.url)) # ... def errback_httpbin(self, failure): # logs failures self.logger.error(repr(failure)) if failure.check(HttpError): response = failure.value.response self.logger.error("HttpError occurred on %s", response.url) elif failure.check(DNSLookupError): request = failure.request self.logger.error("DNSLookupError occurred on %s", request.url) elif failure.check(TimeoutError, TCPTimedOutError): request = failure.request self.logger.error("TimeoutError occurred on %s", request.url)
Request.meta Специальные ключи
Специальные ключи request.meta — это список специальных мета-ключей, идентифицированных Scrapy.
В следующей таблице приведены некоторые ключи Request.meta —
Sr.No | Ключ и описание |
---|---|
1 |
dont_redirect Это ключ, если задано значение true, не перенаправляет запрос в зависимости от состояния ответа. |
2 |
dont_retry Этот ключ имеет значение true, не повторяет неудавшиеся запросы и будет игнорироваться промежуточным ПО. |
3 |
handle_httpstatus_list Это ключ, который определяет, какие коды ответов могут быть разрешены для каждого запроса. |
4 |
handle_httpstatus_all Это ключ, используемый для разрешения любого кода ответа на запрос путем установки его в значение true . |
5 |
dont_merge_cookies Это ключ, который используется для предотвращения слияния с существующими файлами cookie, установив для него значение true . |
6 |
cookiejar Это ключ, используемый для хранения нескольких сеансов cookie для каждого паука. |
7 |
dont_cache Это ключ, используемый для предотвращения кэширования HTTP-запросов и ответов на каждую политику. |
8 |
redirect_urls Это ключ, содержащий URL-адреса, по которым проходят запросы. |
9 |
BindAddress Это IP-адрес исходящего IP-адреса, который можно использовать для выполнения запроса. |
10 |
dont_obey_robotstxt Ключ имеет значение true и не фильтрует запросы, запрещенные стандартом исключения robots.txt, даже если включен ROBOTSTXT_OBEY. |
11 |
download_timeout Он используется для установки времени ожидания (в секундах) для каждого паука, которое загрузчик будет ожидать до истечения времени ожидания. |
12 |
download_maxsize Он используется для установки максимального размера (в байтах) для каждого паука, который загрузчик загрузит. |
13 |
полномочие Прокси может быть установлен для объектов запроса, чтобы установить HTTP прокси для использования запросов. |
dont_redirect
Это ключ, если задано значение true, не перенаправляет запрос в зависимости от состояния ответа.
dont_retry
Этот ключ имеет значение true, не повторяет неудавшиеся запросы и будет игнорироваться промежуточным ПО.
handle_httpstatus_list
Это ключ, который определяет, какие коды ответов могут быть разрешены для каждого запроса.
handle_httpstatus_all
Это ключ, используемый для разрешения любого кода ответа на запрос путем установки его в значение true .
dont_merge_cookies
Это ключ, который используется для предотвращения слияния с существующими файлами cookie, установив для него значение true .
cookiejar
Это ключ, используемый для хранения нескольких сеансов cookie для каждого паука.
dont_cache
Это ключ, используемый для предотвращения кэширования HTTP-запросов и ответов на каждую политику.
redirect_urls
Это ключ, содержащий URL-адреса, по которым проходят запросы.
BindAddress
Это IP-адрес исходящего IP-адреса, который можно использовать для выполнения запроса.
dont_obey_robotstxt
Ключ имеет значение true и не фильтрует запросы, запрещенные стандартом исключения robots.txt, даже если включен ROBOTSTXT_OBEY.
download_timeout
Он используется для установки времени ожидания (в секундах) для каждого паука, которое загрузчик будет ожидать до истечения времени ожидания.
download_maxsize
Он используется для установки максимального размера (в байтах) для каждого паука, который загрузчик загрузит.
полномочие
Прокси может быть установлен для объектов запроса, чтобы установить HTTP прокси для использования запросов.
Запросить подклассы
Вы можете реализовать свои собственные пользовательские функции, создав подкласс класса запроса. Встроенные подклассы запроса следующие:
Объекты FormRequest
Класс FormRequest работает с HTML-формами, расширяя базовый запрос. У него есть следующий класс —
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Следующий параметр —
formdata — это словарь, содержащий данные формы HTML, которые назначаются телу запроса.
Примечание. Остальные параметры соответствуют классу запроса и описаны в разделе « Объекты запроса ».
Следующие методы класса поддерживаются объектами FormRequest в дополнение к методам запроса:
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])
В следующей таблице приведены параметры вышеуказанного класса —
Sr.No | Параметр и описание |
---|---|
1 |
ответ Это объект, используемый для предварительного заполнения полей формы с использованием HTML-формы ответа. |
2 |
FormName Это строка, в которой будет использоваться форма с атрибутом name, если она указана. |
3 |
formnumber Это целое число форм, которые должны использоваться, когда в ответе есть несколько форм. |
4 |
FormData Это словарь полей в данных формы, используемых для переопределения. |
5 |
formxpath Это указанная строка, используется форма, соответствующая xpath. |
6 |
formcss Это указанная строка, используется форма, соответствующая селектору css. |
7 |
clickdata Это словарь атрибутов, используемый для наблюдения за нажатием на элемент управления. |
8 |
dont_click Данные из формы будут отправлены без щелчка по любому элементу, если установлено значение true. |
ответ
Это объект, используемый для предварительного заполнения полей формы с использованием HTML-формы ответа.
FormName
Это строка, в которой будет использоваться форма с атрибутом name, если она указана.
formnumber
Это целое число форм, которые должны использоваться, когда в ответе есть несколько форм.
FormData
Это словарь полей в данных формы, используемых для переопределения.
formxpath
Это указанная строка, используется форма, соответствующая xpath.
formcss
Это указанная строка, используется форма, соответствующая селектору css.
clickdata
Это словарь атрибутов, используемый для наблюдения за нажатием на элемент управления.
dont_click
Данные из формы будут отправлены без щелчка по любому элементу, если установлено значение true.
Примеры
Ниже приведены некоторые примеры использования запросов:
Использование FormRequest для отправки данных через HTTP POST
Следующий код демонстрирует, как вернуть объект FormRequest, когда вы хотите скопировать HTML-форму POST в вашем пауке —
return [FormRequest(url = "http://www.something.com/post/action", formdata = {'firstname': 'John', 'lastname': 'dave'}, callback = self.after_post)]
Использование FormRequest.from_response () для имитации входа пользователя
Обычно веб-сайты используют элементы, через которые он предоставляет предварительно заполненные поля формы.
Метод FormRequest.form_response () можно использовать, если вы хотите, чтобы эти поля автоматически заполнялись при очистке.
Следующий пример демонстрирует это.
import scrapy class DemoSpider(scrapy.Spider): name = 'demo' start_urls = ['http://www.something.com/users/login.php'] def parse(self, response): return scrapy.FormRequest.from_response( response, formdata = {'username': 'admin', 'password': 'confidential'}, callback = self.after_login ) def after_login(self, response): if "authentication failed" in response.body: self.logger.error("Login failed") return # You can continue scraping here
Объекты ответа
Это объект, указывающий HTTP-ответ, который подается паукам для обработки. У него есть следующий класс —
class scrapy.http.Response(url[, status = 200, headers, body, flags])
В следующей таблице приведены параметры объектов Response —
Sr.No | Параметр и описание |
---|---|
1 |
URL Это строка, которая определяет ответ URL. |
2 |
статус Это целое число, содержащее ответ о статусе HTTP. |
3 |
заголовки Это словарь, содержащий заголовки ответа. |
4 |
тело Это строка с телом ответа. |
5 |
флаги Это список, содержащий флаги ответа. |
URL
Это строка, которая определяет ответ URL.
статус
Это целое число, содержащее ответ о статусе HTTP.
заголовки
Это словарь, содержащий заголовки ответа.
тело
Это строка с телом ответа.
флаги
Это список, содержащий флаги ответа.
Ответные подклассы
Вы можете реализовать свои собственные пользовательские функции, создав подкласс класса ответа. Встроенные подклассы ответа следующие:
TextResponse объекты
Объекты TextResponse используются для двоичных данных, таких как изображения, звуки и т. Д., Которые могут кодировать базовый класс Response. У него есть следующий класс —
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
Следующий параметр —
кодировка — это строка с кодировкой, которая используется для кодирования ответа.
Примечание. Остальные параметры соответствуют классу ответа и описаны в разделе « Объекты ответа ».
В следующей таблице показаны атрибуты, поддерживаемые объектом TextResponse в дополнение к методам ответа.
Sr.No | Атрибут и описание |
---|---|
1 |
текст Это тело ответа, где response.text может быть доступен несколько раз. |
2 |
кодирование Это строка, содержащая кодировку для ответа. |
3 |
селектор Этот атрибут создается при первом доступе и использует ответ в качестве цели. |
текст
Это тело ответа, где response.text может быть доступен несколько раз.
кодирование
Это строка, содержащая кодировку для ответа.
селектор
Этот атрибут создается при первом доступе и использует ответ в качестве цели.
В следующей таблице показаны методы, поддерживаемые объектами TextResponse в дополнение к методам ответа.
Sr.No | Метод и описание |
---|---|
1 |
xpath (запрос) Это ярлык для TextResponse.selector.xpath (запрос). |
2 |
css (запрос) Это ярлык для TextResponse.selector.css (запрос). |
3 |
body_as_unicode () Это тело ответа, доступное как метод, где response.text может быть доступен несколько раз. |
xpath (запрос)
Это ярлык для TextResponse.selector.xpath (запрос).
css (запрос)
Это ярлык для TextResponse.selector.css (запрос).
body_as_unicode ()
Это тело ответа, доступное как метод, где response.text может быть доступен несколько раз.
HtmlResponse Objects
Это объект, который поддерживает кодирование и автообнаружение, просматривая атрибут HTML httpequiv в HTML. Его параметры совпадают с классом ответа и описаны в разделе «Объекты ответа». У него есть следующий класс —
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])
XmlResponse Objects
Это объект, который поддерживает кодирование и автообнаружение, глядя на строку XML. Его параметры совпадают с классом ответа и описаны в разделе «Объекты ответа». У него есть следующий класс —
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])
Scrapy — экстракторы ссылок
Описание
Как указывает само название, экстракторы ссылок — это объекты, которые используются для извлечения ссылок с веб-страниц с использованием объектов scrapy.http.Response . В Scrapy есть встроенные экстракторы, такие как scrapy.linkextractors import LinkExtractor . Вы можете настроить свой собственный экстрактор ссылок в соответствии с вашими потребностями, реализовав простой интерфейс.
Каждый экстрактор ссылок имеет открытый метод extract_links, который включает в себя объект Response и возвращает список объектов scrapy.link.Link. Вы можете создавать экземпляры экстракторов ссылок только один раз и вызывать метод extract_links несколько раз, чтобы извлечь ссылки с разными ответами. CrawlSpiderclass использует экстракторы ссылок с набором правил, основной целью которых является извлечение ссылок.
Справочник по встроенным ссылкам
Обычно экстракторы ссылок сгруппированы с Scrapy и представлены в модуле scrapy.linkextractors. По умолчанию экстрактором ссылки будет LinkExtractor, который по функциональности равен LxmlLinkExtractor —
from scrapy.linkextractors import LinkExtractor
LxmlLinkExtractor
class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow = (), deny = (), allow_domains = (), deny_domains = (), deny_extensions = None, restrict_xpaths = (), restrict_css = (), tags = ('a', 'area'), attrs = ('href', ), canonicalize = True, unique = True, process_value = None)
LxmlLinkExtractor — это настоятельно рекомендуемый экстрактор ссылок, поскольку он имеет удобные параметры фильтрации и используется с надежным HTMLParser от lxml.
Sr.No | Параметр и описание |
---|---|
1 |
разрешить (регулярное выражение (или список)) Это позволяет отдельное выражение или группу выражений, которые должны соответствовать URL, который должен быть извлечен. Если это не упомянуто, это будет соответствовать всем ссылкам. |
2 |
отказать (регулярное выражение (или список)) Он блокирует или исключает одно выражение или группу выражений, которые должны соответствовать URL-адресу, который не должен быть извлечен. Если оно не упомянуто или оставлено пустым, оно не удалит нежелательные ссылки. |
3 |
allow_domains (str или list) Это позволяет одну строку или список строк, которые должны соответствовать доменам, из которых должны быть извлечены ссылки. |
4 |
deny_domains (ул или список) Он блокирует или исключает одну строку или список строк, которые должны соответствовать доменам, из которых не следует извлекать ссылки. |
5 |
deny_extensions (список) Он блокирует список строк с расширениями при извлечении ссылок. Если он не установлен, то по умолчанию будет установлено значение IGNORED_EXTENSIONS, которое содержит предопределенный список в пакете scrapy.linkextractors . |
6 |
restrict_xpaths (str или list) Это область списка XPath, из которой ссылки должны быть извлечены из ответа. Если дано, ссылки будут извлечены только из текста, выбранного XPath. |
7 |
restrict_css (str или list) Он ведет себя подобно параметру restrict_xpaths, который извлекает ссылки из выделенных областей CSS внутри ответа. |
8 |
теги (ул или список) Отдельный тег или список тегов, которые следует учитывать при извлечении ссылок. По умолчанию это будет (‘a’, ‘area’). |
9 |
attrs (список) Отдельный атрибут или список атрибутов должны учитываться при извлечении ссылок. По умолчанию это будет (‘href’,). |
10 |
канонизировать (булево) Извлеченный URL-адрес приводится в стандартную форму с помощью scrapy.utils.url.canonicalize_url . По умолчанию это будет True. |
11 |
уникальный (логический) Он будет использоваться, если извлеченные ссылки будут повторяться. |
12 |
process_value (вызываемый) Это функция, которая получает значение из отсканированных тегов и атрибутов. Полученное значение может быть изменено и возвращено, иначе ничего не будет возвращено, чтобы отклонить ссылку. Если не используется, по умолчанию это будет лямбда х: х. |
разрешить (регулярное выражение (или список))
Это позволяет отдельное выражение или группу выражений, которые должны соответствовать URL, который должен быть извлечен. Если это не упомянуто, это будет соответствовать всем ссылкам.
отказать (регулярное выражение (или список))
Он блокирует или исключает одно выражение или группу выражений, которые должны соответствовать URL-адресу, который не должен быть извлечен. Если оно не упомянуто или оставлено пустым, оно не удалит нежелательные ссылки.
allow_domains (str или list)
Это позволяет одну строку или список строк, которые должны соответствовать доменам, из которых должны быть извлечены ссылки.
deny_domains (ул или список)
Он блокирует или исключает одну строку или список строк, которые должны соответствовать доменам, из которых не следует извлекать ссылки.
deny_extensions (список)
Он блокирует список строк с расширениями при извлечении ссылок. Если он не установлен, то по умолчанию будет установлено значение IGNORED_EXTENSIONS, которое содержит предопределенный список в пакете scrapy.linkextractors .
restrict_xpaths (str или list)
Это область списка XPath, из которой ссылки должны быть извлечены из ответа. Если дано, ссылки будут извлечены только из текста, выбранного XPath.
restrict_css (str или list)
Он ведет себя подобно параметру restrict_xpaths, который извлекает ссылки из выделенных областей CSS внутри ответа.
теги (ул или список)
Отдельный тег или список тегов, которые следует учитывать при извлечении ссылок. По умолчанию это будет (‘a’, ‘area’).
attrs (список)
Отдельный атрибут или список атрибутов должны учитываться при извлечении ссылок. По умолчанию это будет (‘href’,).
канонизировать (булево)
Извлеченный URL-адрес приводится в стандартную форму с помощью scrapy.utils.url.canonicalize_url . По умолчанию это будет True.
уникальный (логический)
Он будет использоваться, если извлеченные ссылки будут повторяться.
process_value (вызываемый)
Это функция, которая получает значение из отсканированных тегов и атрибутов. Полученное значение может быть изменено и возвращено, иначе ничего не будет возвращено, чтобы отклонить ссылку. Если не используется, по умолчанию это будет лямбда х: х.
пример
Следующий код используется для извлечения ссылок —
<a href = "javascript:goToPage('../other/page.html'); return false">Link text</a>
Следующая функция кода может использоваться в process_value —
def process_value(val): m = re.search("javascript:goToPage\('(.*?)'", val) if m: return m.group(1)
Scrapy — Настройки
Описание
Поведение компонентов Scrapy можно изменить с помощью настроек Scrapy. В настройках также можно выбрать проект Scrapy, который в данный момент активен, если у вас есть несколько проектов Scrapy.
Назначение настроек
Вы должны уведомить Scrapy, какие настройки вы используете, когда вы удаляете сайт. Для этого следует использовать переменную окружения SCRAPY_SETTINGS_MODULE , а ее значение должно соответствовать синтаксису пути Python.
Заполнение настроек
В следующей таблице приведены некоторые механизмы, с помощью которых вы можете заполнить настройки —
Sr.No | Механизм и описание |
---|---|
1 |
Параметры командной строки Здесь переданные аргументы имеют наивысший приоритет, переопределяя другие параметры. -S используется для переопределения одного или нескольких параметров. scrapy crawl myspider -s LOG_FILE = scrapy.log |
2 |
Настройки на паука Пауки могут иметь свои собственные настройки, которые переопределяют настройки проекта, используя атрибут custom_settings. class DemoSpider(scrapy.Spider): name = 'demo' custom_settings = { 'SOME_SETTING': 'some value', } |
3 |
Модуль настроек проекта Здесь вы можете заполнить свои пользовательские настройки, такие как добавление или изменение настроек в файле settings.py. |
4 |
Настройки по умолчанию для каждой команды Каждая команда инструмента Scrapy определяет свои собственные настройки в атрибуте default_settings, чтобы переопределить глобальные настройки по умолчанию. |
5 |
Глобальные настройки по умолчанию Эти настройки находятся в модуле scrapy.settings.default_settings. |
Параметры командной строки
Здесь переданные аргументы имеют наивысший приоритет, переопределяя другие параметры. -S используется для переопределения одного или нескольких параметров.
Настройки на паука
Пауки могут иметь свои собственные настройки, которые переопределяют настройки проекта, используя атрибут custom_settings.
Модуль настроек проекта
Здесь вы можете заполнить свои пользовательские настройки, такие как добавление или изменение настроек в файле settings.py.
Настройки по умолчанию для каждой команды
Каждая команда инструмента Scrapy определяет свои собственные настройки в атрибуте default_settings, чтобы переопределить глобальные настройки по умолчанию.
Глобальные настройки по умолчанию
Эти настройки находятся в модуле scrapy.settings.default_settings.
Настройки доступа
Они доступны через self.settings и устанавливаются в базовом пауке после его инициализации.
Следующий пример демонстрирует это.
class DemoSpider(scrapy.Spider): name = 'demo' start_urls = ['http://example.com'] def parse(self, response): print("Existing settings: %s" % self.settings.attributes.keys())
Чтобы использовать настройки перед инициализацией паука, вы должны переопределить метод from_crawler в методе _init_ () вашего паука. Вы можете получить доступ к настройкам через атрибут scrapy.crawler.Crawler.settings, переданный методу from_crawler .
Следующий пример демонстрирует это.
class MyExtension(object): def __init__(self, log_is_enabled = False): if log_is_enabled: print("Enabled log") @classmethod def from_crawler(cls, crawler): settings = crawler.settings return cls(settings.getbool('LOG_ENABLED'))
Обоснование настройки имен
Имена параметров добавляются в качестве префикса к компоненту, который они настраивают. Например, для расширения robots.txt имена параметров могут быть ROBOTSTXT_ENABLED, ROBOTSTXT_OBEY, ROBOTSTXT_CACHEDIR и т. Д.
Справочник по встроенным настройкам
В следующей таблице приведены встроенные настройки Scrapy —
Sr.No | Настройка и описание |
---|---|
1 |
AWS_ACCESS_KEY_ID Он используется для доступа к веб-сервисам Amazon. Значение по умолчанию: Нет |
2 |
AWS_SECRET_ACCESS_KEY Он используется для доступа к веб-сервисам Amazon. Значение по умолчанию: Нет |
3 |
BOT_NAME Это имя бота, которое можно использовать для создания User-Agent. Значение по умолчанию: ‘scrapybot’ |
4 |
CONCURRENT_ITEMS Максимальное количество существующих элементов в процессоре элементов, используемое для параллельной обработки. Значение по умолчанию: 100 |
5 |
CONCURRENT_REQUESTS Максимальное количество существующих запросов, которые выполняет загрузчик Scrapy. Значение по умолчанию: 16 |
6 |
CONCURRENT_REQUESTS_PER_DOMAIN Максимальное количество существующих запросов, которые выполняются одновременно для любого отдельного домена. Значение по умолчанию: 8 |
7 |
CONCURRENT_REQUESTS_PER_IP Максимальное количество существующих запросов, выполняемых одновременно к любому отдельному IP. Значение по умолчанию: 0 |
8 |
DEFAULT_ITEM_CLASS Это класс, используемый для представления предметов. Значение по умолчанию: ‘scrapy.item.Item’ |
9 |
DEFAULT_REQUEST_HEADERS Это заголовок по умолчанию, используемый для HTTP-запросов Scrapy. Значение по умолчанию — { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en', } |
10 |
DEPTH_LIMIT Максимальная глубина для паука, чтобы сканировать любой сайт. Значение по умолчанию: 0 |
11 |
DEPTH_PRIORITY Это целое число, используемое для изменения приоритета запроса в соответствии с глубиной. Значение по умолчанию: 0 |
12 |
DEPTH_STATS Здесь указывается, собирать ли статистику глубины или нет. Значение по умолчанию: True |
13 |
DEPTH_STATS_VERBOSE При включении этого параметра количество запросов собирается в статистике для каждой подробной глубины. Значение по умолчанию: False |
14 |
DNSCACHE_ENABLED Используется для включения DNS в кеш-памяти. Значение по умолчанию: True |
15 |
DNSCACHE_SIZE Он определяет размер DNS в кеше памяти. Значение по умолчанию: 10000 |
16 |
DNS_TIMEOUT Он используется для установки времени ожидания DNS для обработки запросов. Значение по умолчанию: 60 |
17 |
DOWNLOADER Это загрузчик, используемый для процесса сканирования. Значение по умолчанию: ‘scrapy.core.downloader.Downloader’ |
18 |
DOWNLOADER_MIDDLEWARES Это словарь, содержащий загрузчик промежуточного ПО и его заказы. Значение по умолчанию: {} |
19 |
DOWNLOADER_MIDDLEWARES_BASE Это словарь, содержащий промежуточное ПО загрузчика, которое включено по умолчанию. Значение по умолчанию — { 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100, } |
20 |
DOWNLOADER_STATS Этот параметр используется для включения статистики загрузчика. Значение по умолчанию: True |
21 |
DOWNLOAD_DELAY Он определяет общее время загрузки до загрузки страниц с сайта. Значение по умолчанию: 0 |
22 |
DOWNLOAD_HANDLERS Это словарь с обработчиками загрузки. Значение по умолчанию: {} |
23 |
DOWNLOAD_HANDLERS_BASE Это словарь с обработчиками загрузки, который включен по умолчанию. Значение по умолчанию — { 'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler', } |
24 |
DOWNLOAD_TIMEOUT Общее время ожидания загрузки до истечения времени ожидания. Значение по умолчанию: 180 |
25 |
DOWNLOAD_MAXSIZE Это максимальный размер ответа для загрузки загрузчиком. Значение по умолчанию: 1073741824 (1024 МБ) |
26 |
DOWNLOAD_WARNSIZE Он определяет размер ответа, который загрузчик должен предупредить. Значение по умолчанию: 33554432 (32 МБ) |
27 |
DUPEFILTER_CLASS Это класс, используемый для обнаружения и фильтрации повторяющихся запросов. Значение по умолчанию: ‘scrapy.dupefilters.RFPDupeFilter’ |
28 |
DUPEFILTER_DEBUG Этот параметр регистрирует все дубликаты фильтров, если установлено значение true. Значение по умолчанию: False |
29 |
РЕДАКТОР Он используется для редактирования пауков с помощью команды редактирования. Значение по умолчанию: зависит от среды |
30 |
РАСШИРЕНИЯ Это словарь с расширениями, которые включены в проект. Значение по умолчанию: {} |
31 |
EXTENSIONS_BASE Это словарь, имеющий встроенные расширения. Значение по умолчанию: {‘scrapy.extensions.corestats.CoreStats’: 0,} |
32 |
FEED_TEMPDIR Это каталог, используемый для установки пользовательской папки, в которой могут храниться временные файлы искателя. |
33 |
ITEM_PIPELINES Это словарь с конвейерами. Значение по умолчанию: {} |
34 |
LOG_ENABLED Он определяет, должно ли быть включено ведение журнала. Значение по умолчанию: True |
35 |
LOG_ENCODING Он определяет тип кодирования, который будет использоваться для регистрации. Значение по умолчанию: ‘utf-8’ |
36 |
ЖУРНАЛЬНЫЙ ФАЙЛ Это имя файла, который будет использоваться для вывода журнала. Значение по умолчанию: Нет |
37 |
LOG_FORMAT Это строка, с помощью которой сообщения журнала могут быть отформатированы. Значение по умолчанию: ‘% (asctime) s [% (имя) s]% (имя уровня) s:% (сообщение) s’ |
38 |
LOG_DATEFORMAT Это строка, в которой можно отформатировать дату / время. Значение по умолчанию: «% Y-% m-% d% H:% M:% S» |
39 |
LOG_LEVEL Он определяет минимальный уровень журнала. Значение по умолчанию: «DEBUG» |
40 |
LOG_STDOUT Если для этого параметра установлено значение true, весь вывод процесса будет отображаться в журнале. Значение по умолчанию: False |
41 |
MEMDEBUG_ENABLED Он определяет, должна ли быть включена отладка памяти. Значение по умолчанию: False |
42 |
MEMDEBUG_NOTIFY Он определяет отчет памяти, который отправляется на определенный адрес, когда включена отладка памяти. Значение по умолчанию: [] |
43 |
MEMUSAGE_ENABLED Он определяет, должно ли использоваться использование памяти, когда процесс Scrapy превышает предел памяти. Значение по умолчанию: False |
44 |
MEMUSAGE_LIMIT_MB Он определяет максимально допустимый предел памяти (в мегабайтах). Значение по умолчанию: 0 |
45 |
MEMUSAGE_CHECK_INTERVAL_SECONDS Он используется для проверки текущего использования памяти путем установки длины интервалов. Значение по умолчанию: 60,0 |
46 |
MEMUSAGE_NOTIFY_MAIL Он используется для уведомления со списком электронных писем, когда память достигает предела. Значение по умолчанию: False |
47 |
MEMUSAGE_REPORT Он определяет, будет ли отправляться отчет об использовании памяти при закрытии каждого паука. Значение по умолчанию: False |
48 |
MEMUSAGE_WARNING_MB Он определяет общий объем памяти, который должен быть разрешен до отправки предупреждения. Значение по умолчанию: 0 |
49 |
NEWSPIDER_MODULE Это модуль, в котором новый паук создается с помощью команды genspider. Значение по умолчанию: » |
50 |
RANDOMIZE_DOWNLOAD_DELAY Он определяет случайное время ожидания Scrapy при загрузке запросов с сайта. Значение по умолчанию: True |
51 |
REACTOR_THREADPOOL_MAXSIZE Он определяет максимальный размер пула резьбы реактора. Значение по умолчанию: 10 |
52 |
REDIRECT_MAX_TIMES Он определяет, сколько раз запрос может быть перенаправлен. Значение по умолчанию: 20 |
53 |
REDIRECT_PRIORITY_ADJUST Этот параметр, если установлен, регулирует приоритет перенаправления запроса. Значение по умолчанию: +2 |
54 |
RETRY_PRIORITY_ADJUST Этот параметр, если установлен, регулирует приоритет повторения запроса. Значение по умолчанию: -1 |
55 |
ROBOTSTXT_OBEY Scrapy соблюдает правила robots.txt, если установлено значение true . Значение по умолчанию: False |
56 |
SCHEDULER Он определяет планировщик, который будет использоваться для целей сканирования. Значение по умолчанию: ‘scrapy.core.scheduler.Scheduler’ |
57 |
SPIDER_CONTRACTS Это словарь проекта, в котором есть контракты с пауками для тестирования пауков. Значение по умолчанию: {} |
58 |
SPIDER_CONTRACTS_BASE Это словарь с контрактами Scrapy, который включен в Scrapy по умолчанию. Значение по умолчанию — { 'scrapy.contracts.default.UrlContract' : 1, 'scrapy.contracts.default.ReturnsContract': 2, } |
59 |
SPIDER_LOADER_CLASS Он определяет класс, который реализует API SpiderLoader для загрузки пауков. Значение по умолчанию: «scrapy.spiderloader.SpiderLoader» |
60 |
SPIDER_MIDDLEWARES Это словарь, содержащий промежуточное программное обеспечение для пауков. Значение по умолчанию: {} |
61 |
SPIDER_MIDDLEWARES_BASE Это словарь, содержащий промежуточное программное обеспечение для пауков, которое по умолчанию включено в Scrapy. Значение по умолчанию — { 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, } |
62 |
SPIDER_MODULES Это список модулей, содержащих пауков, которые Scrapy будет искать. Значение по умолчанию: [] |
63 |
STATS_CLASS Это класс, который реализует API Stats Collector для сбора статистики. Значение по умолчанию: ‘scrapy.statscollectors.MemoryStatsCollector’ |
64 |
STATS_DUMP Если для этого параметра установлено значение true, статистика выводится в журнал. Значение по умолчанию: True |
65 |
STATSMAILER_RCPTS Как только пауки закончат соскоб, Scrapy использует этот параметр для отправки статистики. Значение по умолчанию: [] |
66 |
TELNETCONSOLE_ENABLED Он определяет, следует ли включать telnetconsole. Значение по умолчанию: True |
67 |
TELNETCONSOLE_PORT Он определяет порт для консоли telnet. Значение по умолчанию: [6023, 6073] |
68 |
TEMPLATES_DIR Это каталог, содержащий шаблоны, которые можно использовать при создании новых проектов. Значение по умолчанию: каталог шаблонов внутри модуля scrapy |
69 |
URLLENGTH_LIMIT Он определяет максимальный предел длины для URL, который будет разрешен для просканированных URL. Значение по умолчанию: 2083 |
70 |
USER_AGENT Он определяет пользовательский агент, который будет использоваться при сканировании сайта. Значение по умолчанию: «Scrapy / VERSION (+ http: //scrapy.org)» |
AWS_ACCESS_KEY_ID
Он используется для доступа к веб-сервисам Amazon.
Значение по умолчанию: Нет
AWS_SECRET_ACCESS_KEY
Он используется для доступа к веб-сервисам Amazon.
Значение по умолчанию: Нет
BOT_NAME
Это имя бота, которое можно использовать для создания User-Agent.
Значение по умолчанию: ‘scrapybot’
CONCURRENT_ITEMS
Максимальное количество существующих элементов в процессоре элементов, используемое для параллельной обработки.
Значение по умолчанию: 100
CONCURRENT_REQUESTS
Максимальное количество существующих запросов, которые выполняет загрузчик Scrapy.
Значение по умолчанию: 16
CONCURRENT_REQUESTS_PER_DOMAIN
Максимальное количество существующих запросов, которые выполняются одновременно для любого отдельного домена.
Значение по умолчанию: 8
CONCURRENT_REQUESTS_PER_IP
Максимальное количество существующих запросов, выполняемых одновременно к любому отдельному IP.
Значение по умолчанию: 0
DEFAULT_ITEM_CLASS
Это класс, используемый для представления предметов.
Значение по умолчанию: ‘scrapy.item.Item’
DEFAULT_REQUEST_HEADERS
Это заголовок по умолчанию, используемый для HTTP-запросов Scrapy.
Значение по умолчанию —
DEPTH_LIMIT
Максимальная глубина для паука, чтобы сканировать любой сайт.
Значение по умолчанию: 0
DEPTH_PRIORITY
Это целое число, используемое для изменения приоритета запроса в соответствии с глубиной.
Значение по умолчанию: 0
DEPTH_STATS
Здесь указывается, собирать ли статистику глубины или нет.
Значение по умолчанию: True
DEPTH_STATS_VERBOSE
При включении этого параметра количество запросов собирается в статистике для каждой подробной глубины.
Значение по умолчанию: False
DNSCACHE_ENABLED
Используется для включения DNS в кеш-памяти.
Значение по умолчанию: True
DNSCACHE_SIZE
Он определяет размер DNS в кеше памяти.
Значение по умолчанию: 10000
DNS_TIMEOUT
Он используется для установки времени ожидания DNS для обработки запросов.
Значение по умолчанию: 60
DOWNLOADER
Это загрузчик, используемый для процесса сканирования.
Значение по умолчанию: ‘scrapy.core.downloader.Downloader’
DOWNLOADER_MIDDLEWARES
Это словарь, содержащий загрузчик промежуточного ПО и его заказы.
Значение по умолчанию: {}
DOWNLOADER_MIDDLEWARES_BASE
Это словарь, содержащий промежуточное ПО загрузчика, которое включено по умолчанию.
Значение по умолчанию —
DOWNLOADER_STATS
Этот параметр используется для включения статистики загрузчика.
Значение по умолчанию: True
DOWNLOAD_DELAY
Он определяет общее время загрузки до загрузки страниц с сайта.
Значение по умолчанию: 0
DOWNLOAD_HANDLERS
Это словарь с обработчиками загрузки.
Значение по умолчанию: {}
DOWNLOAD_HANDLERS_BASE
Это словарь с обработчиками загрузки, который включен по умолчанию.
Значение по умолчанию —
DOWNLOAD_TIMEOUT
Общее время ожидания загрузки до истечения времени ожидания.
Значение по умолчанию: 180
DOWNLOAD_MAXSIZE
Это максимальный размер ответа для загрузки загрузчиком.
Значение по умолчанию: 1073741824 (1024 МБ)
DOWNLOAD_WARNSIZE
Он определяет размер ответа, который загрузчик должен предупредить.
Значение по умолчанию: 33554432 (32 МБ)
DUPEFILTER_CLASS
Это класс, используемый для обнаружения и фильтрации повторяющихся запросов.
Значение по умолчанию: ‘scrapy.dupefilters.RFPDupeFilter’
DUPEFILTER_DEBUG
Этот параметр регистрирует все дубликаты фильтров, если установлено значение true.
Значение по умолчанию: False
РЕДАКТОР
Он используется для редактирования пауков с помощью команды редактирования.
Значение по умолчанию: зависит от среды
РАСШИРЕНИЯ
Это словарь с расширениями, которые включены в проект.
Значение по умолчанию: {}
EXTENSIONS_BASE
Это словарь, имеющий встроенные расширения.
Значение по умолчанию: {‘scrapy.extensions.corestats.CoreStats’: 0,}
FEED_TEMPDIR
Это каталог, используемый для установки пользовательской папки, в которой могут храниться временные файлы искателя.
ITEM_PIPELINES
Это словарь с конвейерами.
Значение по умолчанию: {}
LOG_ENABLED
Он определяет, должно ли быть включено ведение журнала.
Значение по умолчанию: True
LOG_ENCODING
Он определяет тип кодирования, который будет использоваться для регистрации.
Значение по умолчанию: ‘utf-8’
ЖУРНАЛЬНЫЙ ФАЙЛ
Это имя файла, который будет использоваться для вывода журнала.
Значение по умолчанию: Нет
LOG_FORMAT
Это строка, с помощью которой сообщения журнала могут быть отформатированы.
Значение по умолчанию: ‘% (asctime) s [% (имя) s]% (имя уровня) s:% (сообщение) s’
LOG_DATEFORMAT
Это строка, в которой можно отформатировать дату / время.
Значение по умолчанию: «% Y-% m-% d% H:% M:% S»
LOG_LEVEL
Он определяет минимальный уровень журнала.
Значение по умолчанию: «DEBUG»
LOG_STDOUT
Если для этого параметра установлено значение true, весь вывод процесса будет отображаться в журнале.
Значение по умолчанию: False
MEMDEBUG_ENABLED
Он определяет, должна ли быть включена отладка памяти.
Значение по умолчанию: False
MEMDEBUG_NOTIFY
Он определяет отчет памяти, который отправляется на определенный адрес, когда включена отладка памяти.
Значение по умолчанию: []
MEMUSAGE_ENABLED
Он определяет, должно ли использоваться использование памяти, когда процесс Scrapy превышает предел памяти.
Значение по умолчанию: False
MEMUSAGE_LIMIT_MB
Он определяет максимально допустимый предел памяти (в мегабайтах).
Значение по умолчанию: 0
MEMUSAGE_CHECK_INTERVAL_SECONDS
Он используется для проверки текущего использования памяти путем установки длины интервалов.
Значение по умолчанию: 60,0
MEMUSAGE_NOTIFY_MAIL
Он используется для уведомления со списком электронных писем, когда память достигает предела.
Значение по умолчанию: False
MEMUSAGE_REPORT
Он определяет, будет ли отправляться отчет об использовании памяти при закрытии каждого паука.
Значение по умолчанию: False
MEMUSAGE_WARNING_MB
Он определяет общий объем памяти, который должен быть разрешен до отправки предупреждения.
Значение по умолчанию: 0
NEWSPIDER_MODULE
Это модуль, в котором новый паук создается с помощью команды genspider.
Значение по умолчанию: »
RANDOMIZE_DOWNLOAD_DELAY
Он определяет случайное время ожидания Scrapy при загрузке запросов с сайта.
Значение по умолчанию: True
REACTOR_THREADPOOL_MAXSIZE
Он определяет максимальный размер пула резьбы реактора.
Значение по умолчанию: 10
REDIRECT_MAX_TIMES
Он определяет, сколько раз запрос может быть перенаправлен.
Значение по умолчанию: 20
REDIRECT_PRIORITY_ADJUST
Этот параметр, если установлен, регулирует приоритет перенаправления запроса.
Значение по умолчанию: +2
RETRY_PRIORITY_ADJUST
Этот параметр, если установлен, регулирует приоритет повторения запроса.
Значение по умолчанию: -1
ROBOTSTXT_OBEY
Scrapy соблюдает правила robots.txt, если установлено значение true .
Значение по умолчанию: False
SCHEDULER
Он определяет планировщик, который будет использоваться для целей сканирования.
Значение по умолчанию: ‘scrapy.core.scheduler.Scheduler’
SPIDER_CONTRACTS
Это словарь проекта, в котором есть контракты с пауками для тестирования пауков.
Значение по умолчанию: {}
SPIDER_CONTRACTS_BASE
Это словарь с контрактами Scrapy, который включен в Scrapy по умолчанию.
Значение по умолчанию —
SPIDER_LOADER_CLASS
Он определяет класс, который реализует API SpiderLoader для загрузки пауков.
Значение по умолчанию: «scrapy.spiderloader.SpiderLoader»
SPIDER_MIDDLEWARES
Это словарь, содержащий промежуточное программное обеспечение для пауков.
Значение по умолчанию: {}
SPIDER_MIDDLEWARES_BASE
Это словарь, содержащий промежуточное программное обеспечение для пауков, которое по умолчанию включено в Scrapy.
Значение по умолчанию —
SPIDER_MODULES
Это список модулей, содержащих пауков, которые Scrapy будет искать.
Значение по умолчанию: []
STATS_CLASS
Это класс, который реализует API Stats Collector для сбора статистики.
Значение по умолчанию: ‘scrapy.statscollectors.MemoryStatsCollector’
STATS_DUMP
Если для этого параметра установлено значение true, статистика выводится в журнал.
Значение по умолчанию: True
STATSMAILER_RCPTS
Как только пауки закончат соскоб, Scrapy использует этот параметр для отправки статистики.
Значение по умолчанию: []
TELNETCONSOLE_ENABLED
Он определяет, следует ли включать telnetconsole.
Значение по умолчанию: True
TELNETCONSOLE_PORT
Он определяет порт для консоли telnet.
Значение по умолчанию: [6023, 6073]
TEMPLATES_DIR
Это каталог, содержащий шаблоны, которые можно использовать при создании новых проектов.
Значение по умолчанию: каталог шаблонов внутри модуля scrapy
URLLENGTH_LIMIT
Он определяет максимальный предел длины для URL, который будет разрешен для просканированных URL.
Значение по умолчанию: 2083
USER_AGENT
Он определяет пользовательский агент, который будет использоваться при сканировании сайта.
Значение по умолчанию: «Scrapy / VERSION (+ http: //scrapy.org)»
Для других настроек Scrapy, перейдите по этой ссылке .
Scrapy — исключения
Описание
Нерегулярные события называются исключениями. В Scrapy исключения вызываются по таким причинам, как отсутствие конфигурации, удаление элемента из конвейера элементов и т. Д. Ниже приведен список исключений, упомянутых в Scrapy и их применении.
DropItem
Item Pipeline использует это исключение, чтобы остановить обработку элемента на любом этапе. Это можно записать как —
exception (scrapy.exceptions.DropItem)
CloseSpider
Это исключение используется для остановки паука с помощью запроса обратного вызова. Это можно записать как —
exception (scrapy.exceptions.CloseSpider)(reason = 'cancelled')
Он содержит параметр под названием причина (str), который указывает причину закрытия.
Например, следующий код показывает использование этого исключения —
def parse_page(self, response): if 'Bandwidth exceeded' in response.body: raise CloseSpider('bandwidth_exceeded')
IgnoreRequest
Это исключение используется промежуточным программным обеспечением планировщика или загрузчика для игнорирования запроса. Это можно записать как —
exception (scrapy.exceptions.IgnoreRequest)
Не настроено
Это указывает на ситуацию с отсутствующей конфигурацией и должно вызываться в конструкторе компонента.
exception (scrapy.exceptions.NotConfigured)
Это исключение можно вызвать, если какой-либо из следующих компонентов отключен.
- расширения
- Пункт трубопроводов
- Загрузчик промежуточного программного обеспечения
- Промежуточное программное обеспечение паука
Не поддерживается
Это исключение возникает, когда какая-либо функция или метод не поддерживаются. Это можно записать как —
exception (scrapy.exceptions.NotSupported)
Scrapy — Создать проект
Описание
Чтобы удалить данные с веб-страниц, сначала вам нужно создать проект Scrapy, в котором вы будете хранить код. Чтобы создать новый каталог, выполните следующую команду —
scrapy startproject first_scrapy
Приведенный выше код создаст каталог с именем first_scrapy и будет содержать следующую структуру:
first_scrapy/ scrapy.cfg # deploy configuration file first_scrapy/ # project's Python module, you'll import your code from here __init__.py items.py # project items file pipelines.py # project pipelines file settings.py # project settings file spiders/ # a directory where you'll later put your spiders __init__.py
Scrapy — определите предмет
Описание
Элементы — это контейнеры, используемые для сбора данных, которые удаляются с веб-сайтов. Вы должны начать свой паук с определения вашего предмета. Чтобы определить элементы, отредактируйте файл items.py, находящийся в каталоге first_scrapy (пользовательский каталог). Items.py выглядит следующим образом:
import scrapy class First_scrapyItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field()
Класс MyItem наследует от Item, содержащего несколько предопределенных объектов, которые Scrapy уже создал для нас. Например, если вы хотите извлечь имя, URL и описание из сайтов, вам необходимо определить поля для каждого из этих трех атрибутов.
Следовательно, давайте добавим те предметы, которые мы хотим собрать —
from scrapy.item import Item, Field class First_scrapyItem(scrapy.Item): name = scrapy.Field() url = scrapy.Field() desc = scrapy.Field()
Scrapy — Первый Паук
Описание
Spider — это класс, который определяет начальный URL для извлечения данных, как переходить по ссылкам на нумерацию страниц и как извлекать и анализировать поля, определенные в items.py . Scrapy предоставляет различные типы пауков, каждый из которых дает определенную цель.
Создайте файл под названием «first_spider.py» в каталоге first_scrapy / spiders, где мы можем указать Scrapy, как найти точные данные, которые мы ищем. Для этого вы должны определить некоторые атрибуты —
-
name — определяет уникальное имя для паука
-
allow_domains — содержит базовые URL для паука для сканирования.
-
start-urls — список URL-адресов, с которых начинает сканировать паук.
-
parse () — это метод, который извлекает и анализирует очищенные данные.
name — определяет уникальное имя для паука
allow_domains — содержит базовые URL для паука для сканирования.
start-urls — список URL-адресов, с которых начинает сканировать паук.
parse () — это метод, который извлекает и анализирует очищенные данные.
Следующий код демонстрирует, как выглядит код паука:
import scrapy class firstSpider(scrapy.Spider): name = "first" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): filename = response.url.split("/")[-2] + '.html' with open(filename, 'wb') as f: f.write(response.body)
Scrapy — Crawling
Описание
Чтобы запустить своего паука, выполните следующую команду в вашем каталоге first_scrapy —
scrapy crawl first
Где first имя паука, указанное при создании паука.
Как только паук ползет, вы можете увидеть следующий результат —
2016-08-09 18:13:07-0400 [scrapy] INFO: Scrapy started (bot: tutorial) 2016-08-09 18:13:07-0400 [scrapy] INFO: Optional features available: ... 2016-08-09 18:13:07-0400 [scrapy] INFO: Overridden settings: {} 2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled extensions: ... 2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled downloader middlewares: ... 2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled spider middlewares: ... 2016-08-09 18:13:07-0400 [scrapy] INFO: Enabled item pipelines: ... 2016-08-09 18:13:07-0400 [scrapy] INFO: Spider opened 2016-08-09 18:13:08-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None) 2016-08-09 18:13:09-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None) 2016-08-09 18:13:09-0400 [scrapy] INFO: Closing spider (finished)
Как видно из выходных данных, для каждого URL-адреса есть строка журнала, в которой (реферер: нет) указано, что URL-адреса являются начальными URL-адресами и не имеют ссылок. Затем вы должны увидеть два новых файла с именами Books.html и Resources.html, которые будут созданы в вашем каталоге first_scrapy .
Scrapy — Извлечение предметов
Описание
Для извлечения данных из веб-страниц Scrapy использует метод, называемый селекторами, основанный на выражениях XPath и CSS . Ниже приведены некоторые примеры выражений XPath:
-
/ html / head / title — это выберет элемент <title> внутри элемента <head> документа HTML.
-
/ html / head / title / text () — это выделит текст в том же элементе <title>.
-
// td — это выберет все элементы из <td>.
-
// div [@class = «slice»] — это выберет все элементы из div, которые содержат атрибут class = «slice»
/ html / head / title — это выберет элемент <title> внутри элемента <head> документа HTML.
/ html / head / title / text () — это выделит текст в том же элементе <title>.
// td — это выберет все элементы из <td>.
// div [@class = «slice»] — это выберет все элементы из div, которые содержат атрибут class = «slice»
Селекторы имеют четыре основных метода, как показано в следующей таблице:
Sr.No | Метод и описание |
---|---|
1 |
экстракт () Возвращает строку в юникоде вместе с выбранными данными. |
2 |
Re () Возвращает список строк Unicode, извлеченный, когда регулярное выражение было задано в качестве аргумента. |
3 |
XPath () Он возвращает список селекторов, который представляет узлы, выбранные выражением xpath, заданным в качестве аргумента. |
4 |
CSS () Он возвращает список селекторов, который представляет узлы, выбранные выражением CSS, заданным в качестве аргумента. |
экстракт ()
Возвращает строку в юникоде вместе с выбранными данными.
Re ()
Возвращает список строк Unicode, извлеченный, когда регулярное выражение было задано в качестве аргумента.
XPath ()
Он возвращает список селекторов, который представляет узлы, выбранные выражением xpath, заданным в качестве аргумента.
CSS ()
Он возвращает список селекторов, который представляет узлы, выбранные выражением CSS, заданным в качестве аргумента.
Использование селекторов в оболочке
Чтобы продемонстрировать селекторы с помощью встроенной оболочки Scrapy, в вашей системе должен быть установлен IPython . Здесь важно то, что URL должны быть включены в кавычки при запуске Scrapy; в противном случае URL с символами ‘&’ не будут работать. Вы можете запустить оболочку с помощью следующей команды в каталоге верхнего уровня проекта —
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Оболочка будет выглядеть следующим образом —
[ ... Scrapy log here ... ] 2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None) [s] Available Scrapy objects: [s] crawler <scrapy.crawler.Crawler object at 0x3636b50> [s] item {} [s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> [s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> [s] settings <scrapy.settings.Settings object at 0x3fadc50> [s] spider <Spider 'default' at 0x3cebf50> [s] Useful shortcuts: [s] shelp() Shell help (print this help) [s] fetch(req_or_url) Fetch request (or URL) and update local objects [s] view(response) View response in a browser In [1]:
При загрузке оболочки вы можете получить доступ к телу или заголовку, используя соответственно response.body и response.header . Аналогично, вы можете выполнять запросы к ответу, используя response.selector.xpath () или response.selector.css () .
Например —
In [1]: response.xpath('//title') Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>] In [2]: response.xpath('//title').extract() Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>'] In [3]: response.xpath('//title/text()') Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>] In [4]: response.xpath('//title/text()').extract() Out[4]: [u'My Book - Scrapy: Index: Chapters'] In [5]: response.xpath('//title/text()').re('(\w+):') Out[5]: [u'Scrapy', u'Index', u'Chapters']
Извлечение данных
Чтобы извлечь данные с обычного HTML-сайта, мы должны проверить исходный код сайта, чтобы получить XPath. После проверки вы увидите, что данные будут в теге ul . Выберите элементы внутри тега li .
Следующие строки кода показывают извлечение различных типов данных —
Для выбора данных в теге li —
response.xpath('//ul/li')
Для выбора описания —
response.xpath('//ul/li/text()').extract()
Для выбора заголовков сайта —
response.xpath('//ul/li/a/text()').extract()
Для выбора ссылок сайта —
response.xpath('//ul/li/a/@href').extract()
Следующий код демонстрирует использование вышеуказанных экстракторов —
import scrapy class MyprojectSpider(scrapy.Spider): name = "project" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): for sel in response.xpath('//ul/li'): title = sel.xpath('a/text()').extract() link = sel.xpath('a/@href').extract() desc = sel.xpath('text()').extract() print title, link, desc
Scrapy — Использование предмета
Описание
Объекты предметов являются обычными диктатами Python. Мы можем использовать следующий синтаксис для доступа к атрибутам класса —
>>> item = DmozItem() >>> item['title'] = 'sample title' >>> item['title'] 'sample title'
Добавьте приведенный выше код к следующему примеру —
import scrapy from tutorial.items import DmozItem class MyprojectSpider(scrapy.Spider): name = "project" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ] def parse(self, response): for sel in response.xpath('//ul/li'): item = DmozItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item
Выход вышеупомянутого паука будет —
[scrapy] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> {'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n], 'link': [u'http://gnosis.cx/TPiP/'], 'title': [u'Text Processing in Python']} [scrapy] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> {'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'], 'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'], 'title': [u'XML Processing with Python']}
Scrapy — следующие ссылки
Описание
В этой главе мы изучим, как извлечь ссылки на интересующие нас страницы, следовать им и извлекать данные с этой страницы. Для этого нам нужно внести следующие изменения в наш предыдущий код, показанный ниже:
import scrapy from tutorial.items import DmozItem class MyprojectSpider(scrapy.Spider): name = "project" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/", ] def parse(self, response): for href in response.css("ul.directory.dir-col > li > a::attr('href')"): url = response.urljoin(href.extract()) yield scrapy.Request(url, callback = self.parse_dir_contents) def parse_dir_contents(self, response): for sel in response.xpath('//ul/li'): item = DmozItem() item['title'] = sel.xpath('a/text()').extract() item['link'] = sel.xpath('a/@href').extract() item['desc'] = sel.xpath('text()').extract() yield item
Приведенный выше код содержит следующие методы —
-
parse () — он извлечет ссылки нашего интереса.
-
response.urljoin — метод parse () будет использовать этот метод для создания нового URL-адреса и предоставления нового запроса, который позднее будет отправлен обратному вызову.
-
parse_dir_contents () — это обратный вызов, который фактически очистит интересующие данные.
parse () — он извлечет ссылки нашего интереса.
response.urljoin — метод parse () будет использовать этот метод для создания нового URL-адреса и предоставления нового запроса, который позднее будет отправлен обратному вызову.
parse_dir_contents () — это обратный вызов, который фактически очистит интересующие данные.
Здесь Scrapy использует механизм обратного вызова для перехода по ссылкам. Используя этот механизм, можно спроектировать более крупный сканер, который может переходить по интересующим ссылкам для извлечения нужных данных с разных страниц. Обычным методом будет метод обратного вызова, который будет извлекать элементы, искать ссылки для перехода на следующую страницу и затем предоставлять запрос на тот же обратный вызов.
В следующем примере создается цикл, который будет следовать ссылкам на следующую страницу.
def parse_articles_follow_next_page(self, response): for article in response.xpath("//article"): item = ArticleItem() ... extract article data here yield item next_page = response.css("ul.navigation > li.next-page > a::attr('href')") if next_page: url = response.urljoin(next_page[0].extract()) yield scrapy.Request(url, self.parse_articles_follow_next_page)
Scrapy — Scraped Data
Описание
Лучший способ сохранить очищенные данные — использовать экспорт каналов, который обеспечивает правильное хранение данных с использованием нескольких форматов сериализации. JSON, JSON lines, CSV, XML — форматы, которые легко поддерживаются в форматах сериализации. Данные могут быть сохранены с помощью следующей команды —
scrapy crawl dmoz -o data.json
Эта команда создаст файл data.json, содержащий очищенные данные в JSON. Этот метод подходит для небольшого количества данных. Если необходимо обработать большой объем данных, мы можем использовать Item Pipeline. Как и файл data.json, зарезервированный файл создается при создании проекта в tutorial / pipelines.py .
Scrapy — Logging
Описание
Ведение журнала означает отслеживание событий, которое использует встроенную систему ведения журнала и определяет функции и классы для реализации приложений и библиотек. Logging — это готовый материал, который может работать с настройками Scrapy, перечисленными в настройках Logging.
Scrapy будет устанавливать некоторые настройки по умолчанию и обрабатывать эти настройки с помощью scrapy.utils.log.configure_logging () при запуске команд.
Уровни журнала
В Python существует пять разных уровней серьезности сообщения журнала. В следующем списке показаны стандартные сообщения журнала в порядке возрастания.
-
logging.DEBUG — для отладки сообщений (самая низкая серьезность)
-
logging.INFO — для информационных сообщений
-
logging.WARNING — для предупреждающих сообщений
-
logging.ERROR — для регулярных ошибок
-
logging.CRITICAL — для критических ошибок (наибольшая серьезность)
logging.DEBUG — для отладки сообщений (самая низкая серьезность)
logging.INFO — для информационных сообщений
logging.WARNING — для предупреждающих сообщений
logging.ERROR — для регулярных ошибок
logging.CRITICAL — для критических ошибок (наибольшая серьезность)
Как регистрировать сообщения
Следующий код показывает запись сообщения с использованием уровня logging.info .
import logging logging.info("This is an information")
Приведенное выше сообщение регистрации может быть передано в качестве аргумента, используя logging.log, показанный ниже:
import logging logging.log(logging.INFO, "This is an information")
Теперь вы также можете использовать средства ведения журнала, чтобы заключить сообщение, используя средства ведения журнала ведения журнала, чтобы получить сообщение журнала, которое четко показано следующим образом:
import logging logger = logging.getLogger() logger.info("This is an information")
Может быть несколько регистраторов, и к ним можно получить доступ, получив их имена с помощью функции logging.getLogger, показанной ниже.
import logging logger = logging.getLogger('mycustomlogger') logger.info("This is an information")
Настроенный регистратор можно использовать для любого модуля, используя переменную __name__, которая содержит путь к модулю, показанный ниже:
import logging logger = logging.getLogger(__name__) logger.info("This is an information")
Вход от Пауков
Каждый экземпляр паука имеет регистратор внутри и может использоваться следующим образом —
import scrapy class LogSpider(scrapy.Spider): name = 'logspider' start_urls = ['http://dmoz.com'] def parse(self, response): self.logger.info('Parse function called on %s', response.url)
В приведенном выше коде регистратор создается с использованием имени Паука, но вы можете использовать любой настраиваемый регистратор, предоставляемый Python, как показано в следующем коде:
import logging import scrapy logger = logging.getLogger('customizedlogger') class LogSpider(scrapy.Spider): name = 'logspider' start_urls = ['http://dmoz.com'] def parse(self, response): logger.info('Parse function called on %s', response.url)
Конфигурация журнала
Регистраторы не могут отображать сообщения, отправленные ими самостоятельно. Поэтому им требуются «обработчики» для отображения этих сообщений, а обработчики будут перенаправлять эти сообщения в их соответствующие пункты назначения, такие как файлы, электронные письма и стандартный вывод.
В зависимости от следующих настроек, Scrapy настроит обработчик для регистратора.
Настройки ведения журнала
Для настройки ведения журнала используются следующие параметры:
-
LOG_FILE и LOG_ENABLED определяют место назначения для сообщений журнала.
-
Когда вы установите для LOG_ENCODING значение false, он не будет отображать сообщения вывода журнала.
-
LOG_LEVEL определит порядок серьезности сообщения; те сообщения с меньшей серьезностью будут отфильтрованы.
-
LOG_FORMAT и LOG_DATEFORMAT используются для указания макетов для всех сообщений.
-
Когда вы установите для LOG_STDOUT значение true, все стандартные выходные данные и сообщения об ошибках вашего процесса будут перенаправлены в журнал.
LOG_FILE и LOG_ENABLED определяют место назначения для сообщений журнала.
Когда вы установите для LOG_ENCODING значение false, он не будет отображать сообщения вывода журнала.
LOG_LEVEL определит порядок серьезности сообщения; те сообщения с меньшей серьезностью будут отфильтрованы.
LOG_FORMAT и LOG_DATEFORMAT используются для указания макетов для всех сообщений.
Когда вы установите для LOG_STDOUT значение true, все стандартные выходные данные и сообщения об ошибках вашего процесса будут перенаправлены в журнал.
Параметры командной строки
Настройки Scrapy могут быть переопределены путем передачи аргументов командной строки, как показано в следующей таблице:
Sr.No | Команда и описание |
---|---|
1 |
—logfile FILE Переопределяет LOG_FILE |
2 |
—loglevel / -L LEVEL Переопределяет LOG_LEVEL |
3 |
—nolog Устанавливает LOG_ENABLED в False |
—logfile FILE
Переопределяет LOG_FILE
—loglevel / -L LEVEL
Переопределяет LOG_LEVEL
—nolog
Устанавливает LOG_ENABLED в False
модуль scrapy.utils.log
Эта функция может быть использована для инициализации параметров регистрации по умолчанию для Scrapy.
scrapy.utils.log.configure_logging(settings = None, install_root_handler = True)
Sr.No | Параметр и описание |
---|---|
1 |
настройки (dict, None) Он создает и настраивает обработчик для корневого регистратора. По умолчанию это None . |
2 |
install_root_handler (bool) Он указывает на установку обработчика корневых журналов. По умолчанию это True . |
настройки (dict, None)
Он создает и настраивает обработчик для корневого регистратора. По умолчанию это None .
install_root_handler (bool)
Он указывает на установку обработчика корневых журналов. По умолчанию это True .
Вышеуказанная функция —
- Маршрутизация предупреждений и искаженных журналов через стандартную регистрацию Python.
- Назначает DEBUG для уровня Scrapy и уровень ERROR для витых регистраторов.
- Направляет стандартный вывод в журнал, если для параметра LOG_STDOUT установлено значение true.
Параметры по умолчанию могут быть переопределены с помощью аргумента настройки . Если настройки не указаны, используются значения по умолчанию. Обработчик может быть создан для корневого регистратора, когда для install_root_handler задано значение true. Если задано значение false, то не будет никакого выхода журнала. При использовании команд Scrapy файл configure_logging будет вызываться автоматически, и он может запускаться явно при выполнении пользовательских сценариев.
Чтобы настроить вывод журнала вручную, вы можете использовать logging.basicConfig (), показанный ниже:
import logging from scrapy.utils.log import configure_logging configure_logging(install_root_handler = False) logging.basicConfig ( filename = 'logging.txt', format = '%(levelname)s: %(your_message)s', level = logging.INFO )
Scrapy — Stats Collection
Описание
Stats Collector — это средство, предоставляемое Scrapy для сбора статистики в виде ключей / значений, доступ к которой осуществляется с помощью API Crawler (Crawler обеспечивает доступ ко всем основным компонентам Scrapy). Сборщик статистики предоставляет одну таблицу статистики для каждого паука, в которой сборщик статистики открывается автоматически при открытии паука и закрывает сборщик статистики при закрытии паука.
Обычное использование сборщика статистики
Следующий код обращается к сборщику статистики, используя атрибут stats .
class ExtensionThatAccessStats(object): def __init__(self, stats): self.stats = stats @classmethod def from_crawler(cls, crawler): return cls(crawler.stats)
В следующей таблице показаны различные параметры, которые можно использовать со сборщиком статистики.
Sr.No | параметры | Описание |
---|---|---|
1 |
stats.set_value('hostname', socket.gethostname()) |
Используется для установки значения статистики. |
2 |
stats.inc_value('customized_count') |
Это увеличивает значение стат. |
3 |
stats.max_value('max_items_scraped', value) |
Вы можете установить значение статистики, только если оно больше предыдущего значения. |
4 |
stats.min_value('min_free_memory_percent', value) |
Вы можете установить значение статистики, только если оно ниже предыдущего значения. |
5 |
stats.get_value('customized_count') |
Получает значение стат. |
6 |
stats.get_stats() {'custom_count': 1, 'start_time': datetime.datetime(2009, 7, 14, 21, 47, 28, 977139)} |
Получает всю статистику |
Доступные Статистика Коллекционеры
Scrapy предоставляет различные типы сборщика статистики, доступ к которому можно получить с помощью настройки STATS_CLASS .
MemoryStatsCollector
Это сборщик статистики по умолчанию, который поддерживает статистику каждого паука, который использовался для очистки, и данные будут храниться в памяти.
class scrapy.statscollectors.MemoryStatsCollector
DummyStatsCollector
Этот сборщик статистики очень эффективен и ничего не делает. Это может быть установлено с помощью параметра STATS_CLASS и может быть использовано для отключения сбора статистики для повышения производительности.
class scrapy.statscollectors.DummyStatsCollector
Scrapy — отправка электронной почты
Описание
Scrapy может отправлять электронные письма, используя свое собственное средство, называемое Twisted неблокирующее IO, которое защищает от неблокирующего IO сканера. Вы можете настроить несколько параметров отправки электронных писем и предоставить простой API для отправки вложений.
Существует два способа создания MailSender, как показано в следующей таблице:
Sr.No | параметры | метод |
---|---|---|
1 | из scrapy.mail импорт MailSender mailer = MailSender () | Используя стандартный конструктор. |
2 | mailer = MailSender.from_settings (настройки) | С помощью объекта настроек Scrapy. |
Следующая строка отправляет электронное письмо без вложений —
mailer.send(to = ["[email protected]"], subject = "subject data", body = "body data", cc = ["[email protected]"])
Ссылка на класс MailSender
Класс MailSender использует неблокируемый ввод- вывод Twisted для отправки электронной почты из Scrapy.
class scrapy.mail.MailSender(smtphost = None, mailfrom = None, smtpuser = None, smtppass = None, smtpport = None)
В следующей таблице приведены параметры, используемые в классе MailSender.
Sr.No | Параметр и описание |
---|---|
1 |
smtphost (str) Хост SMTP используется для отправки электронных писем. Если нет, то будет использоваться настройка MAIL_HOST . |
2 |
mailfrom (str) Адрес получателя используется для отправки электронных писем. Если нет, то будет использоваться настройка MAIL_FROM . |
3 |
smtpuser Указывает пользователя SMTP. Если он не используется, будет использоваться настройка MAIL_USER , и SMTP-проверка не будет выполняться, если она не указана. |
4 |
smtppass (str) Он указывает SMTP проход для проверки. |
5 |
smtpport (int) Указывает порт SMTP для подключения. |
6 |
smtptls (логическое) Он реализует использование SMTP STARTTLS. |
7 |
smtpssl (логическое) Он администрирует, используя безопасное соединение SSL. |
smtphost (str)
Хост SMTP используется для отправки электронных писем. Если нет, то будет использоваться настройка MAIL_HOST .
mailfrom (str)
Адрес получателя используется для отправки электронных писем. Если нет, то будет использоваться настройка MAIL_FROM .
smtpuser
Указывает пользователя SMTP. Если он не используется, будет использоваться настройка MAIL_USER , и SMTP-проверка не будет выполняться, если она не указана.
smtppass (str)
Он указывает SMTP проход для проверки.
smtpport (int)
Указывает порт SMTP для подключения.
smtptls (логическое)
Он реализует использование SMTP STARTTLS.
smtpssl (логическое)
Он администрирует, используя безопасное соединение SSL.
Следующие два метода есть в ссылке на класс MailSender, как указано. Первый метод,
classmethod from_settings(settings)
Включает с помощью объекта настроек Scrapy. Он содержит следующий параметр —
параметры (объект scrapy.settings.Settings) — Он рассматривается как получатель электронной почты.
Другой метод,
send(to, subject, body, cc = None, attachs = (), mimetype = 'text/plain', charset = None)
Следующая таблица содержит параметры вышеуказанного метода —
Sr.No | Параметр и описание |
---|---|
1 |
к списку) Это относится к получателю электронной почты. |
2 |
предмет (ул) Указывает тему письма. |
3 |
Копия (список) Это относится к списку получателей. |
4 |
тело (ул) Это относится к данным тела письма. |
5 |
прикрепляет (повторяется) Это относится к вложению электронной почты, mimetype вложения и имени вложения. |
6 |
Mimetype (ул) Он представляет MIME-тип электронной почты. |
7 |
charset (str) Он определяет кодировку символов, используемую для содержимого электронной почты. |
к списку)
Это относится к получателю электронной почты.
предмет (ул)
Указывает тему письма.
Копия (список)
Это относится к списку получателей.
тело (ул)
Это относится к данным тела письма.
прикрепляет (повторяется)
Это относится к вложению электронной почты, mimetype вложения и имени вложения.
Mimetype (ул)
Он представляет MIME-тип электронной почты.
charset (str)
Он определяет кодировку символов, используемую для содержимого электронной почты.
Настройки почты
Следующие настройки гарантируют, что без написания какого-либо кода мы сможем настроить электронную почту, используя класс MailSender в проекте.
Sr.No | Настройки и описание | Значение по умолчанию |
---|---|---|
1 |
mail_from Это относится к электронной почте отправителя для отправки электронных писем. |
‘SCRAPY @ локальный’ |
2 |
MAIL_HOST Это относится к узлу SMTP, используемому для отправки электронных писем. |
«Локальный» |
3 |
MAIL_PORT Указывает порт SMTP, который будет использоваться для отправки электронных писем. |
25 |
4 |
MAIL_USER Это относится к проверке SMTP. Проверка не будет выполнена, если этот параметр отключен. |
Никто |
5 |
MAIL_PASS Он предоставляет пароль, используемый для проверки SMTP. |
Никто |
6 |
MAIL_TLS Он предоставляет метод обновления небезопасного соединения до безопасного соединения с использованием SSL / TLS. |
Ложь |
7 |
MAIL_SSL Он реализует соединение, используя зашифрованное соединение SSL. |
Ложь |
mail_from
Это относится к электронной почте отправителя для отправки электронных писем.
MAIL_HOST
Это относится к узлу SMTP, используемому для отправки электронных писем.
MAIL_PORT
Указывает порт SMTP, который будет использоваться для отправки электронных писем.
MAIL_USER
Это относится к проверке SMTP. Проверка не будет выполнена, если этот параметр отключен.
MAIL_PASS
Он предоставляет пароль, используемый для проверки SMTP.
MAIL_TLS
Он предоставляет метод обновления небезопасного соединения до безопасного соединения с использованием SSL / TLS.
MAIL_SSL
Он реализует соединение, используя зашифрованное соединение SSL.
Scrapy — консоль Telnet
Описание
Консоль Telnet — это оболочка Python, которая запускается внутри процесса Scrapy и используется для проверки и управления процессом Scrapy.
Доступ к консоли Telnet
Доступ к консоли telnet можно получить с помощью следующей команды:
telnet localhost 6023
В основном, консоль telnet указана в порте TCP, который описан в настройках TELNETCONSOLE_PORT .
переменные
Некоторые из переменных по умолчанию, приведенных в следующей таблице, используются в качестве ярлыков —
Sr.No | Ярлык и описание |
---|---|
1 |
гусеничный трактор Это относится к объекту Scrapy Crawler (scrapy.crawler.Crawler). |
2 |
двигатель Это относится к атрибуту Crawler.engine. |
3 |
паук Это относится к пауку, который активен. |
4 |
слот Это относится к слоту двигателя. |
5 |
расширения Это относится к атрибуту Extension Manager (Crawler.extensions). |
6 |
статистика Это относится к атрибуту Stats Collector (Crawler.stats). |
7 |
установка Это относится к атрибуту объекта настроек Scrapy (Crawler.settings). |
8 |
стандартное восточное время Это относится к распечатке отчета о состоянии двигателя. |
9 |
привилегированные Это относится к памяти для отладки. |
10 |
п Это относится к ярлыку функции pprint.pprint . |
11 |
HPY Это относится к отладке памяти. |
гусеничный трактор
Это относится к объекту Scrapy Crawler (scrapy.crawler.Crawler).
двигатель
Это относится к атрибуту Crawler.engine.
паук
Это относится к пауку, который активен.
слот
Это относится к слоту двигателя.
расширения
Это относится к атрибуту Extension Manager (Crawler.extensions).
статистика
Это относится к атрибуту Stats Collector (Crawler.stats).
установка
Это относится к атрибуту объекта настроек Scrapy (Crawler.settings).
стандартное восточное время
Это относится к распечатке отчета о состоянии двигателя.
привилегированные
Это относится к памяти для отладки.
п
Это относится к ярлыку функции pprint.pprint .
HPY
Это относится к отладке памяти.
Примеры
Ниже приведены некоторые примеры, иллюстрируемые с помощью консоли Telnet.
Приостановить, возобновить и остановить Scrapy Engine
Чтобы приостановить Scrapy Engine, используйте следующую команду —
telnet localhost 6023 >>> engine.pause() >>>
Чтобы возобновить Scrapy Engine, используйте следующую команду —
telnet localhost 6023 >>> engine.unpause() >>>
Чтобы остановить двигатель Scrapy, используйте следующую команду —
telnet localhost 6023 >>> engine.stop() Connection closed by foreign host.
Просмотр состояния двигателя
Консоль Telnet использует метод est () для проверки состояния движка Scrapy, как показано в следующем коде —
telnet localhost 6023 >>> est() Execution engine status time()-engine.start_time : 8.62972998619 engine.has_capacity() : False len(engine.downloader.active) : 16 engine.scraper.is_idle() : False engine.spider.name : followall engine.spider_is_idle(engine.spider) : False engine.slot.closing : False len(engine.slot.inprogress) : 16 len(engine.slot.scheduler.dqs or []) : 0 len(engine.slot.scheduler.mqs) : 92 len(engine.scraper.slot.queue) : 0 len(engine.scraper.slot.active) : 0 engine.scraper.slot.active_size : 0 engine.scraper.slot.itemproc_size : 0 engine.scraper.slot.needs_backout() : False
Сигналы консоли Telnet
Вы можете использовать сигналы консоли telnet для добавления, обновления или удаления переменных в локальном пространстве имен telnet. Чтобы выполнить это действие, вам нужно добавить dict telnet_vars в ваш обработчик.
scrapy.extensions.telnet.update_telnet_vars(telnet_vars)
Параметры —
telnet_vars (dict)
Где dict — это словарь, содержащий переменные telnet.
Настройки Telnet
В следующей таблице приведены параметры, управляющие поведением консоли Telnet.
Sr.No | Настройки и описание | Значение по умолчанию |
---|---|---|
1 |
TELNETCONSOLE_PORT Это относится к диапазону портов для консоли telnet. Если для него установлено значение none, порт будет назначен динамически. |
[6023, 6073] |
2 |
TELNETCONSOLE_HOST Это относится к интерфейсу, который должна прослушивать консоль telnet. |
‘127.0.0.1’ |
TELNETCONSOLE_PORT
Это относится к диапазону портов для консоли telnet. Если для него установлено значение none, порт будет назначен динамически.
TELNETCONSOLE_HOST
Это относится к интерфейсу, который должна прослушивать консоль telnet.
Scrapy — веб-сервисы
Описание
Работающий веб-сканер Scrapy можно контролировать через JSON-RPC . Это включено настройкой JSONRPC_ENABLED. Этот сервис предоставляет доступ к основному объекту искателя по протоколу JSON-RPC 2.0 . Конечная точка для доступа к объекту искателя:
http://localhost:6080/crawler
В следующей таблице приведены некоторые параметры, которые показывают поведение веб-службы.
JSONRPC_ENABLED
Это относится к логическому значению, которое решает, будет ли включен веб-сервис вместе с его расширением или нет.
JSONRPC_LOGFILE
Это относится к файлу, который используется для регистрации HTTP-запросов к веб-сервису. Если он не установлен, будет использоваться стандартный журнал Scrapy.
JSONRPC_PORT
Это относится к диапазону портов для веб-службы. Если для него установлено значение none, порт будет назначен динамически.
JSONRPC_HOST
Это относится к интерфейсу, который должен прослушивать веб-сервис.