悠悠楠杉
Python爬虫怎样实现增量爬取
举个例子:某博客每天发布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爬虫不仅能“看得见”新内容,更能“记得住”过去的行为,真正实现智能、高效的增量采集。

