Учебники

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. Его параметры совпадают с классом ответа и описаны в разделе «Объекты ответа». У него есть следующий класс —