Heim  >  Artikel  >  Backend-Entwicklung  >  Einführungs-Tutorial zum Scrapy-Crawler 4 Spider (Crawler)

Einführungs-Tutorial zum Scrapy-Crawler 4 Spider (Crawler)

PHPz
PHPzOriginal
2017-04-04 10:35:372754Durchsuche

PythonVersionsverwaltung: pyenv und pyenv-virtualenv
Einführungs-Tutorial zum Scrapy-Crawler 1. Installation und Grundlegende Verwendung
Scrapy-Crawler-Einführungs-Tutorial 2 Offiziell bereitgestellte Demo
Scrapy-Crawler-Einführungs-Tutorial 3 Befehlszeilentool-Einführung und Beispiele
Scrapy-Crawler-Einführungs-Tutorial 4 Spider (Crawler)
Einführungs-Tutorial zum Scrapy Crawler 5 Selektoren (Selektoren)
Einführungs-Tutorial zum Scrapy Crawler 6 Elemente (Projekte)
Einführungs-Tutorial zum Scrapy Crawler 7 Item Loader (Projektlader)
Einführungs-Tutorial zum Scrapy Crawler Tutorial 8 Interaktive Shell für bequemes Debugging
Scrapy-Crawler-Einführungs-Tutorial 9 Item Pipeline (Projektpipeline)
Scrapy-Crawler-Einführungs-Tutorial 10 Feed-Exporte (Exportdateien)
Scrapy-Crawler-Einführungs-Tutorial 11 Anfrage und Antwort (Anfrage und Antwort)
Scrapy-Crawler-Einführungs-Tutorial zwölf Link Extrahierenors (Link-Extraktor)

[toc]

Entwicklungsumgebung:
Python 3.6.0 版本 (derzeit die neueste)
Scrapy 1.3.2 版本 (derzeit die neueste)

Spider

Ein Crawler definiert, wie eine Website (oder eine A-Klasse) gecrawlt wird für eine Gruppe von Websites), einschließlich der Durchführung des Crawlings (d. h. Folgen von Links) und des Extrahierens strukturierter Daten aus ihren Webseiten (d. h. Crawling-Elemente). Mit anderen Worten: Ein Spider ist eine Klasse, die Sie für die Verwendung definieren Eine bestimmte Website (oder in einigen Fällen eine Reihe von Websites) crawlt und analysiert eine Webseite mit einem benutzerdefinierten -Verhalten , wobei

Für den Crawler das Schleife durchläuft etwa Folgendes:

  1. Sie beginnen mit der Generierung erster Anfragen zum Scrapen der ersten URL und geben dann eine Rückruffunktion an, die mit aufgerufen werden soll Von diesen Anfragen heruntergeladene Antworten. > Die erste ausgeführte Anfrage wird durch Aufrufen von start_requests() (standardmäßig) abgerufen. Request generiert die Parse-Methode von

    für die in start_urls angegebene

    -URL und diese Methode dient als Rückruffunktion der Anfrage.

    In der Callback-Funktion analysieren Sie die Antwort (Webseite) und geben ein Objekt mit den extrahierten Daten zurück, ein Item
  2. -Objekt
  3. , ein Request-Objekt oder ein iterierbares dieser Objekte. Diese Anfragen enthalten auch Rückrufe (die identisch sein können), die dann von Scrapy heruntergeladen werden und deren Antworten vom angegebenen Rückruf verarbeitet werden.

    In der Callback-Funktion verwenden Sie normalerweise Selektoren, um den Seiteninhalt zu analysieren (Sie können aber auch Beaut
  4. if
  5. ulSoup, l

    xml verwenden). oder welchen Mechanismus Sie bevorzugen) und generieren Sie das Projekt mit den analysierten Daten.

    Schließlich werden vom Crawler zurückgegebene Elemente normalerweise in einer Datenbank (in einer Elementpipeline) gespeichert oder mithilfe eines Feed-Exports in eine Datei geschrieben.
  6. Auch wenn diese Schleife für (mehr oder weniger) jede Art von Crawler funktioniert, gibt es verschiedene Arten von Standard-Crawlern, die für unterschiedliche Zwecke in Scrapy gebündelt sind. Wir werden hier über diese Typen sprechen.
