continue用于跳过无效URL迭代,需结合去重(标准化URL后查set)、预过滤(协议/长度/资源类型)、异常捕获(requests异常及状态码)和更新策略(时间戳判断)实现高效爬取。

在爬虫程序中,continue 语句常用于跳过当前循环迭代,避免对已处理、重复或失效的 URL 执行冗余请求。关键不是单纯用 continue,而是结合去重逻辑、状态检查和异常处理,在循环体内提前终止无效流程。
检查 URL 是否已抓取过(去重)
爬虫通常维护一个已访问集合(如 set),每次循环开始时判断当前 URL 是否存在其中。若已存在,直接 continue 跳过:
- 用
visited_urls = set()记录成功抓取过的 URL(建议持久化到数据库或文件,避免重启丢失) - 循环中先写
if url in visited_urls: continue - 注意:URL 可能带参数顺序不同但内容相同(如
?a=1&b=2和?b=2&a=1),建议标准化后再判断(如用urllib.parse.urlparse+parse_qs排序参数)
验证 URL 格式与可访问性(预过滤)
在发起请求前,快速排除明显无效链接,减少 HTTP 请求开销:
- 跳过空值、非 http/https 协议、含非法字符或长度超限的 URL:
if not url or not url.startswith(('http://', 'https://')) or len(url) > 2000: continue - 可用正则粗筛常见坏链模式,如
re.search(r'\.(jpg|png|pdf|zip|exe)(\?|$)', url)跳过二进制资源(按需) - 不建议在此处做 DNS 解析或 HEAD 请求——太慢;留到真正请求阶段再处理
捕获请求异常并跳过失效链接
即使 URL 格式合法,也可能返回 404、503、连接超时等。应在 try...except 中捕获后 continue,防止中断整个循环:
- 把
requests.get()放在try块内,对requests.exceptions.RequestException或具体状态码(如r.status_code >= 400)触发continue - 记录失败原因(如日志写入文件或打印),方便后续分析失效规律
- 避免静默跳过:不加日志的
continue会让问题难以追踪
结合时间戳或更新策略跳过旧数据
对于需定期更新的页面,可存储上次抓取时间,跳过未到刷新周期的 URL:
- 用字典或数据库保存
{url: last_fetched_timestamp} - 循环中计算
if time.time() - last_fetched (例如一小时内不重复抓) - 注意时区与系统时间一致性,生产环境建议用 UTC 时间戳
本质上,continue 是控制流工具,真正起作用的是它前面的判断条件。把校验逻辑放在循环开头、靠近 for url in url_list: 的位置,结构清晰且效率高。不复杂但容易忽略细节。


















