python使用tornado实现简单爬虫

 更新时间:2018年07月28日 09:08:58   作者:WangF0  
这篇文章主要为大家详细介绍了python使用tornado实现简单爬虫,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了python使用tornado实现简单爬虫的具体代码,供大家参考,具体内容如下

代码在官方文档的示例代码中有,但是作为一个tornado新手来说阅读起来还是有点困难的,于是我在代码中添加了注释,方便理解,代码如下:

# coding=utf-8
 #!/usr/bin/env python

import time
from datetime import timedelta

try:
  from HTMLParser import HTMLParser
  from urlparse import urljoin, urldefrag
except ImportError:
  from html.parser import HTMLParser
  from urllib.parse import urljoin, urldefrag

from tornado import httpclient, gen, ioloop, queues

 # 设置要爬取的网址
base_url = 'http://www.baidu.com'
 # 设置worker数量
concurrency = 10
 # 此代码会获取base_url下的所有其他url
@gen.coroutine
def get_links_from_url(url):

  try:
    # 通过异步向url发起请求
    response = yield httpclient.AsyncHTTPClient().fetch(url)
    print('fetched %s' % url)
    # 响应如果是字节类型 进行解码
    html = response.body if isinstance(response.body, str) \
      else response.body.decode(errors='ignore')
    # 构建url列表
    urls = [urljoin(url, remove_fragment(new_url))
        for new_url in get_links(html)]
  except Exception as e:
    print('Exception: %s %s' % (e, url))
    # 报错返回空列表
    raise gen.Return([])
  # 返回url列表
  raise gen.Return(urls)


def remove_fragment(url):
  #去除锚点
  pure_url, frag = urldefrag(url)

  return pure_url


def get_links(html):
  #从html页面里提取url
  class URLSeeker(HTMLParser):
    def __init__(self):
      HTMLParser.__init__(self)
      self.urls = []

    def handle_starttag(self, tag, attrs):
      href = dict(attrs).get('href')
      if href and tag == 'a':
        self.urls.append(href)

  url_seeker = URLSeeker()
  url_seeker.feed(html)
  return url_seeker.urls


@gen.coroutine
def main():
  # 创建队列
  q = queues.Queue()
  # 记录开始时间戳
  start = time.time()
  # 构建两个集合
  fetching, fetched = set(), set()

  @gen.coroutine
  def fetch_url():
    # 从队列中取出数据
    current_url = yield q.get()
    try:
      # 如果取出的数据在队列中已经存在 返回
      if current_url in fetching:
        return

      print('fetching %s' % current_url)
      # 如果不存在添加到集合当中
      fetching.add(current_url)
      # 从新放入的链接中继续获取链接
      urls = yield get_links_from_url(current_url)
      # 将已经请求玩的url放入第二个集合
      fetched.add(current_url)

      for new_url in urls:
        # Only follow links beneath the base URL
        # 如果链接是以传入的url开始则放入队列
        if new_url.startswith(base_url):
          yield q.put(new_url)

    finally:
      # 队列内数据减一
      q.task_done()

  @gen.coroutine
  def worker():
    while True:
      # 保证程序持续运行
      yield fetch_url()
  # 将第一个url放入队列
  q.put(base_url)

  # Start workers, then wait for the work queue to be empty.
  for _ in range(concurrency):
    # 启动对应数量的worker
    worker()
  # 等待队列数据处理完成
  yield q.join(timeout=timedelta(seconds=300))
  # 如果两个集合不相等抛出异常
  assert fetching == fetched
  # 打印执行时间
  print('Done in %d seconds, fetched %s URLs.' % (
    time.time() - start, len(fetched)))


if __name__ == '__main__':
  io_loop = ioloop.IOLoop.current()
  io_loop.run_sync(main)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python错误处理操作示例

    Python错误处理操作示例

    这篇文章主要介绍了Python错误处理操作,结合实例形式分析了Python使用try...except...finaly语句进行错误处理的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-07-07
  • Python模块的加载讲解

    Python模块的加载讲解

    今天小编就为大家分享一篇关于Python模块的加载讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python基于pandas实现json格式转换成dataframe的方法

    Python基于pandas实现json格式转换成dataframe的方法

    这篇文章主要介绍了Python基于pandas实现json格式转换成dataframe的方法,结合实例形式分析了Python使用pandas模块操作json数据转换成dataframe的相关操作技巧与注意事项,需要的朋友可以参考下
    2018-06-06
  • MySQL中表的复制以及大型数据表的备份教程

    MySQL中表的复制以及大型数据表的备份教程

    这篇文章主要介绍了MySQL中表的复制以及大型数据表的备份教程,其中大表备份是采用添加触发器增量备份的方法,需要的朋友可以参考下
    2015-11-11
  • VSCode搭建Django开发环境的图文步骤

    VSCode搭建Django开发环境的图文步骤

    本篇介绍在vscode环境下搭建Django开发环境的详细步骤,包括Python、Django、VSCode等,以及它们的安装和配置方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 快速进修Python指南之异常捕获

    快速进修Python指南之异常捕获

    这篇文章主要为大家介绍了Java开发者快速进修Python指南之异常捕获, 有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Django全局启用登陆验证login_required的方法

    Django全局启用登陆验证login_required的方法

    这篇文章主要介绍了Django全局启用登陆验证login_required的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)

    Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)

    Python是一种非常强大的脚本语言,可以用来实现各种复杂的应用,其中之一就是文本转语音,即把文字转换成声音来发出,下面这篇文章主要给大家介绍了关于Python语音合成之第三方库gTTs/pyttsx3/speech横评的相关资料,文中还介绍了详细的使用方法,需要的朋友可以参考下
    2023-05-05
  • 列举Python中吸引人的一些特性

    列举Python中吸引人的一些特性

    这篇文章主要介绍了Python中吸引人的一些特性,有助于初学者或者开发者在选择编程语言时用作参考或入门指引,需要的朋友可以参考下
    2015-04-04
  • 新手入门Python编程的8个实用建议

    新手入门Python编程的8个实用建议

    这篇文章主要介绍了Python编程的8个实用建议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论