TypechoJoeTheme

至尊技术网

统计
登录
用户名
密码

Python爬虫怎样实现增量爬取

2025-11-13
/
0 评论
/
9 阅读
/
正在检测是否收录...
11/13

举个例子:某博客每天发布5篇文章,历史已抓取100篇。第二次运行时,爬虫先抓首页文章列表,发现总共有103篇。通过比对本地存储的ID列表,识别出新增的3篇,仅对这3篇进行深度抓取并保存正文,其余跳过。这样既保证了数据完整性,又大幅减少了网络请求。

实现方式一:基于唯一标识的去重机制

最常见且可靠的增量策略是利用唯一标识符(Unique ID)。许多网站的URL结构包含文章ID,例如 https://example.com/article/12345,其中 12345 即为唯一ID。我们可以使用集合(set)或数据库表来存储已抓取的ID。

python
import requests
from bs4 import BeautifulSoup
import sqlite3

初始化数据库

conn = sqlite3.connect('crawled.db')
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS articles (id INTEGER PRIMARY KEY)''')

def isalreadycrawled(articleid): c.execute("SELECT 1 FROM articles WHERE id=?", (articleid,))
return c.fetchone() is not None

def markascrawled(articleid): c.execute("INSERT OR IGNORE INTO articles (id) VALUES (?)", (articleid,))
conn.commit()

抓取列表页

res = requests.get("https://example.com/news")
soup = BeautifulSoup(res.text, 'html.parser')

for item in soup.select('.news-item'):
url = item.find('a')['href']
article_id = int(url.split('/')[-1]) # 假设URL末尾为ID

if is_already_crawled(article_id):
    continue  # 已抓取,跳过

# 抓取详情页
detail_res = requests.get(url)
detail_soup = BeautifulSoup(detail_res.text, 'html.parser')
title = detail_soup.h1.text.strip()
content = detail_soup.select_one('.content').text.strip()

# 保存数据
save_to_database(title, content, article_id)
mark_as_crawled(article_id)  # 标记为已抓取

这种方法简单直接,适用于大多数结构化网站。

实现方式二:基于时间戳的动态判断

当目标网站不提供稳定ID时,可依据发布时间进行判断。比如,记录上一次爬取的最晚时间 last_crawl_time,本次只抓取发布时间晚于该时间的文章。

python
import time
from datetime import datetime

读取上次爬取时间

lasttime = loadlast_timestamp() # 从文件或数据库读取

for item in items:
pubtimestr = item.selectone('.time').text pubtime = datetime.strptime(pubtimestr, '%Y-%m-%d %H:%M')

if pub_time <= last_time:
    continue  # 老内容,跳过

# 抓取新内容
crawl_detail_page(item)

更新最后爬取时间

save_timestamp(datetime.now())

此方法需注意时间格式解析的准确性,以及服务器时区问题。

存储方案的选择

增量爬取离不开持久化存储。小型项目可用JSON文件或SQLite,大型系统建议使用MySQL、MongoDB等数据库。SQLite轻量且无需额外服务,适合单机部署;而MongoDB支持灵活文档结构,便于后期扩展字段。

此外,Redis也可用于临时缓存已抓取ID,尤其适合高并发场景下的快速查重。

注意事项与优化建议

  • 避免误判更新:某些网站会刷新文章排序但内容未变,应结合ID而非位置判断。
  • 异常处理机制:网络中断或反爬导致部分数据未完成,需支持断点续爬。
  • 定期清理无效状态:长期运行后,可归档旧ID以节省空间。
  • 配合调度工具:使用APScheduler或Celery定时执行,实现自动化监控。

通过合理设计状态管理逻辑,Python爬虫不仅能“看得见”新内容,更能“记得住”过去的行为,真正实现智能、高效的增量采集。

朗读
赞(0)
版权属于:

至尊技术网

本文链接:

https://www.zzwws.cn/archives/38473/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 强强强
    2025-04-07
  2. jesse
    2025-01-16
  3. sowxkkxwwk
    2024-11-20
  4. zpzscldkea
    2024-11-20
  5. bruvoaaiju
    2024-11-14

标签云