协程爬取贴吧里发帖内容(redis做任务队列,mongo存储)

Scrapy高级应用:全站爬取、分布式与增量爬虫实战 网络爬虫是数据采集的基础技术,其核心原理是通过模拟浏览器请求,自动抓取并解析网页内容。在工程实践中,随着数据规模扩大,单机爬虫在效率、稳定性和资源消耗上会遇到瓶颈。为解决这些问题,需要引入更高级的系统设计思想。全站爬虫通过广度优先遍历和精准链接过滤,实现网站内容的系统性覆盖;分布式爬虫利用多节点协同工作,将Redis作为共享队列和去重中心,大幅提升抓取速度和系统可靠性;增量爬虫则基于时间戳或内容指纹识别变化,仅抓取新增或更新内容,显著节省资源。这些技术对于构建监控、聚合和搜索引擎索引等大规模数据采集系统具有 阅读详情

是用redis做任务队列时,要思考:

  • 用什么数据类型来做任务队列
  • 怎样才能防止重复爬取

首先了解一下redis可以存储什么数据类型:

  1. 字符串String
  2. 哈希hash
  3. 列表list
  4. 集合set
  5. 有序集合zset

浏览完这几种数据类型的功能之后,决定用list来做任务队列,用set来解决思考的问题,就是防止重复爬取的问题。
大概思路:

  1. 使用list当作未完成任务队列,存储还没有爬的url
  2. 使用set当作已完成任务队列,存储已经爬取的url
  3. 每次爬虫程序从list未完成任务队列获取任务的时候,都去set已完成任务队列里面验证一下,如果已完成队列里已经有了,就舍弃掉,如果没有,就开始爬取,并将这个url加入到已爬取的任务队列

这样做的方便之处在于:每当我往list未完成任务队列里加任务的时候,我不用考虑这个任务有没有爬过,这个任务是不是已经在未爬取任务队列了,我只需要往里加就行了,当爬虫去取的时候,让爬虫程序去做这个操作。

以下是具体代码
算是一个生产消费把,master往队列里塞任务,parser使用get_html的返回值进行解析,然后入库

import requests
from lxml import etree
import redis
import asyncio,aiohttp

import pymongo
conn = pymongo.MongoClient('localhost',27017)

db = conn.nicedb # 指定数据库名称,连接nicedb数据库,没有则自动创建
my_set = db.test_set # 使用test_set集合,没有则自动创建
# 以上两步都是延时操作,当往数据库插入第一条数据的时候,才会真正的创建数据库和集合

# decode_responses=True,记得加这个参数,不加的话取出来的数据都是bytes类型的
r = redis.StrictRedis(host = '127.0.0.1', port = 6379, db = 2,decode_responses=True)
# pool = redis.ConnectionPool(host = '127.0.0.1', port = 6379, db = 2)
# r = redis.StrictRedis(connection_pool=pool,decode_responses=True)

def master(page):
    url = 'https://tieba.baidu.com/f?kw=美女&ie=utf-8&pn={}'.format(page*50)
    base = 'https://tieba.baidu.com'
    res = requests.get(url).text
    html = etree.HTML(res)
    half_urls = html.xpath("//div[@class='threadlist_title pull_left j_th_tit ']/a/@href")
    full_urls = [base + i for i in half_urls]
    for url in full_urls:
        # 从url_list列表头部塞任务,也就是url
        r.lpush('url_list',url)
    #print(r.llen('url_list'))

async def get_html(url):
    async with asyncio.Semaphore(5):  # 限制并发数为5个
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as html:
                # errors='ignore',不加这个参数的话,会报错,具体错误内容见下面图片
                response = await html.text(encoding='utf-8',errors='ignore')
                return response
async def parse():
    while True:
        # 从redis的url_list列表取任务,从右边开始取
        url = r.rpop('url_list')
        if url == None:
            break
        # 判断这个任务是否已经做过了,也就是判断这个url在没在redis的history集合里
        if r.sismember('history',url) == 1:
            continue
        response = await get_html(url)
        html = etree.HTML(response)
        content = html.xpath("//div[@class='left_section']/div[2]/div[1]//cc/div[1]/text()")[0].strip()
        if content != '':
            # 当内容不为空时,将内容存到mongo里
            my_set.save({'content':content})
            #print(content)
        # 将爬取过的任务放到redis的history集合里,也就是已完成任务队列
        r.sadd('history', url)
