QT/C++网络爬虫的内存池部分怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT/C++网络爬虫的内存池部分怎么写?相关的知识,希望对你有一定的参考价值。

挖掘新闻,下载整理后显示在界面上并输出到文本中 重点1.网页新闻的挖掘(实时更新) 重点2.文件的写入爬到的网页信息怎么接收并写入文件?

参考技术A 内存池先要了解概念,我以前遇到过两类,一类是为了防止碎片,每个内存池分块大小固定,这种内存池特点是可以从池里面申请和释放内存,不会产生碎片,池大小随压力峰值变化,参考boost::pool。另外一类是只申请,不是放的内存池,用于短时间内频繁申请释放内存的程序。内存会在池销毁时候一次性释放,术语临时性的内存池,参考pjsip里面的内存池。自己实现就免了。因为即使是自己实现也会面临着不同情况要选择不同的池策略。水平没到一定程度不建议自己写内存池。

玩爬虫封IP是最头痛的事情!从零搭建异步爬虫代理池!随你怎么封

 

如何使用

安装 Redis

项目数据库使用了 Redis,Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。所以请确保运行环境已经正确安装了 Redis。安装方法请参照官网指南。

进群:125240963  即可获取数十套PDF哦!

技术分享图片

 

技术分享图片

 

技术分享图片

 

技术分享图片

 

运行服务器,启动 web 服务

技术分享图片

 

总体架构

项目主要几大模块分别是爬取模块,存储模块,校验模块,调度模块,接口模块。

  • 爬取模块 负责爬取代理网站,并将所得到的代理存入到数据库,每个代理的初始化权值为 INIT_SCORE。
  • 存储模块 封装了 Redis 操作的一些接口,提供 Redis 连接池。
  • 校验模块 验证代理 IP 是否可用,如果代理可用则权值 +1,最大值为 MAX_SCORE。不可用则权值 -1,直至权值为 0 时将代理从数据库中删除。
  • 调度模块 负责调度爬取器和校验器的运行。
  • 接口模块 使用 sanic 提供 WEB API 。
技术分享图片

 

技术分享图片

 

技术分享图片

 

删除权值小于等于 score 的代理

技术分享图片

 

sanic 性能测试

使用 wrk 进行服务器压力测试。基准测试 30 秒, 使用 12 个线程, 并发 400 个 http 连接。

测试 http://127.0.0.1:3289/pop

技术分享图片

 

Requests/sec: 3081.87

关闭 sanic 日志记录,测试 http://127.0.0.1:3289/

技术分享图片

 

技术分享图片

 

可以看到其实性能是非常棒的,成功率极高。 wink

实际应用示例

技术分享图片

 

技术分享图片

 

划重点:aiohttp supports HTTP/HTTPS proxies

但是,它根本就不支持 https 代理好吧,在它的代码中是这样写的。

技术分享图片

 

划重点:Only http proxies are supported

我的心情可以说是十分复杂的。astonished 不过只有 http 代理效果也不错没什么太大影响,参见上面的测试数据。

参考借鉴项目

    • ProxyPool
    • proxy_pool

以上是关于QT/C++网络爬虫的内存池部分怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

玩爬虫封IP是最头痛的事情!从零搭建异步爬虫代理池!随你怎么封

Linux下C/C++ 手写一个线程池-

如何用Qt/C++访问Android摄像头

基于C#.NET的高端智能化网络爬虫

python爬虫怎么获取动态的网页源码

互联网金融爬虫怎么写-第二课 雪球网股票爬虫(正则表达式入门)