最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中獲取時(shí)間戳的5種策略對(duì)比和時(shí)間格式處理全攻略

 更新時(shí)間:2025年11月07日 08:40:12   作者:傻啦嘿喲  
在數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,如何高效獲取增量數(shù)據(jù)而非重復(fù)抓取全量信息是開發(fā)者常面臨一個(gè)核心問題,本文將為大家詳細(xì)介紹Python中獲取時(shí)間戳的5種策略對(duì)比和時(shí)間格式處理,有需要的可以參考下

在數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,開發(fā)者常面臨一個(gè)核心問題:如何高效獲取增量數(shù)據(jù)而非重復(fù)抓取全量信息。時(shí)間戳對(duì)比策略因其簡單可靠,成為增量更新的主流方案。本文將通過真實(shí)場景拆解,結(jié)合代碼示例與避坑指南,助你快速掌握這一技術(shù)。

一、為什么需要增量更新

假設(shè)你負(fù)責(zé)抓取電商平臺(tái)的商品價(jià)格數(shù)據(jù),若每天全量抓取10萬條商品信息,不僅浪費(fèi)帶寬和存儲(chǔ)資源,還可能因頻繁請(qǐng)求觸發(fā)反爬機(jī)制。而增量更新只需抓取價(jià)格變動(dòng)的商品,效率提升數(shù)十倍。

典型場景

  • 新聞網(wǎng)站抓取最新文章
  • 電商監(jiān)控價(jià)格波動(dòng)
  • 社交媒體追蹤熱點(diǎn)話題
  • 金融數(shù)據(jù)實(shí)時(shí)更新

二、時(shí)間戳策略的核心邏輯

時(shí)間戳增量更新的本質(zhì)是"只抓取比上次更新時(shí)間新的數(shù)據(jù)"。其實(shí)現(xiàn)依賴三個(gè)關(guān)鍵要素:

  • 數(shù)據(jù)源時(shí)間戳:目標(biāo)網(wǎng)頁或API返回的創(chuàng)建/修改時(shí)間
  • 本地記錄時(shí)間:上一次成功抓取的時(shí)間點(diǎn)
  • 對(duì)比機(jī)制:判斷數(shù)據(jù)是否需要更新

案例演示:抓取GitHub倉庫更新

假設(shè)需要監(jiān)控某個(gè)GitHub倉庫的Release信息,只獲取新發(fā)布的版本。

步驟1:獲取數(shù)據(jù)源時(shí)間戳

GitHub API返回的Release信息包含published_at字段:

{
  "id": 123456,
  "tag_name": "v1.2.0",
  "published_at": "2023-05-15T10:30:00Z"
}

步驟2:本地存儲(chǔ)時(shí)間基準(zhǔn)

使用數(shù)據(jù)庫或文件記錄上次抓取時(shí)間:

# 偽代碼示例
last_update = "2023-05-14T23:59:59Z"  # 從數(shù)據(jù)庫讀取

步驟3:構(gòu)建請(qǐng)求與過濾

import requests
from datetime import datetime

def fetch_new_releases(repo_owner, repo_name, last_update_str):
    last_update = datetime.fromisoformat(last_update_str.replace('Z', '+00:00'))
    url = f"https://api.github.com/repos/{repo_owner}/{repo_name}/releases"
    
    response = requests.get(url)
    releases = response.json()
    
    new_releases = []
    for release in releases:
        release_time = datetime.fromisoformat(release['published_at'].replace('Z', '+00:00'))
        if release_time > last_update:
            new_releases.append(release)
    
    # 更新本地時(shí)間基準(zhǔn)(實(shí)際應(yīng)寫入數(shù)據(jù)庫)
    if new_releases:
        last_update = max(release_time for release in new_releases)
    
    return new_releases, last_update.isoformat()

三、時(shí)間戳獲取的5種實(shí)戰(zhàn)方法

方法1:直接使用API返回時(shí)間

適用場景:結(jié)構(gòu)化數(shù)據(jù)源(如GitHub、Twitter API)

優(yōu)勢(shì):最準(zhǔn)確可靠

示例

# Twitter API返回的tweet創(chuàng)建時(shí)間
tweet_time = tweet['created_at']  # "Wed Oct 10 20:19:24 +0000 2018"

方法2:解析網(wǎng)頁中的時(shí)間元素

適用場景:無API的靜態(tài)網(wǎng)頁

實(shí)現(xiàn):使用BeautifulSoup提取<time>標(biāo)簽或特定class

from bs4 import BeautifulSoup

