Учебники

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)

Это метод класса, который создает вашего паука. Параметры —

  • сканер — сканер, к которому будет привязан экземпляр паука.

  • args (list) — эти аргументы передаются методу _init_ () .

  • kwargs (dict) — эти ключевые аргументы передаются методу _init_ () .

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-адресами, как показано в следующей команде.