二(1.scrapy)Scrapy--item

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()

你可能感兴趣的:(python)