91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲數據操作的技巧有哪些

發布時間:2021-11-20 09:16:43 來源:億速云 閱讀:99 作者:iii 欄目:編程語言

這篇文章主要講解了“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,我這是這樣定義的,

0:初始狀態

1:抓取中的任務

2:抓取成功

3:抓取失敗

4:抓取成功但是沒有匹配到任務。

后面隨著任務的爬取,狀態也是不斷變化的,同時我們需要更新update_time為最新的時間。這個目前的話是體現不出來什么作用,它的使用場景是,重復任務的抓取,比如今天我抓取了任務列表里的url1、url2,第二天的時候我如果再抓到,為了區分是抓取失敗還是抓取成功,我們根據create_time和update_time就可以進行推斷了,如果兩者相同而且是當前的日期說明剛抓的,如果update_time的日期比create_time新可以說明,抓到了重復的任務。關于字段的設計就啰嗦這么些。

下面是實現,我們可以通過update_one方法,對數據作存在或者插入操作,因為url作為查詢條件,后面量大的話就最好添加一個索引。也就是上面的  add_index方法。

好了最好說插入更新的具體代碼

需要注意的是

{'$set': data, '$setOnInsert': {'create_time': datetime.datetime.now()}}

$setOnInsert里面使用的字段是數據不存在的時候才插入的,存在就不動了,只插入$set里面指定的。

另外$setOnInsert里面使用的字段不能在$set里面再次出現

upsert=True代表的是不存在就插入。

感謝各位的閱讀,以上就是“Python爬蟲數據操作的技巧有哪些”的內容了,經過本文的學習后,相信大家對Python爬蟲數據操作的技巧有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜丰县| 将乐县| 措美县| 静海县| 太仆寺旗| 固阳县| 崇文区| 于田县| 曲松县| 兰西县| 山阳县| 林甸县| 马关县| 施甸县| 富锦市| 宿松县| 广汉市| 聂拉木县| 馆陶县| 钟山县| 三江| 容城县| 南宫市| 遵化市| 高密市| 酒泉市| 通河县| 凤城市| 萝北县| 疏勒县| 大英县| 乌兰浩特市| 杂多县| 枣阳市| 乌兰察布市| 海盐县| 长春市| 涿州市| 吉首市| 扎兰屯市| 安吉县|