Scrapy - prośby i odpowiedzi
Opis
Scrapy może indeksować witryny internetowe przy użyciu rozszerzenia Request i Responseobiekty. Obiekty żądania przechodzą przez system, używają pająków do wykonania żądania i wracają do żądania, gdy zwraca obiekt odpowiedzi.
Zażądaj obiektów
Obiekt żądania to żądanie HTTP, które generuje odpowiedź. Ma następującą klasę -
class scrapy.http.Request(url[, callback, method = 'GET', headers, body, cookies, meta,
   encoding = 'utf-8', priority = 0, dont_filter = False, errback])Poniższa tabela przedstawia parametry obiektów Request -
| Sr.No | Parametr i opis | 
|---|---|
| 1 | url Jest to ciąg określający żądanie adresu URL. | 
| 2 | callback Jest to funkcja wywoływalna, która używa odpowiedzi na żądanie jako pierwszego parametru. | 
| 3 | method Jest to ciąg określający żądanie metody HTTP. | 
| 4 | headers Jest to słownik z nagłówkami żądań. | 
| 5 | body Jest to ciąg znaków lub Unicode, który zawiera treść żądania. | 
| 6 | cookies Jest to lista zawierająca pliki cookie żądań. | 
| 7 | meta Jest to słownik zawierający wartości dla metadanych żądania. | 
| 8 | encoding Jest to ciąg zawierający kodowanie utf-8 używane do kodowania adresu URL. | 
| 9 | priority Jest to liczba całkowita, w przypadku której program planujący używa priorytetu do definiowania kolejności przetwarzania żądań. | 
| 10 | dont_filter Jest to wartość logiczna określająca, że program planujący nie powinien filtrować żądania. | 
| 11 | errback Jest to funkcja wywoływalna, która jest wywoływana, gdy zostanie zgłoszony wyjątek podczas przetwarzania żądania. | 
Przekazywanie dodatkowych danych do funkcji wywołania zwrotnego
Funkcja wywołania zwrotnego żądania jest wywoływana, gdy odpowiedź jest pobierana jako jej pierwszy parametr.
Na przykład -
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)Możesz użyć Request.meta atrybut, jeśli chcesz przekazać argumenty do funkcji, które można wywołać i otrzymać te argumenty w drugim wywołaniu zwrotnym, jak pokazano w poniższym przykładzie -
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 itemUżywanie błędów zwrotnych do wychwytywania wyjątków w przetwarzaniu żądań
Errback to wywoływalna funkcja, która jest wywoływana, gdy zostanie zgłoszony wyjątek podczas przetwarzania żądania.
Poniższy przykład demonstruje to -
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 Special Keys
Klucze specjalne request.meta to lista specjalnych kluczy meta identyfikowanych przez Scrapy.
Poniższa tabela przedstawia niektóre z kluczy Request.meta -
| Sr.No | Klucz i opis | 
|---|---|
| 1 | dont_redirect Jest to klucz, gdy ustawiony na true, nie przekierowuje żądania na podstawie statusu odpowiedzi. | 
| 2 | dont_retry Po ustawieniu wartości true jest kluczem, nie ponawia żądań zakończonych niepowodzeniem i zostanie zignorowany przez oprogramowanie pośredniczące. | 
| 3 | handle_httpstatus_list Jest to klucz definiujący, które kody odpowiedzi na żądanie mogą być dozwolone. | 
| 4 | handle_httpstatus_all Jest to klucz używany do zezwalania na dowolny kod odpowiedzi na żądanie poprzez ustawienie wartości true . | 
| 5 | dont_merge_cookies Jest to klucz używany do uniknięcia łączenia się z istniejącymi plikami cookie poprzez ustawienie wartości true . | 
| 6 | cookiejar Jest to klucz używany do utrzymywania wielu sesji plików cookie na pająka. | 
| 7 | dont_cache Jest to klucz używany do unikania buforowania żądań HTTP i odpowiedzi w każdej polityce. | 
| 8 | redirect_urls Jest to klucz zawierający adresy URL, przez które przechodzą żądania. | 
| 9 | bindaddress Jest to adres IP wychodzącego adresu IP, którego można użyć do wykonania żądania. | 
| 10 | dont_obey_robotstxt Jest to klucz, gdy ma wartość true, nie filtruje żądań zabronionych przez standard wykluczania pliku robots.txt, nawet jeśli włączony jest ROBOTSTXT_OBEY. | 
| 11 | download_timeout Służy do ustawiania limitu czasu (w sekundach) na pająka, na który downloader będzie czekał, zanim upłynie limit czasu. | 
| 12 | download_maxsize Służy do ustawienia maksymalnego rozmiaru (w bajtach) na pająka, który pobierze downloader. | 
| 13 | proxy W obiektach żądań można ustawić serwer proxy, aby ustawić serwer proxy HTTP do korzystania z żądań. | 
Poproś o podklasy
Możesz zaimplementować własne niestandardowe funkcje, tworząc podklasy klasy żądania. Wbudowane podklasy żądań są następujące -
Obiekty FormRequest
Klasa FormRequest obsługuje formularze HTML poprzez rozszerzenie podstawowego żądania. Ma następującą klasę -
class scrapy.http.FormRequest(url[,formdata, callback, method = 'GET', headers, body, 
   cookies, meta, encoding = 'utf-8', priority = 0, dont_filter = False, errback])Poniżej znajduje się parametr -
