用过Scrapy一段时间后,发现还是有一些知识不是特别清晰,所以就把 Scrapy tutorial从前往后的部分不清楚的知识总结了一下。
1、 item类的使用
item类就类似于Python中dictionary类一样的容器,所以item类也有dictionary类似的操作【下面使用交互界面】
Creating items
>>> product = Product(name=‘Desktop PC‘, price=1000) >>> print product Product(name=‘Desktop PC‘, price=1000)
Getting field values
>>> product[‘name‘] Desktop PC >>> product.get(‘name‘) Desktop PC >>> product[‘price‘] 1000 >>> product[‘last_updated‘] Traceback (most recent call last): ... KeyError: ‘last_updated‘ >>> product.get(‘last_updated‘, ‘not set‘) not set >>> product[‘lala‘] # getting unknown field Traceback (most recent call last): ... KeyError: ‘lala‘ >>> product.get(‘lala‘, ‘unknown field‘) ‘unknown field‘ >>> ‘name‘ in product # is name field populated? True >>> ‘last_updated‘ in product # is last_updated populated? False >>> ‘last_updated‘ in product.fields # is last_updated a declared field? True >>> ‘lala‘ in product.fields # is lala a declared field? False
Setting field values
>>> product[‘last_updated‘] = ‘today‘ >>> product[‘last_updated‘] today >>> product[‘lala‘] = ‘test‘ # setting unknown field Traceback (most recent call last): ... KeyError: ‘Product does not support field: lala‘
Accessing all populated values
>>> product.keys() [‘price‘, ‘name‘] >>> product.items() [(‘price‘, 1000), (‘name‘, ‘Desktop PC‘)]
还有一些复制,克隆等操作,就略过了···当然,可以用继承的方法来扩展自己写的item类
2、关于回调函数parse
如第一篇中所说的我们从start_urls来获的最开始需要爬取的url,然后用start_requests生成request,然后parse这个函数就会被默认的调用来处理这些request
如果没有重写上面这些函数,那么就会调用基类中的同名函数。
这里需要注意的是,如果使用CrawlSpider作为蜘蛛的基类,因为这个基类中有一个rule方法来规定一些处理链接的法则,那么在这个法则中我们常常也需要指定一个函数来作为回调函数来进行对应的处理。这个时候,这个回调函数不能指定为parse
因为CrawlSpider已经在内在的逻辑中使用到自己定义的parse,所以重写这个函数会破坏程序原有的逻辑,蜘蛛就不会工作了,我们需要自己重新定义一个回调函数,重要的是函数名字不能为parse。
item类是用来存储爬取数据的容器,Item Loaders就是一种填满这些容器的一种机制
当然,这个Item Loaders一般是用在parse这个函数里面,就想下面这样。
from scrapy.contrib.loader import ItemLoader from myproject.items import Product def parse(self, response): l = ItemLoader(item=Product(), response=response) l.add_xpath(‘name‘, ‘//div[@class="product_name"]‘) l.add_xpath(‘name‘, ‘//div[@class="product_title"]‘) l.add_xpath(‘price‘, ‘//p[@id="price"]‘) l.add_css(‘stock‘, ‘p#stock]‘) l.add_value(‘last_updated‘, ‘today‘) # you can also use literal values return l.load_item()
//div[@class="product_name"]
//div[@class="product_title"]
两句话把两个不同地方的数据,加入到了这个name;接下来的两据使用不同的select 的方法来提取数据,另外一种方式就是直接用字面值来填,充,用的方法就是add_value()
经过上面这写过程以后,数据“收集”完毕,接下来就是返回这个已经填充好的item,用的语句就是return ItemLoader.load_item()
4、命令行中怎么保存控制台信息,怎么将爬取item信息存取到JSON文件中
scrapy
crawl 爬虫名--logfile=
日志名
.log
上面这一句就是将控制台中输出的信息存储到日志文件中
scrapy
crawl 爬虫名--logfile=
日志名
.log
-o 输出文件名
.json
-t json
Scrapy会把解析后返回的item序列化为json格式并保存在test.json文件中
5、setting这个文件时怎么起作用的?
刚开始使用Scrapy的时候,发现每个组件貌似都是默认被使用的,只要名字按要求的定义,那么这个组件就会在适当的时候被调用,为什么会这样子呢,其实都是setting这个文件在起作用,setting中利用“宏”来规定每流程中的每一个部分需要使用的组件,当然,我们默认建立的Scrapy工程中的setting文件没有内容,这是因为大多数基本的“宏都有默认值了“,当然我我们想显示的改变这些默认值得时候,就需要在setting文件中写出来。就像下面写的一样
SPIDER_MODULES = [‘dirbot.spiders‘] NEWSPIDER_MODULE = ‘dirbot.spiders‘ DEFAULT_ITEM_CLASS = ‘dirbot.items.Website‘ ITEM_PIPELINES = [‘dirbot.pipelines.FilterWordsPipeline‘]后面的模块式一个工程中定义的模块名字,每行被赋值的大写就是上面所说的”宏“
每个宏的详细定义可以点击:点我
Zope2/Zenoss中通过FTP实现对文件对象的管理,布布扣,bubuko.com
原文:http://blog.csdn.net/eric_sunah/article/details/21535263