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