使用requests与BeautifulSoup爬取视频论坛下载链接时,如何过滤重复href
论坛类站点爬虫链接去重实现
对应这类页面多入口指向同一href的重复抓取场景,不需要做复杂的URL归一化处理——毕竟场景里原清晰度、低清晰度两个下载入口的href字符串完全相等,直接做字符串级的唯一性校验就能解决,几种落地实现可以按代码适配度选:
爬取过程实时去重(推荐,从源头避免重复入列)
不用等全部链接爬完再回头删除重复条目,每次从页面提取到href链接时就做判重,不会攒一堆重复数据占内存。
轻量实现(适配当前21页的爬取规模)
当前爬取量下链接总数不大,直接在追加链接前加个存在性判断就行,代码改动最少:
- 把原来直接执行
links.append(link)的逻辑,改成判断后再追加
if link not in links: links.append(link)
这种写法兼容所有Python版本,而且会严格保留爬取到链接的先后顺序,不会打乱页面上原本的条目位置。
高效实现(适配后续扩大爬取规模的场景)
如果后续要爬几十上百页、链接量到几千上万条,用集合做快速判重,避免每次遍历列表查找的性能损耗,同时保留爬取顺序:
- 初始化环节新增一个集合,用来做已收集链接的快速标记
links = [] seen_links = set()
- 提取链接环节的判断逻辑,顺带补上原代码的空值防护,避免碰到没有嵌套a标签的i标签时抛出异常、导致整个爬虫崩溃:
# 先确认a标签存在,再判断链接没有被收集过 if a is not None and link not in seen_links: links.append(link) seen_links.add(link)
爬后批量去重(改动最少,临时调整用)
如果不想动已经写好的爬取循环逻辑,等全部页面爬完之后再统一对收集到的链接列表做去重,借助Python3.7+内置的字典插入有序特性,一行代码就能实现保留爬取顺序的批量去重:
# 爬取完成后先对链接列表去重 unique_links = list(dict.fromkeys(links)) # 后续写入文件时使用去重后的列表 with open('urls.txt', 'w') as file: for link in unique_links: file.write(link + '\n')
内容的提问来源于stack exchange,提问作者Nohan Decimus
相关产品推荐
相关产品推荐

