from pyquery import PyQuery as pq
from tornado import ioloop, gen, httpclient, queues
from urllib.parse import urljoin base_url = "http://www.baidu.com"
concurrency = 8 async def get_url_links(url):
response = await httpclient.AsyncHTTPClient().fetch(url)
html = response.body.decode("utf-8")
p = pq(html)
links = []
for tag_a in p("a").items():
links.append(urljoin(base_url, tag_a.attr("href")))
return links async def main():
seen_set = set()
q = queues.Queue() async def fetch_url(current_url):
if current_url in seen_set:
return print(f"获取:{current_url}")
seen_set.add(current_url) next_urls = await get_url_links(current_url)
for next_url in next_urls:
if next_url.startswith(base_url):
await q.put(next_url) async def worker():
async for url in q:
if url is None:
return
try:
await fetch_url(url)
except Exception as e:
print(f"exception:{e}")
finally:
# 计数器,每进入一个就加1,所以我们调用完了之后,要减去1
q.task_done() # 放入初始url到队列
await q.put(base_url) # 启动协程,同时开启三个消费者
workers = gen.multi([worker() for _ in range(3)]) # 会阻塞,直到队列里面没有数据为止
await q.join() for _ in range(concurrency):
await q.put(None) # 等待所有协程执行完毕
await workers if __name__ == '__main__':
ioloop.IOLoop.current().run_sync(main)
"""
获取:http://www.baidu.com
获取:http://www.baidu.com/gaoji/preferences.html
获取:http://www.baidu.com/
获取:http://www.baidu.com/more/
获取:http://www.baidu.com/s?rtt=1&bsst=1&cl=2&tn=news&word=
获取:http://www.baidu.com/cache/sethelp/help.html
获取:http://www.baidu.com/duty/
获取:http://www.baidu.com/search/jiqiao.html
获取:http://www.baidu.com#iec
获取:http://www.baidu.com#circle
获取:http://www.baidu.com#aoyouc
获取:http://www.baidu.com#sougouc
获取:http://www.baidu.com#qqtc
获取:http://www.baidu.com#ttc
获取:http://www.baidu.com#ffc
获取:http://www.baidu.com#chromec
获取:http://www.baidu.com#jishu360c
获取:http://www.baidu.com#world_jishuc
获取:http://www.baidu.com#operac
获取:http://www.baidu.com#worldc
获取:http://www.baidu.com#safaric
获取:http://www.baidu.com#greenc
获取:http://www.baidu.com#krc
获取:http://www.baidu.com#bdbrowserc
获取:http://www.baidu.com/duty/index.html
获取:http://www.baidu.com/copyright.html
获取:http://www.baidu.com/mianze-shengming.html
获取:http://www.baidu.com/right.html
获取:http://www.baidu.com/yinsiquan-policy.html
获取:http://www.baidu.com/yinsiquan-sub.html
获取:http://www.baidu.com/baozhang.html
获取:http://www.baidu.com/index
获取:http://www.baidu.com/search?keywords=%E7%99%BE%E5%BA%A6%E5%B8%90%E5%8F%B7%E8%A2%AB%E5%B0%81%E7%A6%81
获取:http://www.baidu.com/search?keywords=%E5%A6%82%E4%BD%95%E4%B8%BE%E6%8A%A5%E7%BD%91%E7%AB%99
获取:http://www.baidu.com/search?keywords=%E6%8A%95%E8%AF%89%E4%BE%B5%E6%9D%83%E4%BF%A1%E6%81%AF
获取:http://www.baidu.com/search?keywords=%E7%99%BE%E5%BA%A6%E5%B8%90%E5%8F%B7%E8%A2%AB%E7%9B%97
获取:http://www.baidu.com/search?keywords=%E5%B8%90%E5%8F%B7%E7%94%B3%E8%AF%89%E6%9C%AA%E9%80%9A%E8%BF%87
获取:http://www.baidu.com/search?keywords=%E8%B4%B4%E5%90%A7%E8%B4%B4%E5%AD%90%E8%A2%AB%E5%88%A0
获取:http://www.baidu.com/search?keywords=%E5%88%A0%E9%99%A4%2F%E6%9B%B4%E6%96%B0%E5%BF%AB%E7%85%A7
获取:http://www.baidu.com/zhifu
获取:http://www.baidu.com/jubao
获取:http://www.baidu.com/statement
获取:http://www.baidu.com/personalinformation
获取:http://www.baidu.com/more/index.html
获取:http://www.baidu.com/search/jubao.html
"""

