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

다음 표는 요청 객체의 매개 변수를 보여줍니다-

Sr. 아니요 매개 변수 및 설명
1

url

URL 요청을 지정하는 문자열입니다.

2

callback

요청의 응답을 첫 번째 매개 변수로 사용하는 호출 가능한 함수입니다.

삼

method

HTTP 메서드 요청을 지정하는 문자열입니다.

4

headers

요청 헤더가있는 사전입니다.

5

body

요청 본문이있는 문자열 또는 유니 코드입니다.

6

cookies

요청 쿠키가 포함 된 목록입니다.

7

meta

요청의 메타 데이터 값을 포함하는 사전입니다.

8

encoding

URL 인코딩에 사용되는 utf-8 인코딩이 포함 된 문자열입니다.

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의 키 중 일부를 보여줍니다-

Sr. 아니요 키 및 설명
1

dont_redirect

true로 설정된 경우 키이며 응답 상태에 따라 요청을 리디렉션하지 않습니다.

2

dont_retry

true로 설정된 경우 키이며 실패한 요청을 재 시도하지 않으며 미들웨어에서 무시됩니다.

삼

handle_httpstatus_list

요청별로 허용 할 수있는 응답 코드를 정의하는 키입니다.

4

handle_httpstatus_all

요청을 true 로 설정하여 요청에 대한 응답 코드를 허용하는 데 사용되는 키 입니다 .

5

dont_merge_cookies

true 로 설정하여 기존 쿠키와의 병합을 방지하는 데 사용되는 키 입니다 .

6

cookiejar

스파이더 당 여러 쿠키 세션을 유지하는 데 사용되는 키입니다.

7

dont_cache

각 정책에 대한 HTTP 요청 및 응답 캐싱을 방지하는 데 사용되는 키입니다.

8

redirect_urls

요청이 통과하는 URL을 포함하는 키입니다.

9

bindaddress

요청을 수행하는 데 사용할 수있는 나가는 IP 주소의 IP입니다.

10

dont_obey_robotstxt

true로 설정된 경우 키이며 ROBOTSTXT_OBEY가 활성화 된 경우에도 robots.txt 제외 표준에서 금지하는 요청을 필터링하지 않습니다.

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

다음 표는 위 클래스의 매개 변수를 보여줍니다-

Sr. 아니요 매개 변수 및 설명
1

response

HTML 형식의 응답을 사용하여 양식 필드를 미리 채우는 데 사용되는 개체입니다.

2

formname

지정된 경우 이름 속성이있는 양식이 사용되는 문자열입니다.

삼

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

다음 표는 응답 객체의 매개 변수를 보여줍니다-

Sr. 아니요 매개 변수 및 설명
1

url

URL 응답을 지정하는 문자열입니다.

2

status

HTTP 상태 응답을 포함하는 정수입니다.

삼

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 객체가 지원하는 속성을 보여줍니다-

Sr. 아니요 속성 및 설명
1

text

response.text에 여러 번 액세스 할 수있는 응답 본문입니다.

2

encoding

응답을위한 인코딩이 포함 된 문자열입니다.

삼

selector

첫 번째 액세스시 인스턴스화 된 속성이며 응답을 대상으로 사용합니다.

다음 표는 응답 방법 외에도 TextResponse 객체가 지원하는 방법을 보여줍니다 -

Sr. 아니요 방법 및 설명
1

xpath (query)

TextResponse.selector.xpath (query)에 대한 바로 가기입니다.

2

css (query)

TextResponse.selector.css (query)에 대한 바로 가기입니다.

삼

body_as_unicode()

response.text에 여러 번 액세스 할 수있는 메서드로 사용할 수있는 응답 본문입니다.

HtmlResponse 개체

HTML 의 메타 httpequiv 속성을 보고 인코딩 및 자동 검색을 지원하는 개체입니다 . 매개 변수는 응답 클래스와 동일하며 응답 객체 섹션에 설명되어 있습니다. 그것은 다음과 같은 클래스가 있습니다-

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

XmlResponse 개체

XML 라인을보고 인코딩 및 자동 검색을 지원하는 객체입니다. 매개 변수는 응답 클래스와 동일하며 응답 객체 섹션에 설명되어 있습니다. 그것은 다음과 같은 클래스가 있습니다-

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