教你爬取妹子图(四)妹子入库

263 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情


教你爬取妹子图(四)妹子入库

声明

本人所有逆向、破解及爬虫相关教程均是以纯技术的角度来探讨研究和学习,严禁使用教程中提到的技术去破解、滥用、伤害其他公司及个人的利益,以及将以下内容用于商业或者非法用途。

前言

目前为止我们已经可以定时的爬取妹子网站的图片了,但我们目前只是把信息保存在了文件中,这种形式很不利于后期的使用,所以我们这一节修改一下。。。。。。

入库

哪个库?

常见的数据库有很多,有关系型的和非关系型的,但对于爬虫来说,非关系型的显然更适合一些,如MongoDBRedis等,这里我们使用文档型数据库MongoDB

安装数据库

首先需要有一个mongodb的数据库连接地址,这部分就不做介绍了,这里直接安装数据库驱动,我们选择的是一个异步的mongodb数据库驱动的库,搭配我们的异步爬取框架

pip install motor

添加新字段

由于是增量更新,我们就要添加一个标识增量的字段,也就是帖子的id,每次更新的时候在数据库中查找是否存在次条数据,不存在则插件,存在则跳过,这里不做更新操作

我们看一下帖子的url:www.vmgirls.com/20497.html。…

然后我们要做的就是在WeiMeiItem中添加这一个字段,然后在parse_images中设置帖子的id,具体代码如下:

class WeiMeiItem(Item):
    
	......
    
    # 套图ID
    post_id = Field()

class WeiMeiSp(Spider):
    
    ......
    
    async def parse_images(self, response: Response):
        item = await WeiMeiItem.extract(response=response)
        item.web_src = response.url
        item.post_id = re.findall(r'com/(.*?)\.html', response.url)[0]
        yield item

这样我们就把帖子的ID设置好了

插入到数据

我们先使用motor连接一下数据库:

from motor.motor_asyncio import AsyncIOMotorClient

......

if __name__ == '__main__':
    client = AsyncIOMotorClient("mongodb://*", serverSelectionTimeoutMS=5000)
    db = client.weimei
    collection = db.image_posts
    main()

其中mongodb://*是数据库的连接地址,client.weimei是数据库的名字,db.image_posts是表的名字

由于我们是自己处理数据,而不是交给hssp爬虫框架处理,所以我们首先重写process_item方法,在里面处理数据,具体代码如下:

    async def process_item(self, item: WeiMeiItem):
        db_data = await collection.find_one({'post_id': {'=': item.post_id}})
        if not db_data:
            item.created_at = datetime.now().isoformat()
            result = await collection.insert_one(item.copy())
            self.logger.info(f"{item.title} 插入:{result.inserted_id}")

这里的逻辑就是先根据post_id在数据库查找是否存在,如果不存在的话则插入进去,这里面用到了motor的两个API方法:

  • find_one:查找一条数据,直接返回结果,参数是过滤条件
  • insert_one:插入一条数据,返回插入的结果,参数是要插入的数据

我们看一下执行后数据表的结果:

结语

这节我们把数据保存再了数据库中,给了我们的妹子们一个小家,后面我们让这个小家逐步完善,越来越大