乐者为王

Do one thing, and do it well.

使用Scrapy爬取小说(3)

在前文中,我们将小说的每个章节保存为独立的文本文件。今天我们准备把小说内容输出到数据库。对于数据存储,我选择MongoDB。为什么是MongoDB而不是其它?原因是以前没用过,想尝试下。

现在我们已经知道,要把抓取来的数据保存到数据库,只需实现Item Pipeline即可。我们可以仿照前面的实现依葫芦画瓢。

以下是将小说内容保存到MongoDB的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import pymongo

class MongoPipeline(object):
  def open_spider(self, spider):
    self.client = pymongo.MongoClient('localhost', 27017)
    self.novel = self.client['novel']
    self.ssjx = self.novel['ssjx']

  def process_item(self, item, spider):
    data = {
      # 标题和内容都是列表类型,必须先转换成字符串
      'title' : ''.join(item['title']),
      'content' : ''.join(item['content']),
    }
    self.ssjx.insert(data)
    return item

  def close_spider(self, spider):
    self.client.close()

将组件添加到novel/settings.py的ITEM_PIPELINES配置中以启用它:

1
2
3
4
ITEM_PIPELINES = {
  'novel.pipelines.TxtPipeline' : 300,
  'novel.pipelines.MongoPipeline' : 400,
}

在项目的根目录中使用下面的指令运行Spider:

1
scrapy crawl novelspider

如果没有问题的话,爬虫会不停地运行,小说的章节内容也会被一个个地保存到数据库。下面的截图是最终的抓取结果:

novel-mongo-gui

Comments