html = """<div class="article"><time datetime="2023-05-10">May 10</time></div>"""
soup = BeautifulSoup(html, 'html.parser')
time_element = soup.find('time')
if time_element:
    article_time = time_element['datetime']

方法3:HTTP頭信息獲取

適用場景:需要服務(wù)器最后修改時(shí)間

實(shí)現(xiàn):檢查Last-Modified

import requests

response = requests.head('https://example.com/data.json')
last_modified = response.headers.get('Last-Modified')
# "Wed, 21 Oct 2020 07:28:00 GMT"

方法4:自定義時(shí)間戳字段

適用場景:自建數(shù)據(jù)源

實(shí)現(xiàn):在數(shù)據(jù)中添加_timestamp字段

{
  "id": 1001,
  "content": "Sample data",
  "_timestamp": "2023-05-15T08:00:00Z"
}

方法5:文件系統(tǒng)時(shí)間(本地?cái)?shù)據(jù))

適用場景:監(jiān)控本地文件變化

實(shí)現(xiàn):使用os.path.getmtime

import os
import time

file_path = 'data.json'
if os.path.exists(file_path):
    file_time = time.ctime(os.path.getmtime(file_path))
    # "Mon May 15 14:30:00 2023"

四、時(shí)間格式處理全攻略

不同數(shù)據(jù)源的時(shí)間格式差異巨大,需統(tǒng)一處理:

1. ISO 8601格式(推薦)

from datetime import datetime

iso_str = "2023-05-15T10:30:00Z"
dt = datetime.fromisoformat(iso_str.replace('Z', '+00:00'))

2. Unix時(shí)間戳轉(zhuǎn)換

timestamp = 1684146600  # 對(duì)應(yīng)2023-05-15 10:30:00 UTC
dt = datetime.utcfromtimestamp(timestamp)

3. 自定義字符串解析

from dateutil import parser

date_str = "May 15, 2023 10:30 AM"
dt = parser.parse(date_str)

4. 時(shí)區(qū)處理陷阱

問題:服務(wù)器返回本地時(shí)間未標(biāo)明時(shí)區(qū)

解決方案

import pytz

# 假設(shè)獲取到的是"2023-05-15 18:30:00"(未標(biāo)明時(shí)區(qū))
naive_dt = datetime.strptime("2023-05-15 18:30:00", "%Y-%m-%d %H:%M:%S")

# 明確指定為北京時(shí)間
beijing = pytz.timezone('Asia/Shanghai')
localized_dt = beijing.localize(naive_dt)

# 轉(zhuǎn)換為UTC
utc_dt = localized_dt.astimezone(pytz.UTC)

五、存儲(chǔ)與對(duì)比優(yōu)化方案

方案1:數(shù)據(jù)庫存儲(chǔ)(推薦)

-- MySQL示例
CREATE TABLE update_tracker (
    source_name VARCHAR(50) PRIMARY KEY,
    last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO update_tracker (source_name) VALUES ('github_releases');
-- 更新時(shí)執(zhí)行:
-- UPDATE update_tracker SET last_update='2023-05-15 10:30:00' WHERE source_name='github_releases';

方案2:文件存儲(chǔ)(輕量級(jí))

import json
from datetime import datetime

def save_last_update(source, timestamp):
    data = {'last_update': timestamp.isoformat()}
    with open(f'{source}_last_update.json', 'w') as f:
        json.dump(data, f)

def load_last_update(source):
    try:
        with open(f'{source}_last_update.json', 'r') as f:
            data = json.load(f)
            return datetime.fromisoformat(data['last_update'])
    except FileNotFoundError:
        return datetime(1970, 1, 1)  # 返回Unix紀(jì)元

方案3:Redis緩存(高性能)

import redis

r = redis.Redis(host='localhost', port=6379, db=0)

def update_last_timestamp(source, timestamp):
    r.set(f'{source}:last_update', timestamp.isoformat())

def get_last_timestamp(source):
    timestamp_str = r.get(f'{source}:last_update')
    if timestamp_str:
        return datetime.fromisoformat(timestamp_str.decode('utf-8'))
    return datetime(1970, 1, 1)

六、完整案例:電商價(jià)格監(jiān)控

需求:監(jiān)控某電商平臺(tái)商品價(jià)格,每小時(shí)抓取價(jià)格變動(dòng)的商品

實(shí)現(xiàn)步驟

初始化數(shù)據(jù)庫表

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    price DECIMAL(10,2),
    last_price_change TIMESTAMP
);

CREATE TABLE update_log (
    source VARCHAR(50) PRIMARY KEY,
    last_check TIMESTAMP
);

