asyncio在爬虫中的使用
# -*- 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在爬虫中的使用的更多相关文章
- 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET
采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined
- crawler_网络爬虫中编码的正确处理与乱码的解决策略
转载: http://hi.baidu.com/erliang20088/item/9156132bdaeae8949c63d134 最近一个月一直在对nutch1.6版进行中等层次的二次开发,本来是 ...
- 跟着太白老师学python day11 闭包 及在爬虫中的基本使用
闭包的基本概念: 闭包 内层函数对外层函数的变量(不包括全局变量)的引用,并返回,这样就形成了闭包 闭包的作用:当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,如果这个函数内部形成了闭包, 那 ...
- 爬虫中之Requests 模块的进阶
requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个 ...
- crawler_JVM_DNS_在爬虫中的应用
DNS解析:即由域名 经过dns解析,跳转到真正服务器的地址,这个重复解析的耗时占请求很大比例. 在设计爬虫时比较细粒度的控制下,需要考虑dns解析. jdk从1.5往后对dns缓存有默认设置, 详见 ...
- python爬虫中scrapy框架是否安装成功及简单创建
判断框架是否安装成功,在新建的爬虫文件夹下打开盘符中框输入cmd,在命令中输入scrapy,若显示如下图所示,则说明成功安装爬虫框架: 查看当前版本:在刚刚打开的命令框内输入scrapy versio ...
- 网络爬虫中Fiddler抓取PC端网页数据包与手机端APP数据包
1 引言 在编写网络爬虫时,第一步(也是极为关键一步)就是对网络的请求(request)和回复(response)进行分析,寻找其中的规律,然后才能通过网络爬虫进行模拟.浏览器大多也自带有调试工具可以 ...
- python学习笔记——爬虫中提取网页中的信息
1 数据类型 网页中的数据类型可分为结构化数据.半结构化数据.非结构化数据三种 1.1 结构化数据 常见的是MySQL,表现为二维形式的数据 1.2 半结构化数据 是结构化数据的一种形式,并不符合关系 ...
- python学习(十八)爬虫中加入cookie
转载自:原文链接 前几篇文章介绍了urllib库基本使用和爬虫的简单应用,本文介绍如何通过post信息给网站,保存登陆后cookie,并用于请求有权限的操作.保存cookie需要用到cookiejar ...
随机推荐
- Rip路由实验
以上是实验要求和实验拓扑图 (实验拓扑自己重新连线) 1.在R1-R4,4台路由器上各设置一个回环口 2.略 3.在四个路由器上配置rip(rip的基本命令) #rip 1 #version 2 #u ...
- OpenCV Mat - 基本图像容器
Mat 在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建.为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材 ...
- VS2010发布,IIS实际目录,无法修改只读状态解难决办法
VS2010发布网站后,无法修改只读状态 CMS简单的主页生成失败,其他的修改操错也应该无法执行 只在常规里修改无效. 网上得答案 1.鼠标右键点击文件夹 2.点击属性 3.在“常规”标签页中,取消“ ...
- JDBC源码分析(加载过程)
public static void main(String[] args) { String url = "jdbc:mysql://172.16.27.11:3306/jdbcT ...
- 林轩田机器学习基石笔记2—Learning to Answer Yes/No
机器学习的整个过程:根据模型H,使用演算法A,在训练样本D上进行训练,得到最好的h,其对应的g就是我们最后需要的机器学习的模型函数,一般g接近于目标函数f.本节课将继续深入探讨机器学习问题,介绍感知机 ...
- jenkins使用(2)-配置项目代码的3种方式
1.通过cmd命令直接进入项目代码的文件夹运行,注意路径中不要有中文 2.代码放到工作区:从本地复制项目代码到工作区目录下 代码结构的优化 3.代码连接git或svn,实时更新代码 svn检出 然后上 ...
- VRRP笔记二:配置keepalived为实现haproxy高可用的配置文件示例
! Configuration File for keepalived global_defs { notification_email { linuxedu@foxmail.com mageedu@ ...
- UML 类图介绍
UML 类图介绍 一. UML 简介 UML ( Unified Modeling Language )即统一建模语言,是 OMG ( Object Management Group )发表的图标式软 ...
- OpenCV 腐蚀膨胀操作
利用腐蚀膨胀操作实现对椭圆周围线条的消除,椭圆的大小不变 代码如下: #include "cv.h" #include "highgui.h" int main ...
- python基础实现简单的shell sed 替换功能
#coding:utf-8 from pygame.draw import lines import sys,os old_file = sys.argv[1] #接受外部设备上的参数 new_fil ...