# -*- coding: utf-8 -*-
# 协程基础.py import asyncio
import time async def request(url):
print("正在请求:", url)
# r = await asyncio.sleep(3)
time.sleep(3)
print("下载成功:", url) c = request("www.baidu.com") # 异步函数返回的协程对象 # 1.实例化事件循环
loop = asyncio.get_event_loop()
# 2.任务对象,把协程对象放到任务对象中
task = loop.create_task(c)
# 3.把任务对象放到事件循环中
loop.run_until_complete(task)
# -*- coding: utf-8 -*-
# 给任务对象绑定回调.py import asyncio
import time async def request(url):
print("正在请求:", url)
# r = await asyncio.sleep(3)
time.sleep(3)
print("下载成功:", url)
return 123
c = request("www.baidu.com") # 异步函数返回的协程对象 # 回调函数的参数是任务对象task,回调在爬虫中是用来解析的
def parse(task):
print("这是回调函数")
print("打印结果是协程函数的返回值", task.result()) # 1.实例化事件循环
loop = asyncio.get_event_loop()
# 2.任务对象,把协程对象放到任务对象中
task = loop.create_task(c)
# 给任务对象绑定一个回调函数
task.add_done_callback(parse) # 3.把任务对象放到事件循环中
loop.run_until_complete(task)
# -*- coding: utf-8 -*-
# 多任务异步协程.py import asyncio
import time urls = ['www.baidu.com', 'www.sogou.com', 'www.sina.com']
start = time.time() async def request(url):
print("正在请求:", url)
# time.sleep(3) # 需要改成支持异步的代码
await asyncio.sleep(3) # 协程对象
print("下载成功:", url) loop = asyncio.get_event_loop()
# 任务列表,放置多个任务
tasks = []
for url in urls:
c = request(url) # 协程对象
task = loop.create_task(c)
tasks.append(task) loop.run_until_complete(asyncio.wait(tasks))
print('总共耗时:', time.time() - start)
# -*- coding: utf-8 -*-
# 多任务异步协程在爬虫中应用.py import asyncio
import time
import requests
import aiohttp # 跟requests的区别就是支持异步请求 # 单线程 + 多任务异步协程
# start = time.time()
# urls = [
# 'http://127.0.0.1:5000/bobo',
# 'http://127.0.0.1:5000/jay',
# 'http://127.0.0.1:5000/tom',
# ]
#
# async def get_pageText(url):
# print("正在下载", url)
# page_text = requests.get(url).text # 不支持异步请求,所以会报错
# print("下载完毕", url)
# # 返回给回调函数
# return page_text
#
#
# loop = asyncio.get_event_loop()
# tasks = []
# for url in urls:
# c = get_pageText(url)
# task = loop.create_task(c)
# tasks.append(task)
# loop.run_until_complete(asyncio.wait(tasks))
#
# print('总共耗时:', time.time() - start) start = time.time()
urls = [
'http://127.0.0.1:5000/bobo', # 页面响应2秒
'http://127.0.0.1:5000/jay', # 页面响应2秒
'http://127.0.0.1:5000/tom', # 页面响应2秒
] # 代理操作的时候
# async with await s.get(url=url,headers=headers,proxy="http://ip:port") as response:
async def get_pageText(url):
# 开启一个连接请求s
async with aiohttp.ClientSession() as s:
# await的使用条件: 请求和响应都存在网络传输,
# 发送一个连接请求,其他参数跟用request发请求一样比如headers,直接写括号里
async with await s.get(url=url) as response:
# 获取响应
page_text = await response.text()
# print(page_text)
# 把page_text传给回调函数进行解析
return page_text from lxml import etree
def parse(task):
# 获取 执行函数调用的结果
page_text = task.result() # # 实例化etree解析对象
# tree = etree.HTML(page_text)
# page_data = tree.xpath('//*[@id="page"]/a[1]/span[1]/i/@class')[0] print(page_text, "开始对页面进行解析") loop = asyncio.get_event_loop()
tasks = []
for url in urls:
c = get_pageText(url)
task = loop.create_task(c)
# 给每一个任务对象绑定回调函数
task.add_done_callback(parse)
tasks.append(task)
loop.run_until_complete(asyncio.wait(tasks)) print('总共耗时:', time.time() - start)

