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

  • 相关阅读:
    自动化测试-appium常用元素
    自动化测试-微信小程序
    自动化测试-环境搭建appium for windows
    安全测试-docker搭建sonar完成代码质量检测
    工具安装-pycharm使用已配置的虚拟环境
    安全测试-sonarscanner扫描代码
    工具安装-java集成到maven
    iOS 提升代码的安全性,可以做哪些措施???
    iOS 绘制一个表盘时钟,秒针效果可以“扫秒/游走”
    iOS 关于BTC 一些知识点
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7237436.html
Copyright © 2011-2022 走看看