1. import aiohttp
  2. import asyncio
  3. import async_timeout
  4. from urllib.parse import urljoin, urldefrag
  5.  
  6. root_url = "http://python.org/"
  7. crawled_urls, url_hub = [], [root_url, "%s/sitemap.xml" % (root_url), "%s/robots.txt" % (root_url)]
  8. headers = {'user-agent': 'Opera/9.80 (X11; Linux x86_64; U; en) Presto/2.2.15 Version/10.10'}
  9.  
  10. async def get_body(url):
  11. async with aiohttp.ClientSession() as session:
  12. try:
  13. with async_timeout.timeout(10):
  14. async with session.get(url, headers=headers) as response:
  15. if response.status == 200:
  16. html = await response.text()
  17. return {'error': '', 'html': html}
  18. else:
  19. return {'error': response.status, 'html': ''}
  20. except Exception as err:
  21. return {'error': err, 'html': ''}
  22.  
  23. async def handle_task(task_id, work_queue):
  24. while not work_queue.empty():
  25. queue_url = await work_queue.get()
  26. if not queue_url in crawled_urls:
  27. crawled_urls.append(queue_url)
  28. body = await get_body(queue_url)
  29. if not body['error']:
  30. for new_url in get_urls(body['html']):
  31. if root_url in new_url and not new_url in crawled_urls:
  32. work_queue.put_nowait(new_url)
  33. else:
  34. print(f"Error: {body['error']} - {queue_url}")
  35.  
  36. def remove_fragment(url):
  37. pure_url, frag = urldefrag(url)
  38. return pure_url
  39.  
  40. def get_urls(html):
  41. new_urls = [url.split('"')[0] for url in str(html).replace("'",'"').split('href="')[1:]]
  42. return [urljoin(root_url, remove_fragment(new_url)) for new_url in new_urls]
  43.  
  44. if __name__ == "__main__":
  45. q = asyncio.Queue()
  46. [q.put_nowait(url) for url in url_hub]
  47. loop = asyncio.get_event_loop()
  48. tasks = [handle_task(task_id, q) for task_id in range(3)]
  49. loop.run_until_complete(asyncio.wait(tasks))
  50. loop.close()
  51. for u in crawled_urls:
  52. print(u)
  53. print('-'*30)
  54. print(len(crawled_urls))

  

asyncio Queue的使用例子的更多相关文章

  1. python中利用队列asyncio.Queue进行通讯详解

    python中利用队列asyncio.Queue进行通讯详解 本文主要给大家介绍了关于python用队列asyncio.Queue通讯的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细 ...

  2. threading包的例子和queue包的例子

    参考:https://www.cnblogs.com/tkqasn/p/5700281.html 参考:https://www.cnblogs.com/tkqasn/p/5700281.html th ...

  3. asyncio queue

    from asyncio import Queue,sleep import asyncio from threading import Thread import time qu=Queue() # ...

  4. rabbit的简单搭建,java使用rabbitmq queue的简单例子和一些坑

    一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的项目地址https://github.com/247292980/spring-boot 以整 ...

  5. python 多进程使用Queue通信的例子

    import time from multiprocessing import Process,Queue MSG_QUEUE = Queue(5) def startA(msgQueue): whi ...

  6. python异步编程模块asyncio学习(二)

    尽管asyncio应用通常作为单线程运行,不过仍被构建为并发应用.由于I/O以及其他外部事件的延迟和中断,每个协程或任务可能按一种不可预知的顺序执行.为了支持安全的并发执行,asyncio包含了thr ...

  7. 深入Asyncio(二)从线程到协程

    线程的真相 多线程并不是一无是处,在实际问题中,要权衡优劣势来选择多线程.多进程或是协程.协程为多线程的某些问题提供了一种解决方案,所以学习协程首先要对线程有一定了解. 多线程优点 代码可读性 多线程 ...

  8. 深入Asyncio(三)Asyncio初体验

    Asyncio初体验 Asyncio在Python中提供的API很复杂,其旨在替不同群体的人解决不同的问题,也正是由于这个原因,所以很难区分重点. 可以根据asyncio在Python中的特性,将其划 ...

  9. asyncio:python3未来并发编程主流、充满野心的模块

    介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...

随机推荐

  1. 《老梁四大名著情商课》笔记-学学TA,你就是聚会的万人迷

    <老梁四大名著情商课>笔记-学学TA,你就是聚会的万人迷 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 现在社会学家有一个统计,说中国处在单身状态大概有2个亿.这些人中 ...

  2. shiro的基本认识及做一个简单的授权登陆的例子

    先推荐一个网站,无意中发现的.感觉蛮好的. 推荐一套完整的Shiro Demo,免费的.Shiro Demo:http://www.sojson.com/shiroDemo已经部署到线上,地址是htt ...

  3. Elasticsearch集群节点配置详解

    注意:如果是在局域网中运行elasticsearch集群也是很简单的,只要cluster.name设置一致,并且机器在同一网段下,启动的es会自动发现对方,组成集群. 2.elasticsearch- ...

  4. Oracle12c开启scott账户

    在oracle目录app\orcl\product\12.1.0\dbhome_1\NETWORK\ADMIN\下tnsnames.ora文件最后加入以下内容 PDBORCL = (DESCRIPTI ...

  5. css3实现单行文本溢出显示省略号

    文本超出一定宽度让其隐藏,以省略号替代 width:200px; white-space:nowrap; text-overflow:ellipsis; overflow:hidden; 如下图

  6. for each循环(增强for循环)

    底层实现是使用了迭代器,简化了迭代器的书写 格式: for(集合/数组的数据类型 变量名: 数组名/集合名) { // body } char[] chars = {'c', 'd', 'd', 'e ...

  7. DBUtils数据库连接池

    DBUtils pip install DBUtils 模式一: 为每个线程创建一个连接.(内部是通过threading.local实现的) 模式二: 创建一定个数的连接,所有线程都来连接池中获取.( ...

  8. Javaweb学习笔记——(十八)——————事务、DBCP、C3P0、装饰者模式

    事务     什么是事务?         转账:             1.给张三账户减1000元             2.给李四账户加1000元 当给张三账户减1000元之后,抛出了异常,这 ...

  9. redis整合Spring集群搭建及业务中的使用

    1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...

  10. 【U3d】场景加载-GameStart!

    目的:实现点击按钮场景切换 一共四个步骤,轻松食用(ง •̀_•́)ง 1. GameObject→UI→Button向开始场景中添加按钮,示例如下 2. 新建script——"LoadSc ...