Scrapy - Anfragen und Antworten

Beschreibung

Scrapy kann Websites mit dem crawlen Request und ResponseObjekte. Die Anforderungsobjekte werden über das System übertragen, verwenden die Spider, um die Anforderung auszuführen und zur Anforderung zurückzukehren, wenn ein Antwortobjekt zurückgegeben wird.

Objekte anfordern

Das Anforderungsobjekt ist eine HTTP-Anforderung, die eine Antwort generiert. Es hat die folgende Klasse -

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

Die folgende Tabelle zeigt die Parameter von Anforderungsobjekten -

Sr.Nr. Parameter & Beschreibung
1

url

Es ist eine Zeichenfolge, die die URL-Anforderung angibt.

2

callback

Es ist eine aufrufbare Funktion, die die Antwort der Anfrage als ersten Parameter verwendet.

3

method

Es ist eine Zeichenfolge, die die HTTP-Methodenanforderung angibt.

4

headers

Es ist ein Wörterbuch mit Anforderungsheadern.

5

body

Es ist eine Zeichenfolge oder ein Unicode mit einem Anforderungshauptteil.

6

cookies

Es ist eine Liste mit Anforderungscookies.

7

meta

Es ist ein Wörterbuch, das Werte für Metadaten der Anforderung enthält.

8

encoding

Es ist eine Zeichenfolge mit der utf-8-Codierung, die zum Codieren der URL verwendet wird.

9

priority

Es ist eine Ganzzahl, bei der der Scheduler die Priorität verwendet, um die Reihenfolge für die Verarbeitung von Anforderungen zu definieren.

10

dont_filter

Es ist ein Boolescher Wert, der angibt, dass der Scheduler die Anforderung nicht filtern soll.

11

errback

Es ist eine aufrufbare Funktion, die aufgerufen wird, wenn eine Ausnahme während der Verarbeitung einer Anforderung ausgelöst wird.

Übergabe zusätzlicher Daten an Rückruffunktionen

Die Rückruffunktion einer Anfrage wird aufgerufen, wenn die Antwort als erster Parameter heruntergeladen wird.

Zum Beispiel -

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)

Sie können verwenden Request.meta Attribut, wenn Sie Argumente an aufrufbare Funktionen übergeben und diese Argumente im zweiten Rückruf empfangen möchten, wie im folgenden Beispiel gezeigt -

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

Verwenden von Errbacks zum Abfangen von Ausnahmen bei der Anforderungsverarbeitung

Der Errback ist eine aufrufbare Funktion, die aufgerufen wird, wenn eine Ausnahme während der Verarbeitung einer Anforderung ausgelöst wird.

Das folgende Beispiel zeigt dies -

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 Spezialschlüssel

Die Spezialschlüssel request.meta sind eine Liste spezieller Metaschlüssel, die von Scrapy identifiziert wurden.

Die folgende Tabelle zeigt einige der Schlüssel von Request.meta -

Sr.Nr. Schlüssel & Beschreibung
1

dont_redirect

Wenn dieser Wert auf true gesetzt ist, wird die Anforderung nicht basierend auf dem Status der Antwort umgeleitet.

2

dont_retry

Es ist ein Schlüssel, wenn er auf true gesetzt ist, die fehlgeschlagenen Anforderungen nicht wiederholt und von der Middleware ignoriert wird.

3

handle_httpstatus_list

Es ist ein Schlüssel, der definiert, welche Antwortcodes pro Anforderungsbasis zulässig sind.

4

handle_httpstatus_all

Es ist ein Schlüssel, der verwendet wird, um einen Antwortcode für eine Anforderung zuzulassen, indem er auf true gesetzt wird .

5

dont_merge_cookies

Es ist ein Schlüssel, der verwendet wird, um das Zusammenführen mit den vorhandenen Cookies zu vermeiden, indem er auf true gesetzt wird .

6

cookiejar

Es ist ein Schlüssel, mit dem mehrere Cookie-Sitzungen pro Spinne gespeichert werden.

7

dont_cache

Dieser Schlüssel wird verwendet, um das Zwischenspeichern von HTTP-Anforderungen und -Antworten für jede Richtlinie zu vermeiden.

8

redirect_urls

Es ist ein Schlüssel, der URLs enthält, über die die Anforderungen weitergeleitet werden.

9

bindaddress

Es ist die IP der ausgehenden IP-Adresse, die zum Ausführen der Anforderung verwendet werden kann.

10

dont_obey_robotstxt

Wenn dieser Wert auf true gesetzt ist, werden die vom Ausschlussstandard robots.txt verbotenen Anforderungen nicht gefiltert, selbst wenn ROBOTSTXT_OBEY aktiviert ist.

11

download_timeout

Es wird verwendet, um das Zeitlimit (in Sekunden) pro Spinne festzulegen, auf das der Downloader wartet, bevor das Zeitlimit überschritten wird.

12

download_maxsize

Hiermit wird die maximale Größe (in Byte) pro Spinne festgelegt, die der Downloader herunterladen wird.

13

proxy

Für Anforderungsobjekte kann ein Proxy festgelegt werden, um den HTTP-Proxy für die Verwendung von Anforderungen festzulegen.

Unterklassen anfordern

Sie können Ihre eigenen benutzerdefinierten Funktionen implementieren, indem Sie die Anforderungsklasse unterordnen. Die integrierten Anforderungsunterklassen lauten wie folgt:

FormRequest-Objekte

