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时候,会把列表中一个一个值单独按序传入预处理函数进行操作

  • 相关阅读:
    java 分解质因数
    Unix 文件系统读写时权限校验
    find 命令实战巧用
    Linq分组功能
    三种查看SqlServer中数据物理pge页的方法
    一个高度压缩的bit位图字典的实现
    windbg 命令 gchandles
    ManualResetEvent和AutoResetEvent的区别实例
    一些汇编指令(基于8086)
    windbg sos版本不匹配问题解决
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7237436.html
Copyright © 2011-2022 走看看