Scrapy - Demandes et réponses
La description
Scrapy peut explorer des sites Web à l'aide du Request et Responseobjets. Les objets de requête passent sur le système, utilisent les araignées pour exécuter la requête et reviennent à la requête quand elle renvoie un objet de réponse.
Objets de demande
L'objet de requête est une requête HTTP qui génère une réponse. Il a la classe suivante -
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Le tableau suivant montre les paramètres des objets Request -
Sr. Non | Paramètre et description |
---|---|
1 | url C'est une chaîne qui spécifie la demande d'URL. |
2 | callback C'est une fonction appelable qui utilise la réponse de la requête comme premier paramètre. |
3 | method C'est une chaîne qui spécifie la demande de méthode HTTP. |
4 | headers C'est un dictionnaire avec des en-têtes de requête. |
5 | body C'est une chaîne ou unicode qui a un corps de requête. |
6 | cookies C'est une liste contenant des cookies de demande. |
sept | meta C'est un dictionnaire qui contient les valeurs des métadonnées de la demande. |
8 | encoding C'est une chaîne contenant le codage utf-8 utilisé pour coder l'URL. |
9 | priority Il s'agit d'un entier où le planificateur utilise la priorité pour définir l'ordre de traitement des demandes. |
dix | dont_filter C'est un booléen spécifiant que le planificateur ne doit pas filtrer la demande. |
11 | errback C'est une fonction appelable à appeler lorsqu'une exception lors du traitement d'une requête est déclenchée. |
Transmission de données supplémentaires aux fonctions de rappel
La fonction de rappel d'une demande est appelée lorsque la réponse est téléchargée en tant que premier paramètre.
Par exemple -
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)
Vous pouvez utiliser Request.meta attribut, si vous souhaitez passer des arguments aux fonctions appelables et recevoir ces arguments dans le deuxième rappel, comme indiqué dans l'exemple suivant -
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
Utilisation des erreurs pour intercepter les exceptions dans le traitement des demandes
L'errback est une fonction appelable à appeler lorsqu'une exception lors du traitement d'une requête est déclenchée.
L'exemple suivant illustre ceci -
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 Clés spéciales
Les clés spéciales request.meta sont une liste de clés méta spéciales identifiées par Scrapy.
Le tableau suivant montre certaines des clés de Request.meta -
Sr. Non | Clé et description |
---|---|
1 | dont_redirect C'est une clé lorsqu'elle est définie sur true, ne redirige pas la demande en fonction de l'état de la réponse. |
2 | dont_retry Il s'agit d'une clé lorsqu'elle est définie sur true, ne réessaye pas les demandes ayant échoué et sera ignorée par le middleware. |
3 | handle_httpstatus_list Il s'agit d'une clé qui définit quels codes de réponse par requête peuvent être autorisés. |
4 | handle_httpstatus_all C'est une clé utilisée pour autoriser n'importe quel code de réponse pour une demande en le définissant sur true . |
5 | dont_merge_cookies C'est une clé utilisée pour éviter de fusionner avec les cookies existants en la définissant sur true . |
6 | cookiejar C'est une clé utilisée pour conserver plusieurs sessions de cookies par araignée. |
sept | dont_cache C'est une clé utilisée pour éviter de mettre en cache les requêtes et réponses HTTP sur chaque stratégie. |
8 | redirect_urls C'est une clé qui contient les URL à travers lesquelles les requêtes passent. |
9 | bindaddress C'est l'adresse IP de l'adresse IP sortante qui peut être utilisée pour exécuter la requête. |
dix | dont_obey_robotstxt C'est une clé lorsqu'elle est définie sur true, ne filtre pas les requêtes interdites par la norme d'exclusion robots.txt, même si ROBOTSTXT_OBEY est activé. |
11 | download_timeout Il est utilisé pour définir le délai d'expiration (en secondes) par spider pendant lequel le téléchargeur attendra avant qu'il expire. |
12 | download_maxsize Il est utilisé pour définir la taille maximale (en octets) par spider, que le téléchargeur téléchargera. |
13 | proxy Le proxy peut être défini pour les objets Request afin de définir le proxy HTTP pour l'utilisation des requêtes. |
Demander des sous-classes
Vous pouvez implémenter votre propre fonctionnalité personnalisée en sous-classant la classe de demande. Les sous-classes de requêtes intégrées sont les suivantes:
Objets FormRequest
La classe FormRequest traite les formulaires HTML en étendant la requête de base. Il a la classe suivante -
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body,
cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])
Voici le paramètre -
formdata - Il s'agit d'un dictionnaire contenant des données de formulaire HTML qui sont affectées au corps de la requête.
Note - Les paramètres restants sont les mêmes que la classe de requête et sont expliqués dans Request Objects section.
Les méthodes de classe suivantes sont prises en charge par FormRequest objets en plus des méthodes de requête -
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None,
formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])
Le tableau suivant montre les paramètres de la classe ci-dessus -
Sr. Non | Paramètre et description |
---|---|
1 | response Il s'agit d'un objet utilisé pour pré-remplir les champs du formulaire à l'aide du formulaire de réponse HTML. |
2 | formname C'est une chaîne où la forme ayant l'attribut de nom sera utilisée, si elle est spécifiée. |
3 | formnumber Il s'agit d'un entier de formulaires à utiliser lorsqu'il y a plusieurs formulaires dans la réponse. |
4 | formdata Il s'agit d'un dictionnaire de champs dans les données de formulaire utilisé pour remplacer. |
5 | formxpath C'est une chaîne lorsqu'elle est spécifiée, la forme correspondant à xpath est utilisée. |
6 | formcss C'est une chaîne lorsqu'elle est spécifiée, la forme correspondant au sélecteur css est utilisée. |
sept | clickdata C'est un dictionnaire d'attributs utilisé pour observer le champ cliqué. |
8 | dont_click Les données du formulaire seront soumises sans cliquer sur aucun élément, lorsqu'il est défini sur true. |
Exemples
Voici quelques exemples d'utilisation des requêtes -
Using FormRequest to send data via HTTP POST
Le code suivant montre comment retourner FormRequest objet lorsque vous souhaitez dupliquer le formulaire HTML POST dans votre spider -
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
Normalement, les sites Web utilisent des éléments à travers lesquels ils fournissent des champs de formulaire pré-remplis.
le FormRequest.form_response() peut être utilisée lorsque vous souhaitez que ces champs soient automatiquement renseignés lors du scraping.
L'exemple suivant illustre cela.
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
Objets de réponse
Il s'agit d'un objet indiquant la réponse HTTP qui est transmise aux araignées à traiter. Il a la classe suivante -
class scrapy.http.Response(url[, status = 200, headers, body, flags])
Le tableau suivant présente les paramètres des objets Response -
Sr. Non | Paramètre et description |
---|---|
1 | url C'est une chaîne qui spécifie la réponse URL. |
2 | status C'est un entier qui contient une réponse d'état HTTP. |
3 | headers C'est un dictionnaire contenant des en-têtes de réponse. |
4 | body C'est une chaîne avec un corps de réponse. |
5 | flags C'est une liste contenant des indicateurs de réponse. |
Sous-classes de réponse
Vous pouvez implémenter votre propre fonctionnalité personnalisée en sous-classant la classe de réponse. Les sous-classes de réponse intégrées sont les suivantes:
TextResponse objects
Les objets TextResponse sont utilisés pour des données binaires telles que des images, des sons, etc. qui ont la capacité d'encoder la classe Response de base. Il a la classe suivante -
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])
Voici le paramètre -
encoding - C'est une chaîne avec encodage qui est utilisée pour encoder une réponse.
Note - Les paramètres restants sont identiques à la classe de réponse et sont expliqués dans Response Objects section.
Le tableau suivant montre les attributs pris en charge par l'objet TextResponse en plus des méthodes de réponse -
Sr. Non | Attribut et description |
---|---|
1 | text Il s'agit d'un corps de réponse, où response.text est accessible plusieurs fois. |
2 | encoding C'est une chaîne contenant le codage de la réponse. |
3 | selector C'est un attribut instancié au premier accès et utilise la réponse comme cible. |
Le tableau suivant montre les méthodes prises en charge par les objets TextResponse en plus des méthodes de réponse -
Sr. Non | Méthode et description |
---|---|
1 | xpath (query) C'est un raccourci vers TextResponse.selector.xpath (requête). |
2 | css (query) C'est un raccourci vers TextResponse.selector.css (requête). |
3 | body_as_unicode() Il s'agit d'un corps de réponse disponible en tant que méthode, où response.text est accessible plusieurs fois. |
Objets HtmlResponse
C'est un objet qui prend en charge l'encodage et la découverte automatique en regardant l' attribut meta httpequiv du HTML. Ses paramètres sont les mêmes que ceux de la classe de réponse et sont expliqués dans la section Objets de réponse. Il a la classe suivante -
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])
Objets XmlResponse
C'est un objet qui prend en charge l'encodage et la détection automatique en regardant la ligne XML. Ses paramètres sont les mêmes que ceux de la classe de réponse et sont expliqués dans la section Objets de réponse. Il a la classe suivante -
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])