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 -
|
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...