bee_server.py

from sanic import Sanic
from sanic import response
from urlpool import UrlPool #初始化urlpool,很久需要进行修改
urlpool = UrlPool(__file__) #初始化url
urlpool.add('https://news.sina.com.cn/')
app = Sanic(__name__) @app.listener("after_server_stop")
async def cache_urlpool(app,loop):
global urlpool
print("caching urlpool after_server_stop")
del urlpool
print("bye!") @app.route("/task")
async def task_get(request):
count = request.args.get("count",10)
try:
count = int(count)
except:
count = 10
urls = urlpool.pop(count)
return response.json(urls) @app.route("/task",methods=["POST",])
async def task_post(requrst):
result = requrst.json()
urlpool.set_status(result['url'],result['status'])
if result['url_real'] != result['url']:
urlpool.set_status(result["url_real"],result["status"])
if result["newurls"]:
print("receive URLs:",len(result["newurls"]))
for url in result["newurls"]:
urlpool.add(url)
return response.text("ok") if __name__ == '__main__':
app.run(
host='127.0.0.1',
port = 8080,
debug=False,
access_log=False,
workers=1
)

bee_client.py

import aiohttp
import json
import asyncio
import traceback
import time class CrawlerClient:
def __init__(self):
self._workers = 0
self.workers_max = 10
self.server_host = "localhost"
self.server_port = 8080
self.session = aiohttp.ClientSession(loop=self.loop)
self.queue = asyncio.Queue async def get_url(self):
count = self.workers_max-self.queue.qsize()
if count <= 0:
print("no need to get urls this time") url = "http://%S:%S/task?count=%s" % (self.server_host,self.server_port,count)
try:
async with self.session.get(url,timeout = 3) as response:
if response.status not in [200,201]:
return
jsn = await response.text()
urls = json.loads(jsn)
msg = ('get_urls() to get [%s] but got[%s],@%s') % (count,len(urls),time.strftime('%Y-%m-%d %H:%M:%S'))
print(msg)
for lv in urls.items():
await self.queue.put(lv)
print()
except:
traceback.print_exc()
return async def send_result(self,result):
'''
result = {
"url“:url,
'url_real':response.url,
'status':status,
"newurls":newurls,
}
'''
url = "http://%S:%S/task" % (self.server_host,self.server_port)
try:
async with self.session.post(url,json = result,timeout = 3) as response:
response.status
except:
traceback.print_exc()
pass

使用sanic框架实现分布式爬虫的更多相关文章

  1. 基于Python使用scrapy-redis框架实现分布式爬虫

    1.首先介绍一下:scrapy-redis框架 scrapy-redis:一个三方的基于redis的分布式爬虫框架,配合scrapy使用,让爬虫具有了分布式爬取的功能.github地址: https: ...

  2. 基于scrapy框架的分布式爬虫

    分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...

  3. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  4. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

  5. 分布式爬虫框架XXL-CRAWLER

    <分布式爬虫框架XXL-CRAWLER> 一.简介 1.1 概述 XXL-CRAWLER 是一个分布式爬虫框架.一行代码开发一个分布式爬虫,拥有"多线程.异步.IP动态代理.分布 ...

  6. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合

    简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...

  7. 爬虫开发14.scrapy框架之分布式操作

    分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-wi ...

  8. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  9. Scrapy框架之基于RedisSpider实现的分布式爬虫

    需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...

  10. Python分布式爬虫必学框架Scrapy打造搜索引擎

    Python分布式爬虫必学框架Scrapy打造搜索引擎 部分课程截图: 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/1-wHr4dTAxfd51M ...

随机推荐

  1. Kibana管理

    这里是用来管理您的 kibana 运行时配置的地方,包括初始化配置和后续的索引模式配置.高级设置等.您可以调整 kibana 自身的行为,也可以编辑您通过 kibana 保存的查询.视图.仪表板等各种 ...

  2. Kubernetes(k8s)通过环境变量将 Pod 信息呈现给容器

    Downward API 有两种方式可以将 Pod 和 Container 字段呈现给运行中的容器: 环境变量 卷文件 这两种呈现 Pod 和 Container 字段的方式统称为 Downward ...

  3. CAS核心思想、底层实现

    ★ 1.CAS 是什么 CAS 是比较并交换,是实现并发算法时常用到的一种技术.当内存的值和期望的值相等时,进行更新,否则 什么都不做 或 重来 . CAS 的底层实现:是靠硬件实现的,靠硬件的原子性 ...

  4. 1.2.2 musl pwn

    1.2.2 musl pwn 几个结构 __malloc_context(与glibc中的main_arena类似) struct malloc_context { uint64_t secret; ...

  5. 三、docker镜像管理

    一.docker镜像管理 1.1.镜像搜索-search 从docker镜像仓库模糊搜索镜像 用法: docker search 镜像关键字 [root@zutuanxue ~]# docker se ...

  6. Centos镜像下载

    1.进入官网,并点击下图所示的红框(alternative downloads) 官网网址:https://www.centos.org/download/  2.在往下翻,可以看到如下图的历史版本, ...

  7. 三种梯度下降法的对比(BGD & SGD & MBGD)

    常用的梯度下降法分为: 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic Gradient Descent) 小批量梯度下降法(Mini-Batch ...

  8. vulnhub靶场之NOOB: 1

    准备: 攻击机:虚拟机kali.本机win10. 靶机:NOOB: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub.com/noob ...

  9. HTML躬行记(4)——Web音视频基础

    公司目前的业务会接触比较多的音视频,所以有必要了解一些基本概念. 文章涉及的一些源码已上传至 Github,可随意下载. 一.基础概念 本节音视频的基础概念摘自书籍<FFmpeg入门详解 音视频 ...

  10. (线段树) P4588 数学计算

    小豆现在有一个数 x,初始值为 1.小豆有 QQ 次操作,操作有两种类型: 1 m:将 x变为 x × m,并输出 x mod M 2 pos:将 x 变为 x 除以第 pos次操作所乘的数(保证第  ...