<a href="http://www.php.cn/wiki/164.html" target="_blank">Klasse<p> scrapy.spiders.Spider</p></a>

Dies ist der einfachste Crawler. Jeder andere Crawler muss <a href="http://www.php.cn/wiki/164.html" target="_blank">class</a> scrapy.spiders.Spiderden Crawler von

erben (einschließlich der mit Scrapy gebündelten Crawler und der Crawler, die Sie selbst schreiben). Es bietet keine besonderen Funktionen. Es stellt einfach eine Standard-

-Implementierung bereit, die Anforderungen vom -Attribut start_requests() sendet und start_urlsspider die -Methode für jede resultierende Antwort aufruft. parsespider

Eine

Zeichenfolgename, die den Namen dieses Crawlers definiert. Der Crawler-Name gibt an, wie der Crawler von Scrapy gefunden (und instanziiert) wird, daher muss er
eindeutig sein . Allerdings hindert Sie nichts daran, mehrere Instanzen desselben Crawlers zu instanziieren. Dies ist das wichtigste Crawler-Attribut und erforderlich. Wenn ein Crawler einen einzelnen Domänennamen crawlt, ist es üblich, den Crawler nach der Domäne zu benennen. So wird beispielsweise ein Crawler, der „mywebsite.com“ crawlt, normalerweise „mywebsite“ genannt.

Hinweis

In Python 2 muss dies ASCII sein. allowed_do<a href="http://www.php.cn/wiki/646.html" target="_blank">Haupt<br>s</a>

erlaubt Eine optionale Liste mit Zeichenfolgen von Domänen, die von diesem Crawler gecrawlt werden. Geben Sie eine Liste zum Crawlen an.

Andereallowed_do<a href="http://www.php.cn/wiki/646.html" target="_blank">main</a>s werden nicht gecrawlt.

Wenn keine spezifische URL angegeben ist, wird eine Liste von URLs angezeigt, die der Crawler mit dem Crawlen beginnt.

custom_<a href="http://www.php.cn/code/8209.html" target="_blank">set</a>tings
Ein Wörterbuch mit Einstellungen, die beim Ausführen dieses Crawlers von der projektweiten Konfiguration überschrieben werden. Es muss als Klassenattribut definiert werden, da die Einstellungen vor der Instanziierung aktualisiert werden.

Eine Liste der verfügbaren integrierten Einstellungen finden Sie unter: Referenz zu integrierten Einstellungen.

crawlerDieses Attribut wird von der Klassenmethode from_crawler() nach der Initialisierung der Klasse gesetzt und verknüpft den Crawler mit dem Objekt, an das diese Crawler-Instanz gebunden ist.

Crawler kapseln viele Komponenten im Projekt für den Einzelzugriffszugriff (z. B. Erweiterungen,

Middleware, Signalmanager usw.). Weitere Informationen finden Sie in der CrawlerAPI.

settings Konfiguration zum Ausführen dieses Crawlers. Dies ist eine Settings-Instanz. Eine ausführliche Einführung in dieses Thema finden Sie unter Settings Themes.

loggerPython-Logger erstellt mit Spider
. Sie können damit Protokollnachrichten senden, wie unter „Einen Crawler protokollieren“ beschrieben. name

(Crawler, from_crawler args, * kwargs) ist die Klassenmethode, die Scrapy zum Erstellen von Crawlern verwendet.

Möglicherweise müssen Sie dies nicht direkt überschreiben, da die Standardimplementierung als Proxy für die Methode fungiert und

sie mit den angegebenen Argumentargumenten und benannten Argumentkwargs aufruft. init()

Trotzdem legt diese Methode die Crawler- und Einstellungseigenschaften in der neuen Instanz fest, sodass später im Crawler auf sie zugegriffen werden kann.

  • Parameter:

    • Crawler (Crawlerinstance) – Der Crawler, an den der Crawler gebunden wird

    • args (list) – Argumente, die an die Methode

      init() übergeben werden.

    • kwargs (dict) – werden an die Methode

      init() Schlüsselwortargumente für die Methode

