Scrapy - pająki

Opis

Spider to klasa odpowiedzialna za definiowanie sposobu podążania za linkami w witrynie i wyodrębniania informacji ze stron.

Domyślne pająki Scrapy są następujące -

scrapy.Spider

Jest to pająk, po którym muszą dziedziczyć wszystkie inne pająki. Ma następującą klasę -

class scrapy.spiders.Spider

Poniższa tabela przedstawia pola scrapy. Klasa pająka -

Sr.No Pole i opis
1

name

To imię twojego pająka.

2

allowed_domains

Jest to lista domen, po których czołgał się pająk.

3

start_urls

Jest to lista adresów URL, które będą korzeniami dla późniejszych indeksowań, z których pająk zacznie się czołgać.

4

custom_settings

Są to ustawienia, które podczas uruchamiania pająka zostaną nadpisane z konfiguracji całego projektu.

5

crawler

Jest to atrybut powiązany z obiektem Crawler, z którym jest powiązana instancja pająka.

6

settings

To są ustawienia do biegania pająka.

7

logger

Jest to logger Pythona używany do wysyłania komunikatów dziennika.

8

from_crawler(crawler,*args,**kwargs)

Jest to metoda klasowa, która tworzy twojego pająka. Parametry to -

  • crawler - Robot, do którego zostanie przypisana instancja pająka.

  • args(list)- Te argumenty są przekazywane do metody _init_ () .

  • kwargs(dict)- Te argumenty słów kluczowych są przekazywane do metody _init_ () .

9

start_requests()

Gdy nie określono konkretnego adresu URL i pająk jest otwarty do złomowania, Scrapy wywołuje metodę start_requests () .

10

make_requests_from_url(url)

Jest to metoda służąca do konwersji adresów URL na żądania.

11

parse(response)

Ta metoda przetwarza odpowiedź i zwraca odrzucone dane po kolejnych adresach URL.

12

log(message[,level,component])

Jest to metoda, która wysyła komunikat dziennika przez rejestrator pająków.

13

closed(reason)

Ta metoda jest wywoływana, gdy pająk się zamyka.

Argumenty pająka

Argumenty pająka służą do określania początkowych adresów URL i są przekazywane za pomocą polecenia indeksowania z -a opcja, pokazana w następujący sposób -

scrapy crawl first_scrapy -a group = accessories

Poniższy kod pokazuje, jak pająk otrzymuje argumenty -

import scrapy 

class FirstSpider(scrapy.Spider): 
   name = "first" 
   
   def __init__(self, group = None, *args, **kwargs): 
      super(FirstSpider, self).__init__(*args, **kwargs) 
      self.start_urls = ["http://www.example.com/group/%s" % group]

Ogólne pająki

Możesz użyć ogólnych pająków, aby podklasować swoje pająki z. Ich celem jest podążanie za wszystkimi linkami w witrynie na określonych zasadach w celu wyodrębnienia danych ze wszystkich stron.

W przypadku przykładów użytych w poniższych pająkach załóżmy, że mamy projekt z następującymi polami -

import scrapy 
from scrapy.item import Item, Field 
  
class First_scrapyItem(scrapy.Item): 
   product_title = Field() 
   product_link = Field() 
   product_description = Field()

CrawlSpider

CrawlSpider definiuje zestaw reguł podążania za linkami i wycinania więcej niż jednej strony. Ma następującą klasę -

class scrapy.spiders.CrawlSpider

Poniżej przedstawiono atrybuty klasy CrawlSpider -

zasady

Jest to lista obiektów reguł definiujących sposób, w jaki przeszukiwacz podąża za odsyłaczem.

Poniższa tabela przedstawia reguły klasy CrawlSpider -

Sr.No Reguła i opis
1

LinkExtractor

Określa, w jaki sposób pająk podąża za linkami i wyodrębnia dane.

2

callback

Ma być wywoływana po zeskrobaniu każdej strony.

3

follow

Określa, czy kontynuować korzystanie z łączy, czy nie.

parse_start_url (odpowiedź)

Zwraca element lub obiekt żądania, umożliwiając analizę początkowych odpowiedzi.

Note - Pamiętaj, aby podczas pisania reguł zmienić nazwę funkcji analizy na inną niż analiza, ponieważ funkcja analizy jest używana przez CrawlSpider do implementacji jej logiki.

Spójrzmy na poniższy przykład, w którym pająk zaczyna indeksować stronę główną demoexample.com, zbierając wszystkie strony, linki i analizuje za pomocą metody parse_items -

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class DemoSpider(CrawlSpider):
   name = "demo"
   allowed_domains = ["www.demoexample.com"]
   start_urls = ["http://www.demoexample.com"]
      
   rules = ( 
      Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
         callback = "parse_item", follow = True),
   )
   
   def parse_item(self, response):
      item = DemoItem()
      item["product_title"] = response.xpath("a/text()").extract()
      item["product_link"] = response.xpath("a/@href").extract()
      item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
      return items

XMLFeedSpider

