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

posted @ 2017-07-26 07:27  梦_鱼  阅读(160)  评论(0编辑  收藏  举报