使用Scrapy对新闻进行爬虫(一)

原创 2016年08月29日 04:06:34

Scrapy Item Pipeline学习笔记

Item Pipeline 主要用于从网页抓取(spider)后对数据Item进行收集,写入数据库或文件中。

执行方式

spider 在获得item后,会传递给item pipeline,进行后续数据收集工作。
在setting中对item pipeline类路径进行配置,scrapy框架会调用该item pipeline类,为了正确调用,
item pipeline类必须按照框架要求实现一些方法。使用者只需关注实现这些方法即可。

例子

下面文件实现了一个简单的item pipeline类,对抓取的新闻数据进行进一步处理并写入文件中。这些方法的功能见注释。
1. 文件:pipelines.py

注意事项:
1. 初始化函数实现非常自由,无需限定参数,只需保证from_crawler类方法能够调用该初始化函数生成相应的实例及可。
2. 框架所使用方法声明参数固定。(保证框架能够正确调用)

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class News2FileFor163Pipeline(object):
    """
    pipeline: process items given by spider
    """

    def __init__(self, filepath, filename):
        """
        init for the pipeline class
        """
        self.fullname = filepath + '/' + filename
        self.id = 0
        return

    def process_item(self, item, spider):
        """
        process each items from the spider.
        example: check if item is ok or raise DropItem exception.
        example: do some process before writing into database.
        example: check if item is exist and drop.
        """
        for element in ("url","source","title","editor","time","content"):
            if item[element] is None:
                raise DropItem("invalid items url: %s" % str(item["url"]))
        self.fs.write("news id: %s" % self.id)
        self.fs.write("\n")
        self.id += 1
        self.fs.write("url: %s" % item["url"][0].strip().encode('UTF-8'))
        self.fs.write("\n")
        self.fs.write("source: %s" % item["source"][0].strip().encode('UTF-8'))
        self.fs.write("\n")
        self.fs.write("title: %s" % item["title"][0].strip().encode('UTF-8'))
        self.fs.write("\n")
        self.fs.write("editor: %s" % item["editor"][0].strip().
                      encode('UTF-8').split(':')[1])
        self.fs.write("\n")
        time_string = item["time"][0].strip().split()
        datetime = time_string[0] + ' ' + time_string[1]
        self.fs.write("time: %s" % datetime.encode('UTF-8'))
        self.fs.write("\n")
        content = ""
        for para in item["content"]:
            content += para.strip().replace('\n', '').replace('\t', '')
        self.fs.write("content: %s" % content.encode('UTF-8'))
        self.fs.write("\n")
        return item

    def open_spider(self, spider):
        """
        called when spider is opened.
        do something before pipeline is processing items.
        example: do settings or create connection to the database.
        """
        self.fs = open(self.fullname, 'w+')
        return

    def close_spider(self, spider):
        """
        called when spider is closed.
        do something after pipeline processing all items.
        example: close the database.
        """
        self.fs.flush()
        self.fs.close()
        return

    @classmethod
    def from_crawler(cls, crawler):
        """
        return an pipeline instance.
        example: initialize pipeline object by crawler's setting and components.
        """
        return cls(crawler.settings.get('ITEM_FILE_PATH'),
                   crawler.settings.get('ITEM_FILE_NAME'))
  1. 抓取project中settting.py的相关配置代码
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    'NewsSpiderMan.pipelines.News2FileFor163Pipeline': 300,
}

进一步需求

如果抓取数据的内容非常多,使用item pipeline 对数据处理并写入数据库中乃王道。

使用Scrapy对新闻进行爬虫(零)

Scrapy学习笔记目标使用Scrapy爬虫框架对获取网站新闻数据。爬虫目标网站:http://tech.163.com 提取内容: url 新闻地址 source 新闻来源 tit...
  • chensilly8888
  • chensilly8888
  • 2016年09月01日 13:55
  • 1417

基于python Scrapy的爬虫——爬取某网站新闻内容

【完整源码】https://github.com/beng0305/ThirtySixSpider 【环境】python 2.7 scrapy 1.4 PhantomJS Pyodbc sqlserv...
  • humanbeng
  • humanbeng
  • 2017年07月27日 15:09
  • 1259

scrapy源码分析(七)------------ Crawler

上一节讲了CrawlProcess的实现,讲了一个CrawlProcess可以控制多个Crawler来同时进行多个爬取任务,CrawlProcess通过调用Crawler的crawl方法来进行爬取,并...
  • happyAnger6
  • happyAnger6
  • 2016年12月04日 22:50
  • 4653

crawler4j源码分析(一)CrawlController和WebCrawler

crawler4j是google的
  • lvvista
  • lvvista
  • 2014年07月09日 09:58
  • 2493

Scrapy网络爬虫框架实战[以腾讯新闻网为例]

目录引言 待爬的url 框架架构 items的编写 Spider的编写 存储pipelines的编写 相关配置settings的编写 main方法的编写 运行结果展示引言关于Scrapy的相关介绍及豆...
  • qy20115549
  • qy20115549
  • 2016年09月27日 10:42
  • 4869

利用scrapy爬取新浪体育新闻的小例子

1、新建项目scrapy startproject tutorial整体结构如下 2、修改items# -*- coding: utf-8 -*-# Define here the models ...
  • shizhengxin123
  • shizhengxin123
  • 2017年05月27日 17:39
  • 1601

scrapy爬虫的搭建过程(实战篇)

scrapy爬虫的搭建过程(实战篇) 1. 爬虫功能 以 http://bbs.fengniao.com/forum/forum_125_1_lastpost.html 为起始页,爬取前十页...
  • zwq912318834
  • zwq912318834
  • 2018年02月08日 14:40
  • 372

scrapy爬虫不会被禁止

根据scrapy官方文档: http://doc.scrapy.org/en/master/topics/practices.html#avoiding-getting-banned 里面的描述,要防...
  • chang___hong
  • chang___hong
  • 2017年03月26日 17:05
  • 167

使用Scrapy对新闻进行爬虫(二)

Scrapy Item学习笔记scrapy框架下的Item用于定义抓取的数据内容。实现从非结构化数据(网页)中提取结构化数据时,结构化数据所用的数据结构即为该item(Scrapy.Item)执行方式...
  • chensilly8888
  • chensilly8888
  • 2016年08月29日 04:27
  • 707

利用scrapy抓取网易新闻并将其存储在mongoDB

好久没有写爬虫了,写一个scrapy的小爬爬来抓取网易新闻,代码原型是github上的一个爬虫,最近也看了一点mongoDB,顺便小用一下,体验一下NoSQL是什么感觉。言归正传啊,scrapy爬虫主...
  • djd1234567
  • djd1234567
  • 2015年06月10日 10:54
  • 3627
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Scrapy对新闻进行爬虫(一)
举报原因:
原因补充:

(最多只允许输入30个字)