Tornado 并发网络爬虫

这是一个官网上的例子,不过在此加入了自己的一些理解。

官网链接

Tornado的 tornado.queues 模块实现了异步生产者/消费者模式的协程, 类似于 通过Python 标准库的 queue 实现线程模式.
一个yield Queue.get 的协程会暂停直到队列中有值,才会get到东西.
如果队列设置了最大长度,那么 yield Queue.put的协程会暂停直到队列中有额外空间.
一个 Queue 从0开始对完成的任务进行计数. put 加计数; task_done 减少计数.
这里的网络爬虫的例子, 队列开始的时候只包含 base_url. 当一个worker抓取到一个页面 它会解析链接并把它添加到队列中, 然后调用 task_done减少计数一次. 最后, 当一个worker抓取到的页面URL都是之前抓取到过的并且队列中没有任务了. 于是worker调用 task_done 把计数减到0. 等待 join 的主协程取消暂停并且完成.

代码:

import time
from datetime import timedelta
from html.parser import HTMLParser
from urllib.parse import urljoin, urldefrag
from tornado import gen, httpclient, ioloop, queues

base_url = "http://www.tornadoweb.org/en/stable"
concurency = 10		# 并发数是10

async def get_links_from_url(url):
    # 首先拿到页面中的数据
    response = await httpclient.AsyncHTTPClient().fetch(url)
    print("fetched %s " % url)
    html = response.body.decode(errors='ignore')
    # 然后通过页面内容爬取所有链接回来
    return [urljoin(url, remov
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值