# -*- 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. django框架基础-django redis-长期维护-20191220

    ###############   django框架-django redis    ############### # 学习django redis我能得到什么? # 1,项目中广泛使用到redis ...

  2. 在CentOS安装CMake (CentOS7 64位适用)

    在CentOS安装CMake 转自:http://www.cnblogs.com/mophee/archive/2013/03/19/2969456.html 一.环境描述 1.系统:CentOS 6 ...

  3. python使用geopandas和shapely处理shp文件

    一.环境搭建 所需库:geopandas (以及前置库)  doc:http://geopandas.org/ shapely(以及前置库)  doc: 二.数据预处理 1.将shp文件进行切片 2. ...

  4. sm1、sm2、sm3、sm4简单介绍

    转自:https://blog.csdn.net/andylau00j/article/details/54427395 国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥 ...

  5. [洛谷P3369] 普通平衡树 Treap & Splay

    这个就是存一下板子...... 题目传送门 Treap的实现应该是比较正经的. 插入删除前驱后继排名什么的都是平衡树的基本操作. #include<cstdio> #include< ...

  6. OS Summary 1

    内容概述 什么是操作系统 操作系统的演变 操作系统结果的分类 什么是操作系统 操作系统可以是: 一个控制程序 一个资源管理器 一套标准库 操作系统通常有内核.命令行和 GUI 组成.我们研究的主要是内 ...

  7. POJ 2112 Optimal Milking 最短路 二分构图 网络流

    题意:有C头奶牛,K个挤奶站,每个挤奶器最多服务M头奶牛,奶牛和奶牛.奶牛和挤奶站.挤奶站和挤奶站之间都存在一定的距离.现在问满足所有的奶牛都能够被挤奶器服务到的情况下,行走距离的最远的奶牛的至少要走 ...

  8. idea如何打包项目(java)

    1.右击项目打开open module settings 2.依次打开 3.选择你的程序主入口 JAR files from libraies ①和设置库中的jar文件选择第一个打包时会把依赖库(li ...

  9. Python 字符编码判断

    题记 在获取中文字符的时候,如果出现乱码的情况,我们需要了解当前的字符串的编码形式.使用下面两种方法可以判断字符串的编码形式. 法一: isinstance(s, str) 用来判断是否为一般字符串 ...

  10. array-2

    数组的基本操作 JS随机操作数组元素 Math.random() 结果为0-1间的一个随机数[0,1) Math.round(num) 参数num为一个数值,函数结果为num四舍五入的整数 Math. ...