Scrapy 普通的Spider(二)

2021-08-10 05:53:41 字數 2194 閱讀 9012

這個spider是用於解析xml的,它可以通過指定的節點迭代的解析xml。迭代器可以選擇iternodes,xml或html。由於xml和html都需要一次性讀取整個dom然後才能解析xml,這樣會有效能的問題,所以推薦使用iternodes迭代器。但是當解析有錯誤標記的xml時,使用html迭代器會有些幫助。

使用xmlfeedspider必須定義以下類屬性來設定迭代器和標籤名:iterator使用的迭代器。它的值可以是:

- 『iternodes』 - 基於正規表示式的乙個快速的迭代器。

- 『html』 - 使用selector的乙個迭代器。它使用的是dom解析,必須將所有的dom載入記憶體中,這樣對比較大的xml可能會是乙個問題。

- 『xml』 - 使用selector的乙個迭代器。它使用的是dom解析,必須將所有的dom載入記憶體中,這樣對比較大的xml可能會是乙個問題。

預設的值是iternodes。

itertag

將要迭代的節點(或元素)的名字。如:

itertag = 'product'
namespaces

乙個(prefix, uri)的元組,定義了spider將處理的檔案中可以使用的命名空間。元組中的prefix和uri會使用register_namespace方法自動註冊命名空間。

itertag屬性的值可以使用指定節點(或元素)的命名空間來賦值。如:

class

yourspider

(xmlfeedspider):

namespaces = [('n', '')]

itertag = 'n:url'

# ...

除了這些新屬性,還有以下可以重寫的方法:

adapt_response(response)

在spider開始解析response之前,當response從spider的中介軟體剛返回時,接收response的乙個方法。可以用來在解析response之前修改response的內容,該方法必須返回乙個response。

parse_node(response, selector)

對與提供的標籤名匹配的節點(或元素)呼叫該方法。接收response和selector,必須重寫這個方法,不然spider不會工作。該方法必須返回乙個item物件或request物件或包含前兩者任意乙個的可迭代物件。

**process_results(response, results)

對spider返回的每乙個結果(item或request)呼叫該方法,其目的是在結果返回給框架的核心之前做最後的處理,例如設定item的id。它接收結果的列表和response,必須返回乙個結果的列表(items或requests)

example:

from scrapy.spiders import xmlfeedspider

from myproject.items import testitem

class

myspider

(xmlfeedspider):

name = 'example.com'

allowed_domains = ['example.com']

start_urls = ['']

iterator = 'iternodes'

# this is actually unnecessary, since it's the default value

itertag = 'item'

defparse_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

Scrapy之Spider的用法

spider是定義乙個特定站點 或一組站點 如何被抓取的類,包括如何執行抓取 即跟蹤鏈結 以及如何從頁面中提取結構化資料 即抓取項 也就是說我們要抓取的 的鏈結配置 抓取邏輯 解析邏輯等其實都是在 spider 中定義的 spider 的整個爬取迴圈過程如下 我們定義的 spider 是繼承自 sc...

讓Scrapy的Spider更通用

scrapy的架構初探 一文所講的spider是整個架構中最定製化的乙個部件,spider負責把網頁內容提取出來,而不同資料採集目標的內容結構不一樣,幾乎需要為每一類網頁都做定製。我們有個設想 是否能做乙個比較通用的spider,把定製部分再進一步隔離出去?gooseeker有乙個爬蟲群模式,從技術...

scrapy 監控spider啟動和關閉

from scrapy.xlib.pydispatch import dispatcher from scrapy import signals from scrapy.exceptions import dropitem class duplicatespipeline object def in...