zoukankan      html  css  js  c++  java
  • scrapy_items

    为什么要items?

           当数据量多的时候,没有统一的数据管理,统一格式化麻烦

    items中除了能添加字段,还能做什么?

      1. 进行预先处理

      2. 对从items出去的数据进行处理

      3. 写上sql语句逻辑

    # -*- coding: utf-8 -*-
    
    import hashlib
    import scrapy
    import re
    from w3lib.html import remove_tags
    from scrapy.loader import ItemLoader
    from scrapy.loader.processors import TakeFirst, Join, MapCompose
    from tools.shared import get_md5, go_remove_tag
    
    
    class AllItemLoader(ItemLoader):
        """
        通过自定义itemloader要求都取列表中第一个值
        """
        default_output_processor = TakeFirst()
    
    
    def get_md5(url):
        """对获取的URL进行md5"""
        m = hashlib.md5()
        m.update(bytes(url, encoding='utf-8'))
        return m.hexdigest()
    
    
    # 把对应的内容,去掉标签、空格、空行
    def go_remove_tag(value):
        content = remove_tags(value)
        return re.sub(r'[	
    s]', '', content)
    
    
    def comeback(value):
        """啥也不干,直接返回"""
        return value
    
    
    class ENet(scrapy.Item):
        article_id = scrapy.Field(
            # 进来的值预处理
            input_processor=MapCompose(get_md5)
        )
        article_url = scrapy.Field()
        title = scrapy.Field()
        content = scrapy.Field(
            input_processor=MapCompose(go_remove_tag),
            # 从items出去的值进行拼接处理
            output_processor=Join('')
        )
        publish_time = scrapy.Field()
        come_form = scrapy.Field(
            # 获得结果还是列表
            output_processor=MapCompose(comeback)
        )
        
        def get_sql(self):
            """获得sql语句和对应的sql填充值"""
            # 获取sql语句
            sql = """insert into
                    e_news(article_id, article_url, title, content, publish_time)
                     VALUE
                     (%s, %s, %s, %s, %s)
                     ON DUPLICATE KEY UPDATE
                     article_url=VALUES(article_url), title=VALUES(title), content=VALUES(content), publish_time=VALUES(publish_time)
                     """
            # 获取sql填充值
            parms = (self['article_id'], self['article_url'], self['title'],
                     self['content'], self['publish_time'])
            return sql, parms
    

      

    注意点:

      对于通过itemloda进行解析的值存放在列表中,传递给items时候,会把列表中一个一个值单独按序传入预处理函数进行操作

  • 相关阅读:
    修改DataSet列名
    对象的比较
    运算符
    安装vs2012详细步骤
    游戏开发-cocos creator踩坑-发布后pc正常,手机加载失败
    cocos creator基础-(十六)自定义的帧动画播放组件(需要优化)
    cocos creator基础-(十七)TexturePacker图集打包
    cocos creator基础-(十五)碰撞检测系统
    cocos creator基础-(十四)cc.widget与屏幕适配
    cocos creator基础-(十三)cc.Loader使用
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7237436.html
Copyright © 2011-2022 走看看