持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
教你爬取妹子图(四)妹子入库
声明
本人所有逆向、破解及爬虫相关教程均是以纯技术的角度来探讨研究和学习,严禁使用教程中提到的技术去破解、滥用、伤害其他公司及个人的利益,以及将以下内容用于商业或者非法用途。
前言
目前为止我们已经可以定时的爬取妹子网站的图片了,但我们目前只是把信息保存在了文件中,这种形式很不利于后期的使用,所以我们这一节修改一下。。。。。。
入库
哪个库?
常见的数据库有很多,有关系型的和非关系型的,但对于爬虫来说,非关系型的显然更适合一些,如MongoDB
、Redis
等,这里我们使用文档型数据库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:插入一条数据,返回插入的结果,参数是要插入的数据
我们看一下执行后数据表的结果:
结语
这节我们把数据保存再了数据库中,给了我们的妹子们一个小家,后面我们让这个小家逐步完善,越来越大