formdata - Jest to słownik zawierający dane formularza HTML, które są przypisane do treści żądania.
Note - Pozostałe parametry są takie same jak klasa żądania i zostały wyjaśnione w Request Objects Sekcja.
Następujące metody klas są obsługiwane przez FormRequest obiekty oprócz metod żądania -
classmethod from_response(response[, formname = None, formnumber = 0, formdata = None, 
   formxpath = None, formcss = None, clickdata = None, dont_click = False, ...])Poniższa tabela przedstawia parametry powyższej klasy -
| Sr.No | Parametr i opis | 
|---|---|
| 1 | response Jest to obiekt używany do wstępnego wypełniania pól formularza przy użyciu formularza odpowiedzi HTML. | 
| 2 | formname Jest to ciąg znaków, w którym zostanie użyty formularz z atrybutem nazwy, jeśli został określony. | 
| 3 | formnumber Jest to liczba całkowita form, których należy używać, gdy odpowiedź zawiera wiele formularzy. | 
| 4 | formdata Jest to słownik pól w danych formularza używanych do przesłonięcia. | 
| 5 | formxpath Jest to ciąg znaków, jeśli jest określony, używana jest forma pasująca do ścieżki xpath. | 
| 6 | formcss Jeśli jest określony, jest to ciąg znaków, używany jest formularz pasujący do selektora css. | 
| 7 | clickdata Jest to słownik atrybutów używany do obserwowania klikniętej kontrolki. | 
| 8 | dont_click Dane z formularza zostaną przesłane bez klikania żadnego elementu, jeśli ustawione na true. | 
Przykłady
Oto niektóre przykłady użycia żądań -
Using FormRequest to send data via HTTP POST
Poniższy kod ilustruje sposób powrotu FormRequest obiekt, gdy chcesz zduplikować formularz HTML POST w swoim pająku -
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
Zwykle strony internetowe wykorzystują elementy, za pomocą których udostępniają wstępnie wypełnione pola formularzy.
Plik FormRequest.form_response() można użyć, jeśli chcesz, aby te pola były automatycznie wypełniane podczas skrobania.
Poniższy przykład ilustruje to.
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 hereObiekty odpowiedzi
Jest to obiekt wskazujący odpowiedź HTTP, która jest przekazywana pająkom do przetworzenia. Ma następującą klasę -
class scrapy.http.Response(url[, status = 200, headers, body, flags])W poniższej tabeli przedstawiono parametry obiektów Response -
| Sr.No | Parametr i opis | 
|---|---|
| 1 | url Jest to ciąg określający odpowiedź adresu URL. | 
| 2 | status Jest to liczba całkowita zawierająca odpowiedź stanu HTTP. | 
| 3 | headers Jest to słownik zawierający nagłówki odpowiedzi. | 
| 4 | body Jest to łańcuch z treścią odpowiedzi. | 
| 5 | flags Jest to lista zawierająca flagi odpowiedzi. | 
Podklasy odpowiedzi
Możesz zaimplementować własną niestandardową funkcjonalność, tworząc podklasy klasy odpowiedzi. Wbudowane podklasy odpowiedzi są następujące -
TextResponse objects
Obiekty TextResponse są używane dla danych binarnych, takich jak obrazy, dźwięki itp., Które mają możliwość kodowania podstawowej klasy Response. Ma następującą klasę -
class scrapy.http.TextResponse(url[, encoding[,status = 200, headers, body, flags]])Poniżej znajduje się parametr -
encoding - Jest to ciąg z kodowaniem, który jest używany do kodowania odpowiedzi.
Note - Pozostałe parametry są takie same jak klasa odpowiedzi i wyjaśniono je w Response Objects Sekcja.
Poniższa tabela przedstawia atrybuty obsługiwane przez obiekt TextResponse oprócz metod odpowiedzi -
| Sr.No | Atrybut i opis | 
|---|---|
| 1 | text Jest to treść odpowiedzi, do której można uzyskać dostęp wielokrotnie. | 
| 2 | encoding Jest to ciąg zawierający kodowanie odpowiedzi. | 
| 3 | selector Jest to atrybut, którego instancja jest tworzona przy pierwszym dostępie i używa odpowiedzi jako celu. | 
W poniższej tabeli przedstawiono metody obsługiwane przez obiekty TextResponse oprócz metod odpowiedzi -
| Sr.No | Metoda i opis | 
|---|---|
| 1 | xpath (query) Jest to skrót do TextResponse.selector.xpath (zapytanie). | 
| 2 | css (query) Jest to skrót do TextResponse.selector.css (zapytania). | 
| 3 | body_as_unicode() Jest to treść odpowiedzi dostępna jako metoda, do której można uzyskać dostęp wielokrotnie. | 
Obiekty HtmlResponse
Jest to obiekt, który obsługuje kodowanie i automatyczne wykrywanie poprzez sprawdzenie atrybutu meta httpequiv w HTML. Jej parametry są takie same jak w klasie odpowiedzi i zostały wyjaśnione w sekcji Obiekty odpowiedzi. Ma następującą klasę -
class scrapy.http.HtmlResponse(url[,status = 200, headers, body, flags])Obiekty XmlResponse
Jest to obiekt, który obsługuje kodowanie i automatyczne wykrywanie, patrząc na wiersz XML. Jej parametry są takie same jak w klasie odpowiedzi i zostały wyjaśnione w sekcji Obiekty odpowiedzi. Ma następującą klasę -
class scrapy.http.XmlResponse(url[, status = 200, headers, body, flags])