# -*- 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. scala语言yield配合for的用法实例

    yield配合for的用法 话不多说见实例 package com.donews.reynold /** * Created by reynold on 2017/3/23. */ object Sc ...

  2. deeplearning.ai 序列模型 Week 2 NLP & Word Embeddings

    1. Word representation One-hot representation的缺点:把每个单词独立对待,导致对相关词的泛化能力不强.比如训练出“I want a glass of ora ...

  3. 1022 D进制的A+B (20 分)

    题目:1022 D进制的A+B (20 分) 思路: 首先根据A.B的取值范围,可知A+B不过2^31,所以转换成进制数时的最长长度为31. 转换成进制的数存进数组,然后反向输出. 要注意和为0的情况 ...

  4. Qt5 提示:无法启动此程序,计算机丢失Qt5Widgetsd.dll的解决方法

    Qt5工程编译生成可执行的exe文件之后,运行提示无法启动此程序,计算机丢失Qt5Widgetsd.dll… 原因是没有设置好Qt5的环境变量,解决方法如下: 1.打开[环境变量],(不同的系统会有不 ...

  5. 应用场景:vue表格撤销删除与保存按钮的显隐

    应用场景:vue表格撤销删除与保存按钮的显隐

  6. Docker的网络类型

    四种网络类型: None:不为容器配置任何网络功能,--net=noneContainer:与另一个运行中的容器共享Network Namespace,--net=container:containe ...

  7. xstream的介绍及用法

    使用xstream工具包导入xpp3_min-1.1.4c和xstream-1.4.9特点:代码简洁,超级方便,可以自己定义xml格式(适合做文件传输)属性特点:1. xStream.alias(&q ...

  8. Ubuntu环境下的iptables的端口转发配置实例

    打开转发开关要让iptables的端口转发生效,首先需要打开转发开关方法一:临时打开,重启后失效$sudo su#echo 1 >/proc/sys/net/ipv4/ip_forward 方法 ...

  9. [JS奇怪的世界]No.55 危險小叮嚀:陣列與for in

    前言 前面已經瞭解了使用內建函數建構子的某些危險地方,但其實陣列與for in,也是有一些危險的地方. 陣列與for in 在前面幾個章節有講過陣列就是物件,所以我們一樣可以使用 for in來做處理 ...

  10. yii框架通过控制台命令创建定时任务

    假设Yii项目路径为 /home/apps 1. 创建文件 /home/apps/web/protected/commands/console.php $yii = '/home/apps/frame ...