美文网首页
2.Scrapy-Item

2.Scrapy-Item

作者: 何阿驼 | 来源:发表于2018-05-31 20:29 被阅读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()
    

    相关文章

      网友评论

          本文标题:2.Scrapy-Item

          本文链接:https://www.haomeiwen.com/subject/hxjcsftx.html