Scrapy - Запросы и ответы

Описание

Scrapy может сканировать веб-сайты с помощью Request и Responseобъекты. Объекты запроса проходят через систему, используют пауков для выполнения запроса и возвращаются к запросу, когда он возвращает объект ответа.

Объекты запроса

Объект запроса - это HTTP-запрос, который генерирует ответ. Он имеет следующий класс -

class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])

В следующей таблице показаны параметры объектов запроса -

Старший Нет Параметр и описание
1

url

Это строка, определяющая URL-запрос.

2

callback

Это вызываемая функция, которая использует ответ на запрос в качестве первого параметра.

3

method

Это строка, определяющая запрос метода HTTP.

4

headers

Это словарь с заголовками запросов.

5

body

Это строка или юникод с телом запроса.

6

cookies

Это список, содержащий файлы cookie запроса.

7

meta

Это словарь, который содержит значения для метаданных запроса.

8

encoding

Это строка, содержащая кодировку utf-8, используемую для кодирования URL.

9

priority

Это целое число, в котором планировщик использует приоритет для определения порядка обработки запросов.

10

dont_filter

Это логическое значение, указывающее, что планировщик не должен фильтровать запрос.

11

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

Использование errbacks для перехвата исключений при обработке запроса

Errback - это вызываемая функция, которая вызывается при возникновении исключения при обработке запроса.

Следующий пример демонстрирует это -

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 -

Старший Нет Ключ и описание
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

proxy

Прокси-сервер может быть установлен для объектов запроса, чтобы установить 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-формы, которые присваиваются тексту запроса.

Note - Остальные параметры такие же, как у класса запроса, и объясняются в Request Objects раздел.

Следующие методы класса поддерживаются FormRequest объекты помимо методов запроса -

classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, 
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])

В следующей таблице показаны параметры вышеуказанного класса -

Старший Нет Параметр и описание
1

response

Это объект, используемый для предварительного заполнения полей формы с помощью HTML-формы ответа.

2

formname

Это строка, в которой будет использоваться форма с атрибутом name, если она указана.

3

formnumber

Это целое число форм, которые будут использоваться, когда в ответе есть несколько форм.

4

formdata

Это словарь полей данных формы, используемых для переопределения.

5

formxpath

Если это строка, то используется форма, соответствующая xpath.

6

formcss

Если это строка, то используется форма, соответствующая селектору css.

7

clickdata

Это словарь атрибутов, используемых для наблюдения за выбранным элементом управления.

8

dont_click

Данные из формы будут отправлены без щелчка по любому элементу, если установлено значение true.

Примеры

Ниже приведены некоторые примеры использования запросов.

Using FormRequest to send data via HTTP POST

Следующий код демонстрирует, как вернуть FormRequest объект, если вы хотите продублировать HTML-форму POST в своем пауке -

return [FormRequest(url = "http://www.something.com/post/action", 
   formdata = {'firstname': 'John', 'lastname': 'dave'}, 
   callback = self.after_post)]

Using FormRequest.from_response() to simulate a user login

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

В 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 -

Старший Нет Параметр и описание
1

url

Это строка, определяющая ответ URL.

2

status

Это целое число, содержащее ответ статуса HTTP.

3

headers

Это словарь, содержащий заголовки ответов.

4

body

Это строка с телом ответа.

5

flags

Это список, содержащий флаги ответа.

Подклассы ответа

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

TextResponse objects

Объекты TextResponse используются для двоичных данных, таких как изображения, звуки и т. Д., Которые могут кодировать базовый класс Response. Он имеет следующий класс -

class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])

Ниже приводится параметр -

encoding - Это строка с кодировкой, которая используется для кодирования ответа.

Note - Остальные параметры такие же, как у класса ответа, и объясняются в Response Objects раздел.

В следующей таблице показаны атрибуты, поддерживаемые объектом TextResponse в дополнение к методам ответа.

Старший Нет Атрибут и описание
1

text

Это тело ответа, к которому response.text может быть доступен несколько раз.

2

encoding

Это строка, содержащая кодировку ответа.

3

selector

Это атрибут, который создается при первом доступе и использует ответ в качестве цели.

В следующей таблице показаны методы, поддерживаемые объектами TextResponse в дополнение к методам ответа.

Старший Нет Метод и описание
1

xpath (query)

Это ярлык для TextResponse.selector.xpath (query).

2

css (query)

Это ярлык для TextResponse.selector.css (запрос).

3

body_as_unicode()

Это тело ответа, доступное как метод, к которому response.text может быть доступен несколько раз.

Объекты HtmlResponse

Это объект, который поддерживает кодирование и автоматическое обнаружение при просмотре мета- атрибута httpequiv HTML. Его параметры такие же, как у класса ответа, и объясняются в разделе Объекты ответа. Он имеет следующий класс -

class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])

Объекты XmlResponse

Это объект, который поддерживает кодирование и автоматическое обнаружение при просмотре строки XML. Его параметры такие же, как у класса ответа, и объясняются в разделе Объекты ответа. Он имеет следующий класс -

class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])