Die FormRequest-Klasse behandelt HTML-Formulare, indem sie die Basisanforderung erweitert. Es hat die folgende Klasse -

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

Es folgt der Parameter -

formdata - Es handelt sich um ein Wörterbuch mit HTML-Formulardaten, das dem Hauptteil der Anforderung zugewiesen ist.

Note - Die verbleibenden Parameter entsprechen denen der Anforderungsklasse und werden in erläutert Request Objects Sektion.

Die folgenden Klassenmethoden werden von unterstützt FormRequest Objekte zusätzlich zu Anforderungsmethoden -

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

Die folgende Tabelle zeigt die Parameter der obigen Klasse -

Sr.Nr. Parameter & Beschreibung
1

response

Es ist ein Objekt, mit dem die Formularfelder mithilfe der HTML-Antwortform vorab ausgefüllt werden.

2

formname

Es ist eine Zeichenfolge, in der das Formular mit dem Namensattribut verwendet wird, sofern angegeben.

3

formnumber

Es ist eine Ganzzahl von Formularen, die verwendet werden sollen, wenn die Antwort mehrere Formulare enthält.

4

formdata

Es ist ein Wörterbuch mit Feldern in den Formulardaten, die zum Überschreiben verwendet werden.

5

formxpath

Wenn angegeben, handelt es sich um eine Zeichenfolge. Es wird das Formular verwendet, das dem xpath entspricht.

6

formcss

Wenn angegeben, handelt es sich um eine Zeichenfolge. Es wird das Formular verwendet, das dem CSS-Selektor entspricht.

7

clickdata

Es ist ein Wörterbuch mit Attributen, mit denen das angeklickte Steuerelement überwacht wird.

8

dont_click

Die Daten aus dem Formular werden gesendet, ohne auf ein Element zu klicken, wenn true festgelegt ist.

Beispiele

Im Folgenden finden Sie einige Beispiele für die Verwendung von Anforderungen:

Using FormRequest to send data via HTTP POST

Der folgende Code zeigt, wie Sie zurückkehren FormRequest Objekt, wenn Sie HTML-Formular POST in Ihrer Spinne duplizieren möchten -

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

Normalerweise verwenden Websites Elemente, über die vorab ausgefüllte Formularfelder bereitgestellt werden.

Das FormRequest.form_response() Die Methode kann verwendet werden, wenn diese Felder beim Scraping automatisch ausgefüllt werden sollen.

Das folgende Beispiel zeigt dies.

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

Antwortobjekte

Es ist ein Objekt, das eine HTTP-Antwort angibt, die den Spinnen zur Verarbeitung zugeführt wird. Es hat die folgende Klasse -

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

Die folgende Tabelle zeigt die Parameter von Antwortobjekten -

Sr.Nr. Parameter & Beschreibung
1

url

Es ist eine Zeichenfolge, die die URL-Antwort angibt.

2

status

Es ist eine Ganzzahl, die eine HTTP-Statusantwort enthält.

3

headers

Es ist ein Wörterbuch, das Antwortheader enthält.

4

body

Es ist eine Zeichenfolge mit Antworttext.

5

flags

Es ist eine Liste mit Antwortflags.

Antwortunterklassen

Sie können Ihre eigenen benutzerdefinierten Funktionen implementieren, indem Sie die Antwortklasse in Unterklassen unterteilen. Die integrierten Antwortunterklassen lauten wie folgt:

TextResponse objects

TextResponse-Objekte werden für Binärdaten wie Bilder, Töne usw. verwendet, mit denen die Basisantwortklasse codiert werden kann. Es hat die folgende Klasse -

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

Es folgt der Parameter -

encoding - Es ist eine Zeichenfolge mit Codierung, die zum Codieren einer Antwort verwendet wird.

Note - Die verbleibenden Parameter entsprechen der Antwortklasse und werden in erläutert Response Objects Sektion.

Die folgende Tabelle zeigt die Attribute, die vom TextResponse-Objekt zusätzlich zu den Antwortmethoden unterstützt werden.

Sr.Nr. Attribut & Beschreibung
1

text

Es ist ein Antworttext, auf den auf response.text mehrmals zugegriffen werden kann.

2

encoding

Es ist eine Zeichenfolge, die eine Codierung für die Antwort enthält.

3

selector

Es ist ein Attribut, das beim ersten Zugriff instanziiert wird und die Antwort als Ziel verwendet.

Die folgende Tabelle zeigt die Methoden von unterstützten TextResponse Objekte zusätzlich zu Antwortverfahren -

Sr.Nr. Methode & Beschreibung
1

xpath (query)

Es ist eine Verknüpfung zu TextResponse.selector.xpath (Abfrage).

2

css (query)

Es ist eine Verknüpfung zu TextResponse.selector.css (Abfrage).

3

body_as_unicode()

Es handelt sich um einen Antworttext, der als Methode verfügbar ist und auf den auf response.text mehrmals zugegriffen werden kann.

HtmlResponse-Objekte

Es ist ein Objekt, das das Codieren und automatische Erkennen unterstützt, indem das Meta-httpequiv- Attribut von HTML betrachtet wird. Die Parameter entsprechen denen der Antwortklasse und werden im Abschnitt Antwortobjekte erläutert. Es hat die folgende Klasse -

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

XmlResponse-Objekte

Es ist ein Objekt, das das Codieren und automatische Erkennen durch Betrachten der XML-Zeile unterstützt. Die Parameter entsprechen denen der Antwortklasse und werden im Abschnitt Antwortobjekte erläutert. Es hat die folgende Klasse -

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