tornado 获取html,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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

李德毅院士:通用人工智能十问

来源:学术头条共识:智能是学习的能力,以及解释、解决问题的能力;人工智能是脱离生命体的智能,是人类智能的体外延伸;通用人工智能通过不断学习,积累本领,进化成长,能够面…

gdt描述_全局描述符表GDT

写在前面添油加醋系列第二弹——剖析GDT话说C语言的话除了刷刷OJ外,就是用来实现操作系统这个大头了。C语言比C少了很多很多臃肿的语法特性,写起来非常优美(至少写操作系统是这样的)。虽说C有许多的奇技淫巧,一个算法有N种实现方法&#xff0…

咸阳高考成绩查询2021,2021咸阳市地区高考成绩排名查询,咸阳市高考各高中成绩喜报榜单...

距离2018年高考还有不到一个月的时间了,很多人在准备最后冲刺的同时,也在关心高考成绩。2018各地区高考成绩排名查询,高考各高中成绩喜报榜单尚未公布,下面是往年各地区高考成绩排名查询,高考各高中成绩喜报榜单,想要了解同学可以…

云计算与人工智能

来自:cnblogs.com/popsuper1982/p/8505203.html我今天要讲这三个话题,一个是云计算,一个大数据,一个人工智能,我为什么要讲这三个东西呢?因为这三个东西现在非常非常的火,它们之间好像互相有关系…

泸西一中2021高考成绩查询,云南红河州四所好高中,红河州一中一本率领先,建水一中不容小觑...

红河州地处我国西南,是一个常住人口超过467万的多民族聚居边疆自治州(地级行政区划),下辖4市(县级)、9县(其中3个自治县),经济总量在全省仅次于昆明与曲靖,是一个综合实力较强的自治州。红河州的基础教育实力相当不错,…

Date类

Date:是时间对象,它也是对象数据类型的一个细分 获取的是当前自己电脑的时间(获取客户端的时间) var nowTime new Date(); GMT:格林尼治时间(经纬度都是0) 中国是 GMT0800 东八区 美国是 UTC-0…

python 遍历list_Python列表遍历知多少

遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能。在生活中,如果想要去商场买一件衣服,就需要在商场中逛一圈,看是否有想要买的衣服。逛商场的过程相当于列表的遍历操作。在Python中遍历列表的方法…

【JavaWeb】Maven(学习笔记)

一、Maven概述 1、Maven Maven 是一个项目管理工具 2、Maven解决的问题 jar 包问题编译测试运行打包 3、Maven的组成 项目对象模型 :pom.xml标准集合:目录结构标准一个项目生命周期(Project Lifecycle)依赖管理系统:通过配置文件管理用…

高中计算机学考操作ppt,高中信息技术基础学考专题复习(共25张PPT)

ID:11883433资源大小:308KB资料简介:信息的加工与管理 信息资源管理 计算机的功能与特征 文字处理:WORD 图表处理:EXCEL 多媒体信息处理:图像、音频、视频基本概念 算法及其实现 信息资源管理基本概念 网上数据的管理 数据库系统及简单应用:ACCESS 信息的表达 信息的…

自我监督学习:AI技术的未来发展方向

尽管深度学习已经在人工智能领域做出重大贡献,但这项技术本身仍存在一项致命缺陷:需要大量数据的加持。来源丨The Next Web尽管深度学习已经在人工智能领域做出重大贡献,但这项技术本身仍存在一项致命缺陷:需要大量数据的加持。深…

vue8 生命周期

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>智能社——http://www.zhinengshe.com</title><meta name"viewport" content"widthdevice-width, initial-scale1.0, maximum…

简述css属性选择器的几种定义方式_CSS简介,语法,选择器分类使用,属性设置

1.CSS简介CSS(Cascading Style Sheets)通常称为CSS样式表或层叠样式表(级联样式表)&#xff0c;主要用于设置HTML页面中的文本内容(字体、大小、对齐方式等)、图片的外形(宽高、边框样式、边距等)以及版面的布局等外观显示样式。CSS以HTML为基础&#xff0c;提供了丰富的功能&a…

AI无间道!清华AI团队推出AI安全平台,欺骗顶尖人脸算法后又强势修复漏洞

随着人工智能技术的发展&#xff0c;人工智能在很多场景里正逐渐替代或协作着人类的各种劳动&#xff0c;它们可以成为人类的眼睛、耳朵、手臂甚至大脑。其中&#xff0c;机器视觉作为AI时代的基础技术&#xff0c;其背后的AI算法一直是各科技巨头和创业公司共同追逐的热点。然…

计算机组装与维护预实验报告,计算机组装与维护实验报告.doc

计算机组装与维护实验报告计算机组装与维护实验报告江西公安专科学校实 验 报 告课程名称年级专业学 号姓 名\实 验 报 告 说 明1.实验项目名称&#xff1a;要用最简练的语言反映实验的内容。要求与实验教学大纲或实验指导书相一致。2.实验类型&#xff1a;一般需说明是验证型实…

[数位dp] bzoj 3209 花神的数论题

[数位dp] bzoj 3209 花神的数论题 题意&#xff1a;中文题。 思路&#xff1a;和普通数位dp一样&#xff0c;这里转换成二进制&#xff0c;然后记录有几个一。 统计的时候乘起来就好了。 代码&#xff1a; #include"cstdlib" #include"cstdio" #include&qu…

高数七重积分的总结_高等数学重积分总结

【本章学习目标】⒈理解二重积分的概念与性质&#xff0c;了解二重积分的几何意义以及二重积分与定积分之间的联系&#xff0c;会用性质比较二重积分的大小&#xff0c;估计二重积分的取值范围。⒉领会将二重积分化为二次积分时如何确定积分次序和积分限&#xff0c;如何改换二…

神经拟态芯片拉近AI与人脑距离

来源&#xff1a;科技日报除了会看会听&#xff0c;还会“闻”。近日&#xff0c;一直致力于模仿人类五感的人工智能又有新突破&#xff0c;通过神经拟态芯片&#xff0c;人工智能已经掌握了丙酮、氨和甲烷等10种气味的神经表征&#xff0c;强烈的环境干扰也不会影响它对气味的…

单片机与微型计算机在结构上的区别和联系,AT89S52单片机片内硬件组成结构,与一般单片机和微机组成结构比较,显著区别有?...

满意答案a52245122020.09.19采纳率&#xff1a;49% 等级&#xff1a;8已帮助&#xff1a;159人以下内容讲诉了AT89S51/52单片机与AT89C51单片机的区别&#xff0c;资源来自网络转帖于此&#xff0c;请核实后采用。它们之间主要区别在于以下几点&#xff1a;1.引脚功能:管脚几…

Python基础教程之第3章 使用字符串

Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. #3.1基本字符串操作 >>> website http://www.python.org >>> we…

linux 拼音输出繁体_解决rime仓颉拼音反查为繁体的问题

和昆明IT没关系, 不过困扰我好几年的事解决了, 占地发一下:rime 有个很强的地方: 仓颉输入的时候, 想不起来, 可以输入拼音, 能提示对应字的仓颉的输入法. 也就是能用拼音反查对应的仓颉输入码.这样太方便学习了, 可是... 切到简体输入后, 输拼音反查时, 有时提示的是对应字的繁…