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. 5.使用nexus3配置npm私有仓库

    当我们运行前端项目的时候,常常在解决依赖的时候会加上一个参数npm install --registry=https://registry.npm.taobao.org将源指定为淘宝的源,以期让速度加 ...

  2. 简书是如何把用户wo逼疯的

    趁验证码还有一分钟时间,吐槽一下简书. 准备开始在简书写文章,遇到一些问题. 一.markdown的问题 1.不支持html 2....... 二.绑定手机--这是一个bug 我原来是使用邮箱注册的, ...

  3. InetAddress.getLocalHost() 执行很慢?

    背景介绍 某次在 SpringBoot 2.2.0 项目的一个配置类中引入了这么一行代码: InetAddress.getLocalHost().getHostAddress() 导致项目启动明显变慢 ...

  4. Java Style的C++容器流式处理类

    很久没有上博客园了,最近一段时间,因为工作的关系时间上比较闲,利用闲暇时间重新翻了一下丢弃很久的C++语言.C++从98.11.14.17目前已经也走到了20版本,发生了很多变化,也引入了很多新的语言 ...

  5. Windows应急响应——敬请期待!

    检查内容 进程.服务.用户.网络连接.漏洞补丁.木马查杀. 工具 火绒剑. 防护措施 杀毒软件

  6. jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上

    jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上 1.JavaBean的使用 package com.zheng; public class BookBean { ...

  7. break ,continue,retrun的区别

    break ,continue,retrun的区别 1:break 在循环体内结束整个循环过程 for (var i = 1; i <= 5; i++) { if(i == 3){ break; ...

  8. Android RecyclerView使用ListAdapter高效刷新数据

    原文:Android RecyclerView使用ListAdapter高效刷新数据 - Stars-One的杂货小窝 我们都知道,当RecyclerView数据源更新后,还需要通过adapter调用 ...

  9. <四>1:全面掌握Const的用法

    const怎么理解? const修饰的变量不能够在作为左值!!初始化完成后,值不能被修改!! C 和C++中const 的区别? 在C程序中 test.c const int a; 只定义,不做初始化 ...

  10. appium 移动端自动化测试工具

    appium 移动端自动化测试工具 appium 移动端自动化测试工具 appium 是哟个自动化测试开源工具 支持ios和安卓平台的应用 以及web应用和混合应用 appium 是一个跨平台的工具: ...