Diese Methode muss eine Iterable der ersten Anforderung zum Crawlen dieses Crawlers zurückgeben. start_requests()
Mit start_requests() wird start_urls nicht geschrieben und ist nutzlos, selbst wenn es geschrieben wird.

Die Standardimplementierung ist: start_urls, aber die Methode start_requests kann überschrieben werden.

Wenn Sie den Vorgang beispielsweise durch die Anmeldung mit einer

POST-Anfrage
initiieren müssen, können Sie Folgendes tun:

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        return [scrapy.FormRequest("http://www.example.com/login",
                                   formdata={'user': 'john', 'pass': 'secret'},
                                   callback=self.logged_in)]

    def logged_in(self, response):
        # here you would extract links to follow and return Requests for
        # each of them, with another callback
        pass

Eine Methode, die eine URL empfängt und gibt eine Methode zum Abrufen eines Request-Objekts (oder einer Request-Objektliste) zurück. Diese Methode wird zum Erstellen der ersten Anfrage innerhalb der start_requests()-Methode verwendet und wird normalerweise zum Konvertieren von URLs in Anfragen verwendet. make_requests_from_url(url)
Sofern diese Methode nicht überschrieben wird, gibt sie Anfragen mit der parse()-Methode als Rückruffunktion und dem aktivierten dont_filter-Parameter zurück (weitere Informationen finden Sie in der Request-Klasse).

Dies ist Scrapys Standardrückruf für die Verarbeitung heruntergeladener Antworten, wenn in der Anfrage kein Rückruf angegeben ist. parse(response)
Die Parse-Methode ist für die Verarbeitung der Antwort und die Rückgabe der gecrawlten Daten oder weiterer URLs verantwortlich. Für andere Anforderungsrückrufe gelten dieselben Anforderungen wie für die Spider-Klasse.

Diese Methode und alle anderen Anforderungsrückrufe müssen eine Iterable von Request- und Diktat- oder Item-Objekten zurückgeben.

    Parameter:
    • Antwort (Antwort) – die analysierte Antwort

Wrapper zum Senden von Protokollnachrichten an den Logger über den Crawler unter Wahrung der Abwärtskompatibilität. Weitere Informationen finden Sie unter Protokollierung von Spider aus. log(message[, level, component])

Wird gerufen, wenn der Crawler schließt. Diese Methode bietet eine Verknüpfung zu signales.connect() für das Signal „spider_closed“. closed(reason)
Sehen wir uns ein Beispiel an:

Mehrere Anfragen und Elemente von einem einzigen Rückruf zurückgeben:
import scrapy


class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        self.logger.info('A response from %s just arrived!', response.url)

Sie können start_requests() direkt verwenden, während nicht start_urls; Das Projekt kann Daten bequemer abrufen:
import scrapy

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = [
        'http://www.example.com/1.html',
        'http://www.example.com/2.html',
        'http://www.example.com/3.html',
    ]

    def parse(self, response):
        for h3 in response.xpath('//h3').extract():
            yield {"title": h3}

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)

Spider-Argumente
import scrapy
from myproject.items import MyItem

class MySpider(scrapy.Spider):
    name = 'example.com'
    allowed_domains = ['example.com']

    def start_requests(self):
        yield scrapy.Request('http://www.example.com/1.html', self.parse)
        yield scrapy.Request('http://www.example.com/2.html', self.parse)
        yield scrapy.Request('http://www.example.com/3.html', self.parse)

    def parse(self, response):
        for h3 in response.xpath('//h3').extract():
            yield MyItem(title=h3)

        for url in response.xpath('//a/@href').extract():
            yield scrapy.Request(url, callback=self.parse)

Der Crawler kann Parameter empfangen, die sein Verhalten ändern. Crawler-Parameter werden häufig verwendet, um eine Start-URL zu definieren oder das Crawling auf bestimmte Teile der Website zu beschränken. Sie können jedoch auch zum Konfigurieren aller Funktionen des Crawlers verwendet werden.

Der Spider-Crawl-Parameter wird über den Befehl mit der Option -a übergeben. Beispiel:

scrapy crawl myspider -a category=electronicsCrawler können auf Parameter in ihrer

init

-Methode zugreifen:

