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.SpiderPoniż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 - 
 | 
| 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 = accessoriesPoniż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.CrawlSpiderPoniż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 itemsXMLFeedSpider
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.XMLFeedSpiderW 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.CSVFeedSpiderW 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 itemSitemapSpider
SitemapSpider z pomocą Sitemaps indeksuje witrynę, znajdując adresy URL z pliku robots.txt. Ma następującą klasę -
class scrapy.spiders.SitemapSpiderW 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 hereNastę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 herePoniż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 hereMoż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...