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