Standard
import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def init(self, category=None, *args, **kwargs):
        super(MySpider, self).init(*args, **kwargs)
        self.start_urls = ['http://www.example.com/categories/%s' % category]
        # ...
init

Die Methode übernimmt alle Crawler-Parameter und kopiert sie als Eigenschaften in den Crawler. Das obige Beispiel könnte auch wie folgt geschrieben werden:

Denken Sie daran, dass der Spider-Parameter nur eine Zeichenfolge ist. Der Crawler führt keine eigenständige Analyse durch. Wenn Sie die start_urls-Eigenschaft über die Befehlszeile festlegen möchten, müssen Sie sie selbst als Liste analysieren, indem Sie beispielsweise ast.literal_eval oder
import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'

    def start_requests(self):
        yield scrapy.Request('http://www.example.com/categories/%s' % self.category)
json

.loads verwenden, und sie dann als Eigenschaft festlegen. Andernfalls iterieren Sie am Ende über eine start_urls-Zeichenfolge (eine sehr häufige Python-Falle), wodurch jedes Zeichen als separate URL behandelt wird.

有效的用例是设置使用的http验证凭据HttpAuthMiddleware 或用户代理使用的用户代理UserAgentMiddleware:
scrapy crawl myspider -a http_user=myuser -a http_pass=mypassw<a href="http://www.php.cn/wiki/1360.html" target="_blank">ord</a> -a user_agent=mybot

Spider参数也可以通过Scrapyd schedule.jsonAPI 传递。请参阅Scrapyd文档。


通用爬虫

Scrapy附带一些有用的通用爬虫,你可以使用它来子类化你的爬虫。他们的目的是为一些常见的抓取案例提供方便的功能,例如根据某些规则查看网站上的所有链接,从站点地图抓取或解析XML / CSV Feed。

对于在以下爬虫中使用的示例,我们假设您有一个TestItemmyproject.items模块中声明的项目:

import scrapy

class TestItem(scrapy.Item):
    id = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()

抓取爬虫

类 scrapy.spiders.CrawlSpider
这是最常用的爬行常规网站的爬虫,因为它通过定义一组规则为下列链接提供了一种方便的机制。它可能不是最适合您的特定网站或项目,但它是足够通用的几种情况,所以你可以从它开始,根据需要覆盖更多的自定义功能,或只是实现自己的爬虫。

除了从Spider继承的属性(你必须指定),这个类支持一个新的属性:

rules
它是一个(或多个)Rule对象的列表。每个都Rule定义了抓取网站的某种行为。规则对象如下所述。如果多个规则匹配相同的链接,则将根据它们在此属性中定义的顺序使用第一个。

这个爬虫还暴露了可覆盖的方法:

parse_start_url(response)
对于start_urls响应调用此方法。它允许解析初始响应,并且必须返回Item对象,Request对象或包含任何对象的迭代器。

抓取规则

class scrapy.spiders.Rule(link_extractor,callback = None,cb_kwargs = None,follow = None,process_links = None,process_request = None )
link_extractor是一个链接提取程序对象,它定义如何从每个爬网页面提取链接。

callback是一个可调用的或字符串(在这种情况下,将使用具有该名称的爬虫对象的方法),以便为使用指定的link_extractor提取的每个链接调用。这个回调接收一个响应作为其第一个参数,并且必须返回一个包含Item和 Request对象(或它们的任何子类)的列表。

警告
当编写爬网爬虫规则时,避免使用parse作为回调,因为CrawlSpider使用parse方法本身来实现其逻辑。所以如果你重写的parse方法,爬行爬虫将不再工作。

cb_kwargs 是包含要传递给回调函数的关键字参数的dict。

follow是一个布尔值,它指定是否应该从使用此规则提取的每个响应中跟踪链接。如果callbackNone follow默认为True,否则默认为False

process_links是一个可调用的或一个字符串(在这种情况下,将使用具有该名称的爬虫对象的方法),将使用指定从每个响应提取的每个链接列表调用该方法link_extractor。这主要用于过滤目的。

process_request 是一个可调用的或一个字符串(在这种情况下,将使用具有该名称的爬虫对象的方法),它将被此规则提取的每个请求调用,并且必须返回一个请求或无(过滤出请求) 。

