python爬虫用redis去重多种方法
什么是增量爬虫
爬虫过程中,常常要对目标网站的新数据进行抓取,遇到已经爬过的网页需要进行过滤。本文介绍用redis数据库的高效去重。
把所有爬过的url都放在redis中,以后每次爬取链接之前,先把url添加进去,如果能添加进去,说明是没爬过的,如果添加不进去,说明该链接有爬取过。
方法1
普通爬取时,核心的代码逻辑如下
复制import hashlib
import redis
def get_md5(val):
"""把目标数据进行哈希,用哈希值去重更快"""
md5 = hashlib.md5()
md5.update(val.encode('utf-8'))
return md5.hexdigest()
def add_url(url):
red = redis.Redis(host='106.1xxx', password='redixxxx', port=6379, db=0)
res = red.sadd('TEST:urlset', get_md5(url)) # 注意是 保存set的方式
if res == 0: # 若返回0,说明插入不成功,表示有重复
return False
else:
return True
if __name__ == '__main__':
print(add_url('https://www.taobao.com'))
方法2
可以把请求的response进行哈希,然后保存,其他的逻辑同方法一。
scrapy框架中,去重的核心代码是:(这里也是先对url进行判断,没爬过的才爬取)
主脚本的代码示例
复制import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from TestProgram.items import TestProgramItem
class TestSpider(CrawlSpider):
name = 'ttt'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.xxx.html']
rules = (
Rule(LinkExtractor(allow=r'/index.php/\d+\.html'), callback='parse_item', follow=True),
)
def parse_item(self, response):
conn = Redis(host='127.0.0.1',port=6379)
detail_url_list= response.xpath('//li[@class="c/@href').extract()
for url in detail_url_list:
ex = conn.sadd('test_url',url)
#等于1 的时候 说明数据还没有存储到redis中 等于0 的时候 说明redis中已经存在该数据
if ex == 1:
yield scrapy.Request(url=url,callback=self.parse_detail)
else:
print("无数据更新")
def parse_detail(self,response):
item = TestProgramItem()
item['name']=response.xpath('/html/bo/text()').extract_first()
item['age']=response.xpath('/html/bo/text()').extract_first()
yield item
pipeline中的脚本示例:(因为在主脚本中已经过滤了,这里就不用其他的操作,正常操作即可)
复制from redis import Redis
class TestProramPipeline(object):
conn = None
def open_spider(self,spider):
self.conn = Redis(host='127.0.0.1',port=6379)
def process_item(self, item, spider):
self.conn.lpush('movie_data',item)
return item
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?