主邏輯

import requests
from datetime import datetime, timedelta
import pytz

def get_product_updates():
    # 獲取上次檢查時(shí)間
    last_check = get_last_check_time()  # 從數(shù)據(jù)庫讀取
    current_time = datetime.now(pytz.UTC)
    
    # 模擬API請(qǐng)求(實(shí)際替換為真實(shí)API)
    all_products = [
        {'id': 1, 'name': 'Laptop', 'price': 999.99, 'updated_at': '2023-05-15T08:00:00Z'},
        {'id': 2, 'name': 'Phone', 'price': 699.99, 'updated_at': '2023-05-14T15:30:00Z'},
        {'id': 3, 'name': 'Tablet', 'price': 399.99, 'updated_at': '2023-05-15T10:00:00Z'}
    ]
    
    updated_products = []
    for product in all_products:
        product_time = datetime.fromisoformat(product['updated_at'].replace('Z', '+00:00'))
        if product_time > last_check:
            # 檢查價(jià)格是否實(shí)際變化(防偽更新)
            old_price = get_product_price(product['id'])  # 從數(shù)據(jù)庫查詢
            if old_price != product['price']:
                updated_products.append(product)
                # 更新數(shù)據(jù)庫價(jià)格
                update_product_price(product['id'], product['price'])
    
    # 記錄本次檢查時(shí)間
    record_check_time(current_time)
    
    return updated_products

def get_last_check_time():
    # 實(shí)際從數(shù)據(jù)庫實(shí)現(xiàn)
    return datetime(2023, 5, 15, 9, 0, 0, tzinfo=pytz.UTC)

def record_check_time(timestamp):
    # 實(shí)際寫入數(shù)據(jù)庫實(shí)現(xiàn)
    print(f"記錄檢查時(shí)間: {timestamp}")

七、常見問題Q&A

Q1:被網(wǎng)站封IP怎么辦?

A:立即啟用備用代理池,建議使用住宅代理(如站大爺IP代理),配合每請(qǐng)求更換IP策略。更高級(jí)方案包括:

  • 使用Tor網(wǎng)絡(luò)
  • 部署云服務(wù)器集群輪換
  • 購買商業(yè)代理服務(wù)(如Bright Data)

Q2:時(shí)間戳不準(zhǔn)確導(dǎo)致漏抓數(shù)據(jù)怎么辦?

A:采用"保守更新"策略,將判斷條件改為>=并添加緩沖時(shí)間:

buffer_minutes = 5
last_update = last_update - timedelta(minutes=buffer_minutes)
if release_time >= last_update:  # 使用>=而非>

Q3:如何處理時(shí)區(qū)混亂問題?

A:統(tǒng)一轉(zhuǎn)換為UTC存儲(chǔ)和比較,顯示時(shí)再轉(zhuǎn)換為目標(biāo)時(shí)區(qū):

def to_local_time(utc_dt, timezone_str='Asia/Shanghai'):
    tz = pytz.timezone(timezone_str)
    return utc_dt.astimezone(tz)

Q4:數(shù)據(jù)源沒有時(shí)間字段怎么辦?

A:替代方案包括:

  • 使用文件哈希值對(duì)比(MD5/SHA1)
  • 記錄數(shù)據(jù)條數(shù)或ID范圍
  • 添加自定義_crawled_at字段

Q5:增量抓取影響SEO怎么辦?

A:遵守robots.txt規(guī)則,設(shè)置合理抓取間隔(如每小時(shí)1次),使用User-Agent標(biāo)識(shí)爬蟲身份。

結(jié)語

時(shí)間戳對(duì)比策略通過精準(zhǔn)定位變更數(shù)據(jù),顯著提升了爬蟲效率。實(shí)際開發(fā)中需注意時(shí)間格式統(tǒng)一、存儲(chǔ)方案選擇和異常處理。結(jié)合代理輪換、請(qǐng)求限速等反爬措施,可構(gòu)建穩(wěn)定高效的增量更新系統(tǒng)。掌握這些技巧后,你將能輕松應(yīng)對(duì)大多數(shù)數(shù)據(jù)監(jiān)控場景的需求。

