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