这篇文章主要讲解了“Python爬虫数据操作的技巧有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python爬虫数据操作的技巧有哪些”吧!
需求
爬取某网站的项目列表页,获取其url,标题等信息,作为后续爬取详情页的任务url。
代码
# -*- coding: utf-8 -*- # @Time : 2019-11-08 14:04 # @Author : cxa # @File : motor_helper.py # @Software: PyCharm import asyncio import datetime from loguru import logger from motor.motor_asyncio import AsyncIOMotorClient from collections import Iterable try: import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) except ImportError: pass db_configs = { 'host': '127.0.0.1', 'port': '27017', 'db_name': 'mafengwo', 'user': '' } class MotorOperation: def __init__(self): self.__dict__.update(**db_configs) if self.user: self.motor_uri = f"mongodb://{self.user}:{self.passwd}@{self.host}:{self.port}/{self.db_name}?authSource={self.db_name}" else: self.motor_uri = f"mongodb://{self.host}:{self.port}/{self.db_name}" self.client = AsyncIOMotorClient(self.motor_uri) self.mb = self.client[self.db_name] async def save_data_with_status(self, items, col="seed_data"): for item in items: data = dict() data["update_time"] = datetime.datetime.now() data["status"] = 0 # 0初始 data.update(item) print("data", data) await self.mb[col].update_one({ "url": item.get("url")}, {'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}}, upsert=True) async def add_index(self, col="seed_data"): # 添加索引 await self.mb[col].create_index('url')
因为我的爬虫是异步网络模块aiohttp写的,所以选择了pymongo的异步版本motor进行操作。
异步代码的基本属性就是async/await成对的出现,如果把上面的await和async去掉,就是类似pymongo的写法了,这里异步不是重点,重点是我们怎么处理每条数据。
这里除了网页的url,标题等信息,我需要附加3个字段。分别是create_time, status,update_time。
这三个字段分别代表,数据插入数据,状态和更新时间。
那么我为什么添加三个字段呢?
首先,我们需要判断每次的任务数据是否存在,我这里的情况是存在就更新不存在就插入,那么我就需要一个查询条件,作为更新的条件,很显然这里可以使用任务的url作为唯一条件(你还可以使用url+标题做个md5然后保存),好了查询条件确定。
下面说create_time这个比较好理解就是数据插入时间,关键是为什么还要一个update_time,这个的话和status字段有一定的关系。画重点:这个status作为后续爬虫进行爬取的一个标志用。目前这个status有4个值,0-4,我这是这样定义的,