文档章节

1.itempipeline_scrapy_in_practise

炸鱼薯条
 炸鱼薯条
发布于 2017/09/11 10:42
字数 955
阅读 22
收藏 0
点赞 1
评论 0

1.ItemPipeLine

流程图:

 

see :http://scrapy.readthedocs.io/en/latest/topics/item-pipeline.html

功能:

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。

每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用:

  • 验证爬取的数据(检查item包含某些字段,比如说name字段)

  • 查重(并丢弃)

  • 将爬取结果保存到文件或者数据库中

  • 清洗Html数据

每一个pipeline都是一个简单的python类,但是必须要实现既定的方法,才能启动应有的功能。

# -*- coding: utf-8 -*-
​
​
​
class BaseItemPipeline(object):
​
    def __init__(self):
        pass
​
    # 必须要实现的方法
    # 这个方法每次都会调用,是处理数据逻辑所在,可通过item参数获得到在spider已成功爬去的已封装的数据,
    # 通过不同的返回参数来区别不同的pipeline 流程控制.
    # 返回参数:
    # dict
    # Item(即参数item),或其子类
    # return a Twisted Deferred
    # raise DropItem 异常,以表示该item不需要被之后的pipline处理 即丢弃了改item
    def process_item(self, item, spider):
        # item (Item 对象) – 被爬取的item
        # spider (Spider 对象) – 爬取该item的spider
        # 这个方法必须返回一个 Item 对象,被丢弃的item将不会被之后的pipeline组件所处理。
        return item
​
    #可选实现的方法
    def open_spider(self, spider):
        # spider (Spider 对象) – 被开启的spider
        # 可选实现,当spider被开启时,这个方法被调用。
        pass
​
    # 可选实现的方法
    def close_spider(self, spider):
        # spider (Spider 对象) – 被关闭的spider
        # 可选实现,当spider被关闭时,这个方法被调用
        pass
​
    # 可选实现的方法
    # If present, this classmethod is called to create a pipeline instance from a Crawler.
    # It must return a new instance of the pipeline.
    # Crawler object provides access to all Scrapy core components like settings and signals;
    # it is a way for pipeline to access them and hook its functionality into Scrapy.
    @classmethod
    def from_crawler(cls, crawler):
        pass
​

启用一个pipeline

当完成以上的自定义ItemPipeline之后,需要在setting文件 启动该ItemPipeline.

 

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

这样就在数据处理过程 按照后面的整数按由小到大顺序执行itempipeline了。

顺序值的仅可在0--1000范围取整数。

 

2.例子程序:

 

1.将数据保存为json文件

import json
​
class JsonWriterPipeline(object):
​
    def open_spider(self, spider):
        self.file = open('items.jl', 'w')
​
    def close_spider(self, spider):
        self.file.close()
​
    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item

 

 

2.将数据写入到MongoDB

# 这个例子的主要说明如何使用 类方法from_crawler,并且如何清洗数据。

import pymongo
​
class MongoPipeline(object):
​
    collection_name = 'scrapy_items'
​
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
​
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )
    #打开数据库连接
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    #关闭数据库连接
    def close_spider(self, spider):
        self.client.close()
    #将数据写入数据库
    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item
      

 

3.

这个例子主要说明如何返回一个deferred类。

deferred 类 https://twistedmatrix.com/documents/current/core/howto/defer.html

import scrapy
import hashlib
from urllib.parse import quote
​
​
class ScreenshotPipeline(object):
    """Pipeline that uses Splash to render screenshot of
    every Scrapy item."""
​
    SPLASH_URL = "http://localhost:8050/render.png?url={}"
​
    def process_item(self, item, spider):
        encoded_item_url = quote(item["url"])
        screenshot_url = self.SPLASH_URL.format(encoded_item_url)
        request = scrapy.Request(screenshot_url)
        dfd = spider.crawler.engine.download(request, spider)
        dfd.addBoth(self.return_item, item)
        return dfd
​
    def return_item(self, response, item):
        if response.status != 200:
            # Error happened, return item.
            return item
​
        # Save screenshot to file, filename will be hash of url.
        url = item["url"]
        url_hash = hashlib.md5(url.encode("utf8")).hexdigest()
        filename = "{}.png".format(url_hash)
        with open(filename, "wb") as f:
            f.write(response.body)
​
        # Store filename in item.
        item["screenshot_filename"] = filename
        return item

 

3.总结:

在整个流程中处于item_pipeline 是已成功爬取到数据后对数据验证,清洗,已经保存的功能。

scrapy也有一些现成的pipeline已便使用。

See: https://doc.scrapy.org/en/latest/topics/media-pipeline.html?highlight=Image

  1. Files Pipeline

  2. Image Pipeline

  3. Media Pipeline

 

 

© 著作权归作者所有

共有 人打赏支持
炸鱼薯条
粉丝 0
博文 2
码字总数 2150
作品 0
天津
何时使用log4j的isDebugEnabled属性来进行日志记录?

我经常见到这个问题,到底使不使用idDebugEnabled属性。这个问题经常被争论,而焦点往往是性能。 答案很简单。既然有这个属性,当然是拿来使用的。但是使用的时候需要注意。 例如,在我的代码...

五大三粗 ⋅ 2015/08/25 ⋅ 0

对文本进行pos-tag

