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