抓取爬虫示例

现在让我们来看一个CrawlSpider的例子:

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

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        # Extract links matching 'category.php' (but not matching 'subsection.php')
        # and follow links from them (since no callback means follow=True by default).
        Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        item = scrapy.Item()
        item['id'] = response.xpath('//td[@id="item_id"]/text()').re(r'ID: (\d+)')
        item['name'] = response.xpath('//td[@id="item_name"]/text()').extract()
        item['description'] = response.xpath('//td[@id="item_description"]/text()').extract()
        return item

这个爬虫会开始抓取example.com的主页,收集类别链接和项链接,用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并将Item使用它填充。

XMLFeedSpider

class scrapy.spiders.XMLFeedSpider
XMLFeedSpider设计用于通过以特定节点名称迭代XML订阅源来解析XML订阅源。迭代器可以选自:iternodes,xml和html。iternodes为了性能原因,建议使用迭代器,因为xml和迭代器html一次生成整个DOM为了解析它。但是,html当使用坏标记解析XML时,使用作为迭代器可能很有用。

要设置迭代器和标记名称,必须定义以下类属性:

  • iterator
    定义要使用的迭代器的字符串。它可以是:

    • 'iternodes' - 基于正则表达式的快速迭代器

    • 'html'- 使用的迭代器Selector。请记住,这使用DOM解析,并且必须加载所有DOM在内存中,这可能是一个大饲料的问题

    • 'xml'- 使用的迭代器Selector。请记住,这使用DOM解析,并且必须加载所有DOM在内存中,这可能是一个大饲料的问题
      它默认为:'iternodes'

itertag
一个具有要迭代的节点(或元素)的名称的字符串。示例:
itertag = 'product'

namespaces
定义该文档中将使用此爬虫处理的命名空间的元组列表。在 与将用于自动注册使用的命名空间 的方法。(prefix, uri)prefixuriregister_namespace()

然后,您可以在属性中指定具有命名空间的itertag 节点。

例:

class YourSpider(XMLFeedSpider):

    namespaces = [('n', 'http://www.sitemaps.org/schemas/sitemap/0.9')]
    itertag = 'n:url'
    # ...

除了这些新的属性,这个爬虫也有以下可重写的方法:

adapt_response(response)
一种在爬虫开始解析响应之前,在响应从爬虫中间件到达时立即接收的方法。它可以用于在解析之前修改响应主体。此方法接收响应并返回响应(它可以是相同的或另一个)。

parse_node(response, selector)
对于与提供的标记名称(itertag)匹配的节点,将调用此方法。接收Selector每个节点的响应和 。覆盖此方法是必需的。否则,你的爬虫将不工作。此方法必须返回一个Item对象,一个 Request对象或包含任何对象的迭代器。

process_results(response, results)
对于由爬虫返回的每个结果(Items or Requests),将调用此方法,并且它将在将结果返回到框架核心之前执行所需的任何最后处理,例如设置项目ID。它接收结果列表和产生那些结果的响应。它必须返回结果列表(Items or Requests)。

XMLFeedSpider示例

这些爬虫很容易使用,让我们看一个例子:

from scrapy.spiders import XMLFeedSpider
from myproject.items import TestItem