asyncio在爬虫中的使用的更多相关文章

  1. 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET

    采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined

  2. crawler_网络爬虫中编码的正确处理与乱码的解决策略

    转载: http://hi.baidu.com/erliang20088/item/9156132bdaeae8949c63d134 最近一个月一直在对nutch1.6版进行中等层次的二次开发,本来是 ...

  3. 跟着太白老师学python day11 闭包 及在爬虫中的基本使用

    闭包的基本概念: 闭包 内层函数对外层函数的变量(不包括全局变量)的引用,并返回,这样就形成了闭包 闭包的作用:当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,如果这个函数内部形成了闭包, 那 ...

  4. 爬虫中之Requests 模块的进阶

    requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个 ...

  5. crawler_JVM_DNS_在爬虫中的应用

    DNS解析:即由域名 经过dns解析,跳转到真正服务器的地址,这个重复解析的耗时占请求很大比例. 在设计爬虫时比较细粒度的控制下,需要考虑dns解析. jdk从1.5往后对dns缓存有默认设置, 详见 ...

  6. python爬虫中scrapy框架是否安装成功及简单创建

    判断框架是否安装成功,在新建的爬虫文件夹下打开盘符中框输入cmd,在命令中输入scrapy,若显示如下图所示,则说明成功安装爬虫框架: 查看当前版本:在刚刚打开的命令框内输入scrapy versio ...

  7. 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包

    1 引言 在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(request)和回复(response)进行分析,寻找其中的规律,然后才能通过网络爬虫进行模拟.浏览器大多也自带有调试工具可以 ...

  8. python学习笔记——爬虫中提取网页中的信息

    1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...

  9. python学习(十八)爬虫中加入cookie

    转载自:原文链接 前几篇文章介绍了urllib库基本使用和爬虫的简单应用,本文介绍如何通过post信息给网站,保存登陆后cookie,并用于请求有权限的操作.保存cookie需要用到cookiejar ...

随机推荐

  1. Kintinuous解析

    版权声明:本文为博主原创文章,未经博主允许不得转载. Kintinuous是Thomas Whelan在National University of Ireland Maynooth读博期间的工作,有 ...

  2. 体验vSphere 6之1-安装VMware ESXi 6 RC版(转载)

    体验vSphere 6之1-安装VMware ESXi 6 RC版 在2015年,各个公司都会发布一系列新的产品,例如Microsoft会发布Windows 10,VMware会发布vSphere 6 ...

  3. JVM内存基本理解

    声明:本文内容仅作为本人方便记忆和查看所用. JVM有五块内存空间: 1.method area:用于存储已被加载的类信息.常量.静态变量.即时编译后的代码等数据. 注:在JDK8中,Method A ...

  4. python 写个冒泡排序吧

    冒泡排序 介绍: 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作 ...

  5. tomcat——nginx负载均衡

    Tomcat一般应用在这种小型系统中应用非常广泛,是开发调试jsp的首先应用.Tomcat和其他web软甲一样具有解析HTML语言的功能,但是处理效率远不及Apacge和Nginx,所以Tomcat一 ...

  6. es6 转载

    1.let命令 1)let和var的区别:let声明的变量只有所在的代码块有效. 2)没有变量的提升,一定要声明后使用.使用let命令声明变量之前,该变量都是不可用的.形成“暂时性死区”. 3)typ ...

  7. python入门机器学习,3行代码搞定线性回归

    本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. “机器学习”对于普通大众来说可能会比较陌生,但是“人工智能”这个词简直是太火了,即便是风云变化的股市 ...

  8. Android(四)-JVM与DVM区别

    JVM与DVM区别 1.由来 Android是基于java的既然java已经有了java虚拟机,为什么android还要弄一个DVM了?最重要的就是版权问题,一开始就是用的 JVM,没过多久就被SUN ...

  9. Bugku的一道注入

    继续补sqli的题 这道题与之前的题的区别是在第二部分中加了一道waf,所以需要特殊的手段来进行注入. 题目来源:http://123.206.87.240:9004/1ndex.php?id=1 第 ...

  10. C++走向远洋——60(项目四、立体类族共有的抽象类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...