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. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据

    springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...

  2. image-webpack-loader在mac或ubuntu报错

    解决办法安装libpng库,在github issue https://github.com/tcoopman/image-webpack-loader/issues/49可查看 mac: brew ...

  3. gimp怎么移动选取中的图像并创建图层

    gimp怎么移动选取中的图像并创建图层 https://jingyan.baidu.com/article/414eccf6bf4d6e6b431f0a3b.html 听语音 原创 | 浏览:1148 ...

  4. Ubunut16.04 安装 Theano+GPU

    1. 更新NVIDIA显卡驱动   安装好系统之后首先在系统更新管理器中更新显卡驱动,如下图 点击Apply Changes 2. 安装numpy,scipy,theano pip安装即可 sudo ...

  5. JavaScript基础入门06

    目录 JavaScript 基础入门06 Math 对象 Math对象的静态属性 Math对象的静态方法 指定范围的随机数 返回随机字符 三角函数 Date对象 基础知识 日期对象具体API 构造函数 ...

  6. IntelliJ IDEA 2018 for Mac专业使用技巧

    IntelliJ IDEA 2018 for Mac是一个综合性的Java编程环境,被许多开发人员和行业专家誉为市场上最好的IDE,它提供了一系列最实用的的工具组合:智能编码辅助和自动控制,支持J2E ...

  7. LCTF (easyeasy-200)

    首先安装,看看app是什么样的. 有点奇怪,没有点击确定的按钮.然后拖到JEB反编译. 要求输入的字符串的长度要在35-39之间(包括边界值),然后会调用Format().form函数.如下图. 可以 ...

  8. ASP.NET(C#) 面试总结面试题大全

    一.对于 Web 性能优化,您有哪些了解和经验吗?出现指数:五颗星主要考点:这道题是博主在博客园的新闻里面看到的,回想之前几年的面试经历,发现此题出现概率还是比较高的.因为它的考面灰常广,可以让面试官 ...

  9. python AI换脸 用普氏分析法(Procrustes Analysis)实现人脸对齐

    1.图片效果 2.原代码 # !/usr/bin/python # -*- coding: utf-8 -*- # Copyright (c) 2015 Matthew Earl # # Permis ...

  10. JSON与对象,集合之间的转换

    https://www.cnblogs.com/xiatc/p/8952739.html