t1 = time.time()
# 爬取前10页
for i in range(10):
    master()

# async的一些步骤
loop = asyncio.get_event_loop()
tasks = [parse() for _ in range(15)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

t2 = time.time()
print(t2-t1)
# 最后用时:32.930299043655396
# 把mongo数据库换成mysql后,用时:43.06192493438721

这是代码注释中提到的,编码错误
这里写图片描述

Python 爬虫实战:分析贴吧用户主页(发帖记录爬取 + 用户画像构建) 在互联网时代,贴吧作为一个活跃的社区平台,汇聚了海量的用户和丰富多样的信息。通过爬取和分析贴吧用户的发帖记录,可以构建出详细的用户画像,帮助我们更好地了解用户行为、兴趣爱好和观点倾向。这不仅对于市场营销、社群运营有着重要意义,也能够为个性化推荐、内容创作等提供有力支持。本文将详细讲解如何利用 Python 爬虫实现贴吧用户主页的发帖记录爬取,并基于这些数据构建用户画像。 阅读详情

相关推荐

Python爬虫实战:基于最新技术栈的贴吧内容抓取与分析

【代码】Python爬虫实战:基于最新技术栈的贴吧内容抓取与分析。

2201_76125261的博客 475

Python爬虫实战-爬取百度贴吧帖子

本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 如果觉得一步步看麻烦的话可以拉到最下面有完整源码可以直接使用 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子。 比如:http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1,这是一个关于NBA50大的盘点,分析一下这个地址。 http:// 代表资源传输使用http协议 tieba.baidu.com 是

qq_38887171的博客 9778

Python 爬虫实战:爬虫分布式任务调度(基础架构设计)

摘要:本文针对大规模网络爬虫效率问题,提出基于主从模式的分布式任务调度架构。系统包含Master任务管理器、Worker执行节点、Redis任务队列和MongoDB数据存储四大核心组件,通过Celery框架实现任务分发与负载均衡。文章详细阐述了架构设计原理、Redis分布式锁实现方法以及基于Python的具体实现方案(含代码示例)。测试结果表明,该架构能有效提升爬虫执行效率,在2个Worker节点下可达到2.1个任务/秒的吞吐量。系统具有扩展性强、容错性好的特点,并为进一步集成动态扩缩容、反爬策略等高级功能

2503_91057718的博客 992

python爬取贴吧数据_Python爬虫——抓取贴吧帖子

原博文2016-11-13 23:13 −抓取百度贴吧帖子 按照这个学习教程,一步一步写出来,中间遇到很多的问题,一一列举 首先, 获得 标题 和 贴子总数 # -*- coding:utf-8 -*- #!/user/bin/python import urllib import urllib2 import re class ...相关推荐2019-12-24 10:03 −http...

weixin_39741459的博客 815

Python爬虫实战:使用异步技术高效爬取知乎用户关注列表

本文将详细介绍如何使用Python最新异步技术高效爬取知乎用户关注列表。我们将从爬虫基础概念讲起,逐步深入到异步爬虫的实现,最终构建一个完整的知乎用户关注列表爬虫系统。文章包含详细的代码实现、性能优化技巧以及反反爬策略,帮助读者掌握大规模数据爬取的核心技术。关键词:Python爬虫、异步爬虫、知乎API、aiohttp、Playwright、数据存储本文详细介绍了如何使用Python异步技术高效爬取知乎用户关注列表。基于aiohttp的异步HTTP客户端使用Playwright的模拟登录解决方案。

2201_76125261的博客 954

基于Scrapy+Playwright的专利引用数据高效爬取实战

本文详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建高效专利引用数据爬虫。文章涵盖专利数据特点分析、爬虫技术选型、反反爬策略、数据存储方案以及完整代码实现,帮助读者掌握复杂动态网站的爬取技巧。关键词:专利爬虫、Scrapy、Playwright、数据采集、反反爬专利数据是技术研发和商业决策的重要参考依据,其中专利引用关系更是分析技术演进路径的关键数据。然而,专利数据通常分散在各个专利局的网站中,且大多采用动态加载和严格的反爬机制,使得数据采集变得困难。

2201_76125261的博客 936

Python爬虫实战(1)——抓取帖子并保存内容和图片

最近在网上看了很多的爬虫脚本,写的参差不齐,但是其中有很多写的非常的优秀,代码质量很高,规范性也很好,很具有代表性,非常值得我们去学习!~ 之前的帖子中介绍过url,也就是网址,在我们抓取网页的过程中也要非常注意网页的各项细节,而且需要我们不断的积累经验,也需要细心的分析: 例: http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1 这

MISAYAONE的博客 6900

别再纠结了!实测罗技Flow、对拷线、微软Mouse without Borders,我的最终选择是...

本文通过实测对比罗技Flow、对拷线和微软Mouse without Borders等多设备控制方案,详细分析了各自的优缺点及适用场景。作者最终选择了对拷线与罗技键鼠的组合方案,为专业用户提供了稳定可靠的多设备协同办公解决方案,特别适合需要频繁传输大文件和跨设备操作的用户。

weixin_33696106的博客 405

从零开始写Python爬虫 --- 1.5 爬虫实践: 获取百度贴吧内容

从零开始写Python爬虫 --- 1.5 爬虫实践: 获取百度贴吧内容 Ehco 5 个月前 经过前期大量的学习与准备,我们重要要开始写第一个真正意义上的爬虫了。本次我们要爬取的网站是:百度贴吧,一个非常适合新人练手的地方,那么让我们开始吧。 本次要爬的贴吧是>,生活大爆炸是我一直很喜欢的一部美剧,平时有空也会去看看吧友们都在聊些什么。所以这次选取这个吧来作为实验材料

技术、思维 5561

CentOS7上装不了最新Chrome?别折腾依赖了,试试这个老版本安装法(附103.0.5060.24 beta下载地址)

本文提供了在CentOS7上安装兼容版Chrome的详细指南,解决了因GLIBC版本限制导致的最新版Chrome无法安装的问题。推荐使用Chrome 103.0.5060.24 beta版本,并附有下载地址和完整安装步骤,包括禁用自动更新和配套工具安装,确保系统稳定性和功能完整性。

weixin_29289821的博客 567

Coze平台智能体开发实战:打造测试工程师的AI助手

智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。

hogwarts_beibei的博客 1005

redis队列去重_Scrapy-Redis分布式爬虫实战

Scrapy-Redis代码实战Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。scrapy-redis在scrapy的架构上增加了redis,基于redis的特性拓展了如下四种组件:SchedulerDuplication FilterItem PipelineBase Sp...

weixin_39609622的博客 257

YOLOv8训练流程-原理解析[目标检测理论篇]

本篇文章主要介绍了YOLOv8训练的流程,主要介绍了Task Aligned Assigner正负样本匹配策略以及YOLOv8的损失计算。

ice 4516

分布式爬取+存储(主:redis-----从:爬虫-----存:mongo)

左边的工作流程:爬虫分别从redis里面取数据,然后进行自己的相关业务逻辑,最终将结果数据保存到公共的数据库中。 右边的工作流程:爬虫分别从redis里面取数据,然后进行自己的相关业务逻辑,最终将结果数据保存到本地自己的数据库中。 ==注意:==爬虫可以有多个,所以才称作为分布式爬虫,在取数据的过程中,如果redis中的数据被取完了,爬虫将会进入阻塞状态,等待redis中添加新的数据,再继续工作...

weixin_44675377的博客 786

苏宁易购手机行情比价系统:构建一个完整的Python爬虫实战指南

在当今数字化时代,智能手机已成为人们生活中不可或缺的一部分。随着各大手机品牌每年推出多款新品,消费者面临着越来越多的选择。然而,不同电商平台、不同时间段的价格波动使得消费者很难把握最佳购买时机。苏宁易购作为国内领先的电商平台之一,拥有丰富的手机商品信息和价格数据。本文将带领读者构建一个完整的苏宁易购手机行情比价系统,帮助消费者实时掌握手机价格动态。

2201_76125261的博客 207

UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)

