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])