2.Scrapy-Item
2018-05-31 本文已影响0人
何阿驼
Scrapy
文章仅供学习,如有错误,欢迎指出
1.创建项目 scrapy startproject tutorial
2.文件目录
tutorial/
scrapy.cfg #项目的配置文件
tutorial/
__init__.py #声明包
items.py #项目中的item文件,提取字段内容
pipelines.py #项目中的pipeline文件
settings.py #设置文件
spiders/ #你的爬虫专用文件
__init__.py #声名包
...
使用Item整理
Item
对象是自定义的python字典。 您可以使用标准的字典语法来获取到其每个字段的值。(字段即是我们之前用Field赋值的属性):
for i in response('//ul/li'):
item = DmozItem()#引用items.py下的类
item['title'] = i.xpath().extract()
...
yield item
存储爬取到的数据
scrapy crawl spidername -o items.json
Item Pipeline
process_item(self, item, spider)
http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html#process_item
3.定制自己的Items
Item是爬取到的数据的容器,在这里我们可以将自己爬取到的内容定义不同的字段名。再通过parse的方法解析并读取出来放到这里
import scrapy
class DmozItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
desc = scrapy.Field()
如果你学过django 那么item字段一定难不倒你, 你可以创建属于自己的Item类,但是需要继承的时Item类,比如一个网站你想爬取的内容很多,那么你可以定义属于自己的item类,并且用Field去声明。但是他并没有对字段进行分类,当你在之后想要存到数据库时,就需要去修改他的形式。
Item在其他地方的引用
from firstspider.items import DmozItem #引用Item
def parse_artical_text(self,response):
pass
item = bolezaixianSpiderItem()
title = response.css('.grid-8 .entry-header h1::text')[0].extract()
time = response.css('.grid-8 .entry-meta p::text')[0].extract().strip().replace('·','').strip()
theme = response.css('.grid-8 .entry-meta p a::text')[0].extract().strip()
zan = response.css('.grid-8 .post-adds span h10::text')[0].extract()
fav = response.css('.grid-8 .post-adds span::text')[2].extract()
fav_re = re.match('.*?(\d+).*',fav)
if fav_re:
fav = fav_re.group(1)
else:
fav=0
item['title'] = title
item['time'] = time
item['theme'] = theme
item['zan'] = zan
item['fav'] = fav
yield item
这样的处理方式一旦当字段多的时候我们就会使得工作变得复杂,并且不好修改
#通过Item_load来简化我们提取字段的过程
from scrapy.loader import ItemLoader
item_loader = ItemLoader(item=bolezaixianSpiderItem,response=response)
item_loader.add_css('title','.grid-8 .entry-header h1::text')
item_loader.add_xpath('title','//id[@href ="sd"]')
item_loader.add_value('url',response.url)
item_loader.add_value('title',response.title)
这样的操作会让我们容易后期的修改,add_css内只要输入字段名称以及css筛选的代码就可以过滤出来。
但是有时候我们只要取一个值,这时候我们需要在items.py下去筛选。
Field()包含了两种处理方法
from scrapy.loader.processors import MapCompose,TakeFirst
def cut_Item(value): #这里处理我们的接受到的数据
return value+"dsd" #处理数据
class test(scrapy.Item):
title = scrapy.Field(
input_process = MapCompose(cut_Item), #自定义对字段的处理方法
output_process = TakeFirst() #取第一个,但是如果我们的字段过多。这个时候我们可以自定义一个load
)
当然如果我们指向要取第一位数字,我们只要声名一个item类就可以了。
他有四个参数
class ItemLoader(object):
default_item_class = Item
default_input_processor = Identity()
default_output_processor = Identity()
default_selector_class = Selector
def __init__(self, item=None, selector=None, response=None, parent=None, **context):
if selector is None and response is not None:
selector = self.default_selector_class(response)
self.selector = selector
context.update(selector=selector, response=response)
if item is None:
item = self.default_item_class()
self.context = context
self.parent = parent
self._local_item = context['item'] = item
self._local_values = defaultdict(list)
# from scrapy.loader import ItemLoader
#
# class zidingyiItemload(ItemLoader):
# default_output_processor = TakeFirst()