UE5、CesiumForUnreal实现加载GeoJson实现多面(MultiPolygon)的绘制功能,并且支持点选高亮和属性查询。

专注GIS开发 4628

基于Scrapy-Redis的分布式景点数据爬取与热力图生成

本文介绍了基于 Scrapy-Redis 的分布式爬虫系统,从数据采集、存储到热力图生成的完整流程。通过爬取景点数据并生成热力图,可以直观展示游客分布、热门区域及人流趋势,为商业决策、景区管理及智慧城市建设提供数据支持。本文将介绍如何基于Scrapy-Redis构建分布式爬虫,爬取热门景点数据,并使用。Scrapy-Redis 是 Scrapy 的分布式扩展,利用 Redis 作为任务队列和去重存储,实现多台爬虫节点的协同工作。:存储结构化景点数据(名称、评分、评论数、经纬度等)。

Z_suger7的博客 1152

YOLOv12涨点改进 | 全网独家首发Conv改进篇 | Arxiv 2025 | 引入一种新的WConv加权卷积改进YOLOv12,显著提升其特征提取能力和目标检测精度

本文提出了一种新型加权卷积(WConv)模块,通过引入最优密度函数动态调整邻域像素权重,显著提升了YOLOv12目标检测性能。WConv在保持参数数量不变的情况下,提高了模型精度(VGG准确率提升10%)、增强了小目标检测能力,并改善了多尺度特征提取。文中详细介绍了模块原理、网络结构改进方法,并提供了核心代码实现和yaml配置文件。实验表明,该方法在图像任务中最高可降低53%的损失,虽然会带来11%的时间开销,但具有优异的鲁棒性。该技术可广泛应用于2D/3D图像处理领域。