Jest to klasa bazowa dla pająków, które zgarniają z kanałów XML i iterują po węzłach. Ma następującą klasę -

class scrapy.spiders.XMLFeedSpider

W poniższej tabeli przedstawiono atrybuty klasy używane do ustawiania iteratora i nazwy znacznika -

Sr.No Atrybut i opis
1

iterator

Definiuje iterator, który ma być używany. Może to być iternodes, html lub xml . Domyślnie są to iternodes .

2

itertag

Jest to ciąg z nazwą węzła do iteracji.

3

namespaces

Jest definiowana przez listę krotek (prefiks, uri), które automatycznie rejestrują przestrzenie nazw przy użyciu metody register_namespace () .

4

adapt_response(response)

Otrzymuje odpowiedź i modyfikuje treść odpowiedzi, gdy tylko nadejdzie z oprogramowania pośredniczącego pająka, zanim pająk zacznie ją analizować.

5

parse_node(response,selector)

Otrzymuje odpowiedź i selektor po wywołaniu dla każdego węzła pasującego do podanej nazwy znacznika.

Note - Twój pająk nie zadziała, jeśli nie zastąpisz tej metody.

6

process_results(response,results)

Zwraca listę wyników i odpowiedzi zwróconych przez pająka.

CSVFeedSpider

Iteruje przez każdy ze swoich wierszy, otrzymuje plik CSV jako odpowiedź i wywołuje metodę parse_row () . Ma następującą klasę -

class scrapy.spiders.CSVFeedSpider

W poniższej tabeli przedstawiono opcje, które można ustawić w odniesieniu do pliku CSV -

Sr.No Opcja i opis
1

delimiter

Jest to ciąg zawierający separator przecinków („,”) dla każdego pola.

2

quotechar

Jest to ciąg znaków zawierający cudzysłów („”) dla każdego pola.

3

headers

Jest to lista wyciągów, z których można wyodrębnić pola.

4

parse_row(response,row)

Otrzymuje odpowiedź i każdy wiersz wraz z kluczem do nagłówka.

Przykład CSVFeedSpider

from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem  

class DemoSpider(CSVFeedSpider): 
   name = "demo" 
   allowed_domains = ["www.demoexample.com"] 
   start_urls = ["http://www.demoexample.com/feed.csv"] 
   delimiter = ";" 
   quotechar = "'" 
   headers = ["product_title", "product_link", "product_description"]  
   
   def parse_row(self, response, row): 
      self.logger.info("This is row: %r", row)  
      item = DemoItem() 
      item["product_title"] = row["product_title"] 
      item["product_link"] = row["product_link"] 
      item["product_description"] = row["product_description"] 
      return item

SitemapSpider

SitemapSpider z pomocą Sitemaps indeksuje witrynę, znajdując adresy URL z pliku robots.txt. Ma następującą klasę -

class scrapy.spiders.SitemapSpider

W poniższej tabeli przedstawiono pola SitemapSpider -

Sr.No Pole i opis
1

sitemap_urls

Lista adresów URL, które chcesz indeksować, wskazujących mapy witryn.

2

sitemap_rules

Jest to lista krotek (regex, callback), gdzie regex jest wyrażeniem regularnym, a callback służy do przetwarzania adresów URL pasujących do wyrażenia regularnego.

3

sitemap_follow

Jest to lista wyrażeń regularnych mapy witryny, których należy przestrzegać.

4

sitemap_alternate_links

Określa alternatywne linki, których należy użyć w przypadku pojedynczego adresu URL.

Przykład SitemapSpider

Następujący SitemapSpider przetwarza wszystkie adresy URL -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"]  
   
   def parse(self, response): 
      # You can scrap items here

Następująca witryna SitemapSpider przetwarza niektóre adresy URL z wywołaniem zwrotnym -

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/sitemap.xml"] 
   
   rules = [ 
      ("/item/", "parse_item"), 
      ("/group/", "parse_group"), 
   ]  
   
   def parse_item(self, response): 
      # you can scrap item here  
   
   def parse_group(self, response): 
      # you can scrap group here

Poniższy kod przedstawia mapy witryn w pliku robots.txt, którego adres URL ma /sitemap_company -

from scrapy.spiders import SitemapSpider

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ] 
   sitemap_follow = ["/sitemap_company"]  
   
   def parse_company(self, response): 
      # you can scrap company here

Możesz nawet łączyć SitemapSpider z innymi adresami URL, jak pokazano w poniższym poleceniu.

from scrapy.spiders import SitemapSpider  

class DemoSpider(SitemapSpider): 
   urls = ["http://www.demoexample.com/robots.txt"] 
   rules = [ 
      ("/company/", "parse_company"), 
   ]  
   
   other_urls = ["http://www.demoexample.com/contact-us"] 
   def start_requests(self): 
      requests = list(super(DemoSpider, self).start_requests()) 
      requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls] 
      return requests 

   def parse_company(self, response): 
      # you can scrap company here... 

   def parse_other(self, response): 
      # you can scrap other here...