使用 Scrapy 填充数据库

首先, 我们需要一个 API key。 我们可以在 Settings 选项卡(1) 中找到它。 复制该值(2),然后单击 Collections 选项卡(3) 回到房产集合中, 过程如图4.3所示。

image 2024 05 08 21 54 14 942
Figure 1. 图4.3 使用Appery.io创建新数据库及集合

非常好!现在需要修改在第 3 章中创建的应用,将数据导入到 Appery.io 中。我们先将项目以及名为 easy 的爬虫(easy.py)复制过来,并将该爬虫重命名为 tomobile(tomobile.py)。同时,编辑文件,将其名称设为 tomobile。

ch04
$ ls
properties scrapy.cfg
$ cat properties/spiders/tomobile.py
...
class ToMobileSpider(CrawlSpider):
    name = 'tomobile'
    allowed_domains = ["scrapybook.s3.amazonaws.com"]

    # Start on the first index page
    start_urls = (
        'http://scrapybook.s3.amazonaws.com/properties/'
        'index_00000.html',
    )
...

你可能已经注意到的一个问题是,这里并没有使用之前章节中用过的 Web 服务器(http://web:9312),而是使用了该站点的一个公开可用的副本,这是我存放在 http://scrapybook.s3.amazonaws.com 上的副本。之所以在本章中使用这种方式,是因为这样可以使图片和 URL 都能够公开可用,此时就可以非常轻松地分享应用了。

我们将使用 Appery.io 的管道来插入数据。Scrapy 管道通常是一个很小的 Python 类,拥有后置处理、清理及存储 Scrapy Item 的功能。第 8 章将会更深入地介绍这部分的内容。就目前来说,你可以使用 easy_install 或 pip 安装它,不过如果你使用的是我们的 Vagrant dev 机器,则无需进行任何操作,因为我们已经将其安装好了。

$ sudo easy_install -U scrapyapperyio

$ sudo pip install --upgrade scrapyapperyio

此时,你需要对 Scrapy 的主设置文件进行一些小修改,将之前复制的 API key 添加进来。第 7 章将会更加深入地讨论设置。现在,我们所需要做的就是将如下行添加到 properties/settings.py 文件中。

ITEM_PIPELINES = {'scrapyapperyio.ApperyIoPipeline': 300}

APPERYIO_DB_ID = '<<Your API KEY here>>'
APPERYIO_USERNAME = 'root'
APPERYIO_PASSWORD = 'pass'
APPERYIO_COLLECTION_NAME = 'properties'

不要忘记将 APPERYIO_DB_ID 替换为你的 API key。此外,还需要确保设置中的用户名和密码,要和你在 Appery.io 中创建数据库用户时使用的相同。 要想向 Appery.io 的数据库中填充数据,请像平常那样启动 scrapy crawl。

$ scrapy crawl tomobile -s CLOSESPIDER_ITEMCOUNT=90
INFO: Scrapy 1.0.3 started (bot: properties)
...
INFO: Enabled item pipelines: ApperyIoPipeline
INFO: Spider opened
...
DEBUG: Crawled (200) <GET https://api.appery.io/rest/1/db/login?username=
root&password=pass>
...
DEBUG: Crawled (200) <POST https://api.appery.io/rest/1/db/collections/
properties>
...
INFO: Dumping Scrapy stats:
{'downloader/response_count': 215,
'item_scraped_count': 105,
...}
INFO: Spider closed (closespider_itemcount)

这次的输出会有些不同。可以看到在最开始的几行中,有一行是用于启用 ApperyIoPipeline 这个 Item 管道的;不过最明显的是,你会发现尽管抓取了 100 个 Item,但是却有 200 次请求/响应。 这是因为 Appery.io 的管道对每个 Item 都执行了一个到 Appery.io 服务端的额外请求,以便写入每一个 Item。这些带有 api.appery.io 这个 URL 的请求同样也会在日志中出现。

当回到 Appery.io 时,可以看到在 properties 集合(1)中已经填充好了数据(2),如图 4.4 所示。

image 2024 05 08 22 05 50 057
Figure 2. 图4.4 使用数据填充properties集合