Ai缝合怪、助力小伙伴高效发论文 215

redis消息队列+mongo持久化--分布式爬虫实现

来我公司做爬虫吧,会坐牢的那种 scrapy通过多线程+异步大大提高了爬取效率,但是他本质上还是单进程,还是不够快,而scrapy-redis在scrapy的基础上解决了这个问题,scrapy-redis最核心的目的就是通过多台从机突破了我们的带宽限制,提高了效率,这种类似于多进程的思想,这里的多进程其实是多台电脑,如下图 - 步骤 一、服务主机的配置 1 修改redis-server配置,...

祈心无尘的博客 517

YOLOv8全网首发:CVPR2026 MixerCSeg | DEGConv方向引导边缘门控,破解细长裂缝检测难题

DEGConv通过方向先验嵌入、边缘增强卷积和动态门控三大机制,针对性解决了YOLO在处理裂缝类细长、多方向、低对比度目标时的特征提取不足问题,显著提升了裂缝检测的精度与鲁棒性。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 516

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

scrapy-redis分布式爬取 读取redis数据库中内容存储到mongo

import json import pymongo from redis import StrictRedis rediscli=StrictRedis(host='192.168.6.223',port=6379,db=0,decode_responses=True) client=pymongo.MongoClient('mongoip',27017) db=client.xixian collention=db.demo while True: source, data = redisc

weixin_44652892的博客 955

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用scrapy-redis爬去新浪-以及把数据存储到mysql\mongo

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33796177的博客 460

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Scrapy 实战:编写一个分布式爬虫爬取海量数据。

Scrapy 是一个基于 Python 的快速、高层次的网络爬虫框架,用于抓取网页并提取结构化数据。其核心特性包括异步处理、内置数据管道(Pipeline)和中间件(Middleware)支持,适合构建分布式爬虫系统。

cqD_kuyq的博客 337

Python爬虫调度实战(Scrapy+Redis+Celery全解析)

掌握高效Python爬虫调度工具的完整方案,解决分布式采集与任务管理难题。结合Scrapy+Redis+Celery实现高并发、可扩展的爬虫系统,适用于大规模数据抓取场景。详解部署流程、任务队列与去重机制,提升爬虫稳定性与效率。实战配置步骤清晰,值得收藏。

codeink的博客 428

Python 异步协程:asyncio、async/await、aiohttp

Windows GUI 主线程消息循环是典型。

freeking101的博客 4390

Node.js 爬虫实战指南(三):分布式爬虫架构,让你的爬虫飞起来

摘要 本文介绍了从单机爬虫到分布式爬虫的演进过程。通过10台机器组成的爬虫集群,实现了从单机每天1万条到分布式每小时100万条的数据爬取能力提升。文章详细讲解了分布式爬虫架构设计,包括Master节点、Redis消息队列、Worker节点和MongoDB存储等核心组件,并提供了基于Node.js的代码实现方案,展示了如何利用任务队列和并发控制等技术实现高效的大规模数据爬取。

agions的博客 1738
上一篇: 多线程爬取一点资讯
下一篇: logging模块的使用
fiery_heart
博客等级 码龄9年 17粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值