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