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如何利用wxauto实现微信群发消息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • python通过Seq2Seq实现闲聊机器人

    python通过Seq2Seq实现闲聊机器人

    这篇文章主要介绍了python通过Seq2Seq实现闲聊机器人,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-04-04
  • python 对多个csv文件分别进行处理的方法

    python 对多个csv文件分别进行处理的方法

    今天小编就为大家分享一篇python 对多个csv文件分别进行处理的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中qutip用法示例详解

    Python中qutip用法示例详解

    这篇文章主要给大家介绍了关于Python中qutip用法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python操作MySQL数据库的方法

    Python操作MySQL数据库的方法

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。接下来通过本文给大家介绍Python操作MySQL数据库的方法,感兴趣的朋友一起看看吧
    2018-06-06
  • python实现桌面壁纸切换功能

    python实现桌面壁纸切换功能

    这篇文章主要为大家详细介绍了python requests+pywin32实现桌面壁纸切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 图片去摩尔纹简述实现python代码示例

    图片去摩尔纹简述实现python代码示例

    这篇文章主要为大家介绍了图片去摩尔纹简述实现的python代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • python全栈要学什么 python全栈学习路线

    python全栈要学什么 python全栈学习路线

    在本文中小编给大家整理了关于python全栈要学什么以及python全栈学习路线的知识点内容,需要的朋友们参考下。
    2019-06-06
  • Python定时库Apscheduler的简单使用

    Python定时库Apscheduler的简单使用

    Apscheduler是基于Quartz的Python定时任务框架,功能上跟Quartz一致,使用上跟Quartz也几乎一致。下面通过本文给大家介绍Python定时库Apscheduler的简单使用,感兴趣的朋友一起看看吧
    2021-11-11
  • Python3批量移动指定文件到指定文件夹方法示例

    Python3批量移动指定文件到指定文件夹方法示例

    这篇文章主要给大家介绍了关于Python3批量移动指定文件到指定文件夹的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python3具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09

最新评论