Heim > Artikel > Backend-Entwicklung > Einführungs-Tutorial zum Scrapy-Crawler 4 Spider (Crawler)
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)
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:
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 Itemxml 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.<a href="http://www.php.cn/wiki/164.html" target="_blank">Klasse<p> scrapy.spiders.Spider</p></a>
<a href="http://www.php.cn/wiki/164.html" target="_blank">class</a> scrapy.spiders.Spider
den Crawler von -Implementierung bereit, die Anforderungen vom -Attribut start_requests()
sendet und start_urlsspider
die -Methode für jede resultierende Antwort aufruft. parse
spider
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>
Andereallowed_do<a href="http://www.php.cn/wiki/646.html" target="_blank">main</a>s
werden nicht gecrawlt.
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.
crawler
Dieses 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.
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.
logger
Python-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.
sie mit den angegebenen Argumentargumenten und benannten Argumentkwargs aufruft. init()
init() übergeben werden.
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 einerPOST-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.
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:
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 Spider-Crawl-Parameter wird über den Befehl mit der Option -a übergeben. Beispiel:
scrapy crawl myspider -a category=electronics
Crawler können auf Parameter in ihrer
-Methode zugreifen:
Standardimport 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 oderimport 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: Spider参数也可以通过Scrapyd schedule.jsonAPI 传递。请参阅Scrapyd文档。 Scrapy附带一些有用的通用爬虫,你可以使用它来子类化你的爬虫。他们的目的是为一些常见的抓取案例提供方便的功能,例如根据某些规则查看网站上的所有链接,从站点地图抓取或解析XML / CSV Feed。 对于在以下爬虫中使用的示例,我们假设您有一个 除了从Spider继承的属性(你必须指定),这个类支持一个新的属性: 这个爬虫还暴露了可覆盖的方法: 警告 现在让我们来看一个CrawlSpider的例子: 这个爬虫会开始抓取example.com的主页,收集类别链接和项链接,用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并将Item使用它填充。 要设置迭代器和标记名称,必须定义以下类属性: 然后,您可以在属性中指定具有命名空间的itertag 节点。 例: 除了这些新的属性,这个爬虫也有以下可重写的方法: 这些爬虫很容易使用,让我们看一个例子: 基本上我们做的是创建一个爬虫,从给定的下载一个start_urls,然后遍历每个item标签,打印出来,并存储一些随机数据Item。 让我们看一个类似于前一个例子,但使用 CSVFeedSpider: 它支持嵌套Sitemap和从robots.txt发现Sitemap网址 。 您还可以指向robots.txt,它会解析为从中提取Sitemap网址。 regex是与从Sitemap中提取的网址相匹配的正则表达式。 regex可以是一个str或一个编译的正则表达式对象。 callback是用于处理与正则表达式匹配的url的回调。callback可以是字符串(指示蜘蛛方法的名称)或可调用的。 例如: 规则按顺序应用,只有匹配的第一个将被使用。 默认情况下,将跟踪所有网站地图。 例如: 使用 默认为 最简单的示例:使用parse回调处理通过站点地图发现的所有网址 : 使用某个回调处理一些网址,并使用不同的回调处理其他网址: 关注robots.txt文件中定义的sitemaps,并且只跟踪其网址包含 将SitemapSpider与其他来源网址结合使用: 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
通用爬虫
TestItem
在myproject.items
模块中声明的项目:import scrapy
class TestItem(scrapy.Item):
id = scrapy.Field()
name = scrapy.Field()
description = scrapy.Field()
抓取爬虫
类 scrapy.spiders.CrawlSpider
这是最常用的爬行常规网站的爬虫,因为它通过定义一组规则为下列链接提供了一种方便的机制。它可能不是最适合您的特定网站或项目,但它是足够通用的几种情况,所以你可以从它开始,根据需要覆盖更多的自定义功能,或只是实现自己的爬虫。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
是一个布尔值,它指定是否应该从使用此规则提取的每个响应中跟踪链接。如果callback
是None follow
默认为True
,否则默认为False
。process_links
是一个可调用的或一个字符串(在这种情况下,将使用具有该名称的爬虫对象的方法),将使用指定从每个响应提取的每个链接列表调用该方法link_extractor
。这主要用于过滤目的。process_request
是一个可调用的或一个字符串(在这种情况下,将使用具有该名称的爬虫对象的方法),它将被此规则提取的每个请求调用,并且必须返回一个请求或无(过滤出请求) 。抓取爬虫示例
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
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()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
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示例
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_urls
指向您要抓取的网址的网站的网址列表。sitemap_rules
元组列表其中:(regex, 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示例
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 ...
/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 ...
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!