以上就是Python中獲取時(shí)間戳的5種策略對(duì)比和時(shí)間格式處理全攻略的詳細(xì)內(nèi)容,更多關(guān)于Python獲取時(shí)間戳的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Tensorflow自定義模型與訓(xùn)練超詳細(xì)講解

    Tensorflow自定義模型與訓(xùn)練超詳細(xì)講解

    TensorFlow是基于數(shù)據(jù)流編程的符號(hào)數(shù)學(xué)系統(tǒng),廣泛用于機(jī)器學(xué)習(xí)算法的編程實(shí)現(xiàn),前身是谷歌的神經(jīng)網(wǎng)絡(luò)算法庫DistBelief,Tensorflow擁有多層級(jí)結(jié)構(gòu),可部署于各類服務(wù)器、PC終端和網(wǎng)頁并支持GPU和TPU高性能數(shù)值計(jì)算,被廣泛應(yīng)用于谷歌內(nèi)部的產(chǎn)品開發(fā)和各領(lǐng)域的科學(xué)研究
    2022-11-11
  • python求前n個(gè)階乘的和實(shí)例

    python求前n個(gè)階乘的和實(shí)例

    這篇文章主要介紹了python求前n個(gè)階乘的和實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 詳解Python自帶的日期日歷處理calendar庫的使用

    詳解Python自帶的日期日歷處理calendar庫的使用

    在?Python?開發(fā)中,我們經(jīng)常需要處理日期和時(shí)間,雖然?datetime?庫是最常用的選擇,但其實(shí)?Python?標(biāo)準(zhǔn)庫中的?calendar?模塊也是一個(gè)強(qiáng)大的工具,下面我們就來看看它的具體使用吧
    2024-12-12
  • Python操作遠(yuǎn)程服務(wù)器 paramiko模塊詳細(xì)介紹

    Python操作遠(yuǎn)程服務(wù)器 paramiko模塊詳細(xì)介紹

    這篇文章主要介紹了Python操作遠(yuǎn)程服務(wù)器 paramiko模塊詳細(xì)介紹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python高級(jí)應(yīng)用探索之元編程和并發(fā)編程詳解

    Python高級(jí)應(yīng)用探索之元編程和并發(fā)編程詳解

    Python作為一種簡單易用且功能強(qiáng)大的編程語言,廣泛應(yīng)用于各個(gè)領(lǐng)域,本文主要來和大家一起探索一下Python中的優(yōu)化技巧、元編程和并發(fā)編程,希望對(duì)大家有所幫助
    2023-11-11
  • Django跨域資源共享問題(推薦)

    Django跨域資源共享問題(推薦)

    跨域資源共享(CORS) 是一種機(jī)制,它使用額外的 HTTP 頭來告訴瀏覽器 讓運(yùn)行在一個(gè) origin (domain) 上的Web應(yīng)用被準(zhǔn)許訪問來自不同源服務(wù)器上的指定的資源。這篇文章主要介紹了Django跨域資源共享問題小結(jié),需要的朋友可以參考下
    2020-03-03
  • python實(shí)現(xiàn)接口并發(fā)測(cè)試腳本

    python實(shí)現(xiàn)接口并發(fā)測(cè)試腳本

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)接口并發(fā)測(cè)試腳本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 利用Python編寫簡易版德州撲克小游戲

    利用Python編寫簡易版德州撲克小游戲

    德州撲克不知道大家是否玩過,它是起源于美國的得克薩斯州的一種博弈類卡牌游戲,英文名叫做Texas?Hold’em?Poker。本文將用Python實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-03-03
  • Django 聚合函數(shù)的具體使用

    Django 聚合函數(shù)的具體使用

    orm模型中的聚合函數(shù)跟MySQL中的聚合函數(shù)作用是一致的,也有像Sum、Avg、Count、Max、Min,接下來我們逐個(gè)介紹,下面就一起來了解一下
    2021-05-05
  • Python+Pygame實(shí)戰(zhàn)之泡泡游戲的實(shí)現(xiàn)

    Python+Pygame實(shí)戰(zhàn)之泡泡游戲的實(shí)現(xiàn)

    這篇文章主要為大家介紹了如何利用Python中的Pygame模塊實(shí)現(xiàn)泡泡游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python游戲開發(fā)有一定幫助,需要的可以參考一下
    2022-07-07

最新評(píng)論

平罗县| 万安县| 黔西| 凯里市| 江安县| 夏邑县| 大英县| 北辰区| 鲁甸县| 威信县| 泌阳县| 朝阳县| 疏勒县| 嘉善县| 松潘县| 上饶县| 永州市| 嘉峪关市| 长岭县| 湟中县| 行唐县| 珠海市| 岑巩县| 手游| 亚东县| 泌阳县| 安化县| 平远县| 阿鲁科尔沁旗| 南雄市| 安陆市| 西乌| 邓州市| 泰安市| 大悟县| 株洲县| 灵丘县| 靖远县| 阳朔县| 洪洞县| 花垣县|