我想对文本进行pos-tag import nltk; fileobject = open('E:\practise\Web1T5-Easy-1.1\3grams\3gm-0000.txt') try: for eachline in fileobject: print eachline,; text = nltk.wordtokeniz......

taolin2014 ⋅ 2014/05/28 ⋅ 1

scrapy运行后无结果

我编写了最简单的scrapy脚本如下: # -- coding: utf-8 -- import scrapy class MySpider(scrapy.Spider): 运行后显示如下结果: 2017-07-06 17:46:52 [scrapy.utils.log] INFO: Scrapy 1.4.......

parkmen ⋅ 2017/07/06 ⋅ 1

ERROR: Could not open CONNECT tunnel

Landon Campbell Landon Campbell Email: c***@hotmail.com Posts: 4 Find Posts Threads: 2 Find Threads 11 months ago Permalink Raw Message Report Hi, Pretty new to Scrapy, so forgi......

Airship ⋅ 2016/03/02 ⋅ 0

zg手册 之 scrapy 开发(7)-- 爬虫调试

scrapy 提供的调试方法 scrapy shell 调试选择器 命令行调试 spider web 控制台(运行时) telnet 控制台(运行时查看scrapy对象,检测检测内存泄漏问题) scrapy shell 调试选择器 可以在命...

东昕 ⋅ 2014/05/24 ⋅ 0

python爬虫框架scrapy学习之CrawlSpider

学习任何东西如果有目的性总是更有效率,这里我目的是抓取oschina的博客列表:http://www.oschina.net/blog 这种需要有url跟进的爬虫,scrapy使用CrawlSpider十分方便,CrawlSpider的文档链接...

子夜闻雪 ⋅ 2016/07/26 ⋅ 0

Python Scarpy Crawl Dmoz Settings

AWSACCESSKEY_ID Default: None The AWS access key used by code that requires access to Amazon Web services, such as the S3 feed storage backend. AWSSECRETACCESS_KEY Default: None......

Koala_Bear ⋅ 2012/09/20 ⋅ 0

scrapy 爬虫框架

一图: 二图: 通过命令查看所有的模板 scrapy genspider -l 基本流程: 1.先创建一个项目 scrapy startproject 项目名称 2.进入这个项目 创建(相当于)app,可以创建多个,但是不能重名.scrapy...

AAA年华 ⋅ 02/23 ⋅ 0

关于Qt的类的声明的一个问题

qt中 为什么有的时候需要这样声明 class QAction;为何不直接 #include,我用第一种构建程序的时候,可以成功,用第二种也成功,但是出现了警告:D:QT PRACTISEMyselfWordmyword.h:8: warnin...

xianyu2015 ⋅ 2015/05/10 ⋅ 3

网站爬虫框架库 - Scrapy-Python

scrapy Scrapy:Python的爬虫框架 实例Demo 抓取:汽车之家、瓜子、链家 等数据信息 版本+环境库 Python2.7 + Scrapy1.12 初窥Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的...

蓝黑色时代 ⋅ 2017/10/18 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 33分钟前 ⋅ 0

spring RESTful

spring RESTful官方文档:http://spring.io/guides/gs/rest-service/ 1. 可以这么去理解RESTful:其实就是web对外提供的一种基于URL、URI的资源供给服务。不是一个原理性知识点。是一个方法论...

BobwithB ⋅ 35分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 38分钟前 ⋅ 0

@Conditional派生注解

@Conditional派生注解(Spring注解版原生的@Conditional作用) 作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效; @Conditional扩展注解 作用(判...

小致dad ⋅ 38分钟前 ⋅ 0

适配器模式

适配器模式 对象适配器 通过私有属性来实现的类适配器 通过继承来实现的接口适配器 通过继承一个默认实现的类实现的

Cobbage ⋅ 42分钟前 ⋅ 0

Java 限流策略

概要 在大数据量高并发访问时,经常会出现服务或接口面对暴涨的请求而不可用的情况,甚至引发连锁反映导致整个系统崩溃。此时你需要使用的技术手段之一就是限流,当请求达到一定的并发数或速...

轨迹_ ⋅ 46分钟前 ⋅ 0

GridView和子View之间的间隙

默认的情况下GridView和子View之间会有一个间隙,原因是GridView为了在子View被选中时在子View周围显示一个框。去掉的办法如下: android:listSelector="#0000" 或 setSelector(new ColorDra...

国仔饼 ⋅ 49分钟前 ⋅ 0

idea插件开发

1 刷新页面要使用多线程 2 调试要使用restart bug 不要去关闭调试的idea 否则再次启动会卡住

林伟琨 ⋅ 49分钟前 ⋅ 0

Java 内存模型

物理机并发处理方案 绝大多数计算任务,并不是单纯依赖 cpu 的计算完成,不可避免需要与内存交互,获取数据。内存要拿到数据,需要和硬盘发生 I/O 操作。计算机存储设备与 cpu 之间的处理速度...

长安一梦 ⋅ 56分钟前 ⋅ 0

思路分析 如何通过反射 给 bean entity 对象 的List 集合属性赋值?

其实 这块 大家 去 看 springmvc 源码 肯定可以找到实现办法。 因为 spirngmvc 的方法 是可以 为 对象 参数里面的 list 属性赋值的。 我也没有看 具体的 mvc 源码实现,我这里只是 写一个 简...

之渊 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部