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时候,会把列表中一个一个值单独按序传入预处理函数进行操作
scrapy_items的更多相关文章
- Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法
当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为, ...
- scrapy爬取西刺网站ip
# scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...
- Scrapy爬虫框架第七讲【ITEM PIPELINE用法】
ITEM PIPELINE用法详解: ITEM PIPELINE作用: 清理HTML数据 验证爬取的数据(检查item包含某些字段) 去重(并丢弃)[预防数据去重,真正去重是在url,即请求阶段做] ...
- 爬虫基础(五)-----scrapy框架简介
---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...
- MongoDB 及 scrapy 应用
0 1.Scrapy 使用 MongoDB https://doc.scrapy.org/en/latest/topics/item-pipeline.html#write-items-to-mong ...
- scrapy入门与进阶
Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非 ...
- 5、爬虫系列之scrapy框架
一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能 ...
- python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)
一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前S ...
- 四: scrapy爬虫框架
5.爬虫系列之scrapy框架 一 scrapy框架简介 1 介绍 (1) 什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架 ...
随机推荐
- 命令行替代工具 - Cmder配置
Cmder 可搭配使用cmd here ( cmdhere.reg ) 1. 修改config\aliases文件:添加下列几行 l=ls --show-control-chars la=ls - ...
- Visual Studio 中添加SQLite数据源
相关下载:https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki 在Visual Studio中要支持访问SQLi ...
- 登陆模块的进化史,带大家回顾java学习历程(一)
一直在想着写点特别点的东西,让有兴趣学编程的人确实能学到点干货,今天就来随意写写. 大家在网上查找资料看到最多的demo估计就是登陆功能的演示了,为何大家偏爱拿登陆来做demo呢?因为行业应用类程序的 ...
- 【Spring】DispatcherServlet源码分析
使用过HttpServlet的都应该用过其doGet和doPost方法,接下来看看DispatcherServlet对这两个方法的实现(源码在DispatcherServlet的父类Framework ...
- 七牛php-sdk使用-文档处理
所用到的七牛文档转换服务,主要是:ppt文件转为pdf文件,pdf文件转图片(png). 描述一下需求:上传PPT或者PDF文件到七牛,最终转换为图片.文件上传部分的功能已经讲过了,这里说一下转换处理 ...
- ESLint 使用入门 - 来自推酷
在团队协作中,为避免低级 Bug.产出风格统一的代码,会预先制定编码规范.使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量. 在以前的项目中,我们选择 JSHint 和 ...
- JAXB应用实例
过往的项目中数据存储都离不开数据库,不过最近做的一个项目的某些数据(比如人员信息.菜单.权限等等)却完全没有涉及任何数据库操作,直接XML搞定.这里无意比较优劣,因为数据库存储和XML存储本就有不同的 ...
- Codeforces Round #416(Div. 2)-811A.。。。 811B.。。。 811C.dp。。。不会
CodeForces - 811A A. Vladik and Courtesy time limit per test 2 seconds memory limit per test 256 meg ...
- CodeForces801-A.Vicious Keyboard-暴力
A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- hdu_1014(竟然真的还有更水的)
注意输出就没了... #include<cstdio> #include<cstring> using namespace std; int gcd(int a, int b) ...