tornado实现高并发爬虫的更多相关文章

  1. 1.tornado实现高并发爬虫

    from pyquery import PyQuery as pq from tornado import ioloop, gen, httpclient, queues from urllib.pa ...

  2. tornado解决高并发的初步认识牵扯出的一些问题

    #!/bin/env python # -*- coding:utf-8 -*- import tornado.httpserver import tornado.ioloop import torn ...

  3. Python Tornado搭建高并发Restful API接口服务

    Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快能实现高并发.得利于其 非阻塞的方式和对epoll的运用,Torn ...

  4. Surfer 高并发双核无头浏览器 (Golang语言)

    Surfer   A high level concurrency downloader. surfer是一款Go语言编写的高并发爬虫下载器,拥有surf与phantom两种下载内核. 支持固定Use ...

  5. tornado 采用 epoll 代理构建高并发网络模型

    1 阻塞和非阻塞  对于阻塞和非阻塞,网上有一个很形象的比喻,就是说好比你在等快递,阻塞模式就是快递如果不到,你就不能做其他事情.非阻塞模式就是在这段时间里面,你可以做其他事情,比如上网.打游戏.睡觉 ...

  6. 在Centos下对高并发web框架Tornado的性能进行测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_89 在之前的一篇文章中,我们在1g1核的惨淡硬件环境下,对 uwsgi + django 和 gunicorn+ django 的 ...

  7. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  8. nginx应用总结(2)--突破高并发的性能优化

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

  9. PHP秒杀系统-高并发高性能的极致挑战

    慕课网实战教程后端:1.java c++算法与数据结构2.java Spring Boot带前后端 渐进式开发企业级博客系统3.java Spring Boot企业微信点餐系统4.java Sprin ...

随机推荐

  1. js __proto__ 和prototype的联系

    1.Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法,也就是说,Object.prototype是所有对象的爸爸.(个人感觉搞清楚这一点很重要 ...

  2. Can not find connection pool config file

    暂时未解决 checkActivation=====================true Can Not Parse ConnectionCfg! 2019/10/12-11:23:38 > ...

  3. Beego框架的一条神秘日志引发的思考

    公司目前的后台是用Beego框架搭的,并且为了服务的不中断升级,我们开启了Beego的Grace模块,用于热升级支持.一切都跑井然有序,直到有一天,领导甩出一些服务日志,告知程序一直报错: 2018/ ...

  4. (转)arcengine+c# 修改存储在文件地理数据库中的ITable类型的表格中的某一列数据,逐行修改。更新属性表、修改属性表某列的值。

    作为一只菜鸟,研究了一个上午+一个下午,才把属性表的更新修改搞了出来,记录一下: 我的需求是: 已经在文件地理数据库中存放了一个ITable类型的表(不是要素类FeatureClass),注意不是要素 ...

  5. 10分钟学会web通讯的四种方式,短轮询、长轮询(comet)、长连接(SSE)、WebSocket

    一般看到标题我们一般会产生下面几个问题??? 什么是短轮询? 什么是长轮询? 长连接又是什么? wensocket怎么实现呢? 他们都能实现web通讯,区别在哪呢,哪个好用呢? 接下来我们就一个个来了 ...

  6. [转帖]linux中systemctl详细理解及常用命令

    linux中systemctl详细理解及常用命令 2019年06月28日 16:16:52 思维的深度 阅读数 30 https://blog.csdn.net/skh2015java/article ...

  7. 【计算机网络】-介质访问控制子层-无线LAN

    [计算机网络]-介质访问控制子层-无线LAN 802.11体系结构和协议栈 802.11网络使用模式: 有架构模式(Infrastructure mode) 无线客户端连接接入点AP,叫做有架构模式 ...

  8. 使用Redis實現秒殺功能

    <?php $id = 1; $pdo=new PDO("mysql:host=127.0.0.1;dbname=test","root","r ...

  9. python-1:正则表达式(基础知识点)

    1.简单匹配: \d  →匹配一个数字 \w →匹配一个数字或字母 \s  →匹配一个空格(包括tab等空白符) .    →匹配任意字符 *   →匹配任意个字符(包括0个) +  →匹配至少一个字 ...

  10. Django创建数据库常用字段及参数

    Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...