class MySpider(XMLFeedSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/feed.xml']
    iterator = 'iternodes'  # This is actually unnecessary, since it's the default value
    itertag = 'item'

    def parse_node(self, response, node):
        self.logger.info('Hi, this is a <%s> node!: %s', self.itertag, ''.join(node.extract()))

        item = TestItem()
        item['id'] = node.xpath('@id').extract()
        item['name'] = node.xpath('name').extract()
        item['description'] = node.xpath('description').extract()
        return item

基本上我们做的是创建一个爬虫,从给定的下载一个start_urls,然后遍历每个item标签,打印出来,并存储一些随机数据Item。

CSVFeedSpider

class scrapy.spiders.CSVF
这个爬虫非常类似于XMLFeedSpider,除了它迭代行,而不是节点。在每次迭代中调用的方法是parse_row()。

delimiter
CSV文件中每个字段的带分隔符的字符串默认为','(逗号)。

quotechar
CSV文件中每个字段的包含字符的字符串默认为'"'(引号)。

<a href="http://www.php.cn/html/html-HEAD-2.html" target="_blank">head</a>ers
文件CSV Feed中包含的行的列表,用于从中提取字段。

parse_row(response, row)
使用CSV文件的每个提供(或检测到)标头的键接收响应和dict(表示每行)。这个爬虫还给予机会重写adapt_response和process_results方法的前和后处理的目的。

CSVFeedSpider示例

让我们看一个类似于前一个例子,但使用 CSVFeedSpider:

from scrapy.spiders import CSVFeedSpider
from myproject.items import TestItem

class MySpider(CSVFeedSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com/feed.csv']
    delimiter = ';'
    quotechar = "'"
    headers = ['id', 'name', 'description']

    def parse_row(self, response, row):
        self.logger.info('Hi, this is a row!: %r', row)

        item = TestItem()
        item['id'] = row['id']
        item['name'] = row['name']
        item['description'] = row['description']
        return item

SitemapSpider

class scrapy.spiders.SitemapSpider
SitemapSpider允许您通过使用Sitemaps发现网址来抓取网站。

它支持嵌套Sitemap和从robots.txt发现Sitemap网址 。

sitemap_urls
指向您要抓取的网址的网站的网址列表。

您还可以指向robots.txt,它会解析为从中提取Sitemap网址。

sitemap_rules
元组列表其中:(regex, callback)

  • regex是与从Sitemap中提取的网址相匹配的正则表达式。 regex可以是一个str或一个编译的正则表达式对象

  • callback是用于处理与正则表达式匹配的url的回调。callback可以是字符串(指示蜘蛛方法的名称)或可调用的。

例如:
sitemap_rules = [('/product/', 'parse_product')]

规则按顺序应用,只有匹配的第一个将被使用。
如果省略此属性,则会在parse回调中处理在站点地图中找到的所有网址。

sitemap_follow
应遵循的网站地图的正则表达式列表。这只适用于使用指向其他Sitemap文件的Sitemap索引文件的网站。

默认情况下,将跟踪所有网站地图。

sitemap_alternate_links
指定是否url应遵循一个备用链接。这些是在同一个url块中传递的另一种语言的同一网站的链接。

例如:

<url>
    <loc>http://example.com/</loc>
    <xhtml:link rel="alternate" hreflang="de" href="http://example.com/de"/>
</url>

使用sitemap_alternate_linksset,这将检索两个URL。随着 sitemap_alternate_links禁用,只有http://example.com/将进行检索。

默认为sitemap_alternate_links禁用。

SitemapSpider示例

最简单的示例:使用parse回调处理通过站点地图发现的所有网址 :

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/sitemap.xml']

    def parse(self, response):
        pass # ... scrape item here ...

使用某个回调处理一些网址,并使用不同的回调处理其他网址:

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/sitemap.xml']
    sitemap_rules = [
        ('/product/', 'parse_product'),
        ('/category/', 'parse_category'),
    ]

    def parse_product(self, response):
        pass # ... scrape product ...

    def parse_category(self, response):
        pass # ... scrape category ...

关注robots.txt文件中定义的sitemaps,并且只跟踪其网址包含/sitemap_shop以下内容的Sitemap :

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/robots.txt']
    sitemap_rules = [
        ('/shop/', 'parse_shop'),
    ]
    sitemap_follow = ['/sitemap_shops']

    def parse_shop(self, response):
        pass # ... scrape shop here ...

将SitemapSpider与其他来源网址结合使用:

from scrapy.spiders import SitemapSpider

class MySpider(SitemapSpider):
    sitemap_urls = ['http://www.example.com/robots.txt']
    sitemap_rules = [
        ('/shop/', 'parse_shop'),
    ]

    other_urls = ['http://www.example.com/about']

    def start_requests(self):
        requests = list(super(MySpider, self).start_requests())
        requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
        return requests

    def parse_shop(self, response):
        pass # ... scrape shop here ...

    def parse_other(self, response):
        pass # ... scrape other here ...

       

Das obige ist der detaillierte Inhalt vonEinführungs-Tutorial zum Scrapy-Crawler 4 Spider (Crawler). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn