python如何提升爬虫效率


Posted in Python onSeptember 27, 2020

单线程+多任务异步协程

  • 协程

在函数(特殊函数)定义的时候,使用async修饰,函数调用后,内部语句不会立即执行,而是会返回一个协程对象

  • 任务对象

任务对象=高级的协程对象(进一步封装)=特殊的函数
任务对象必须要注册到时间循环对象中
给任务对象绑定回调:爬虫的数据解析中

  • 事件循环

当做是一个装载任务对象的容器
当启动事件循环对象的时候,存储在内的任务对象会异步执行

  • 特殊函数内部不能写不支持异步请求的模块,如time,requests...否则虽然不报错但实现不了异步

time.sleep -- asyncio.sleep
requests -- aiohttp

import asyncio
import time

start_time = time.time()
async def get_request(url):
  await asyncio.sleep(2)
  print(url,'下载完成!')

urls = [
  'www.1.com',
  'www.2.com',
]

task_lst = [] # 任务对象列表
for url in urls:
  c = get_request(url) # 协程对象
  task = asyncio.ensure_future(c) # 任务对象
  # task.add_done_callback(...)  # 绑定回调
  task_lst.append(task)

loop = asyncio.get_event_loop() # 事件循环对象
loop.run_until_complete(asyncio.wait(task_lst)) # 注册,手动挂起

线程池+requests模块

# 线程池
import time
from multiprocessing.dummy import Pool

start_time = time.time()
url_list = [
  'www.1.com',
  'www.2.com',
  'www.3.com',
]
def get_request(url):
  print('正在下载...',url)
  time.sleep(2)
  print('下载完成!',url)

pool = Pool(3)
pool.map(get_request,url_list)
print('总耗时:',time.time()-start_time)

两个方法提升爬虫效率

起一个flask服务端

from flask import Flask
import time

app = Flask(__name__)

@app.route('/bobo')
def index_bobo():
  time.sleep(2)
  return 'hello bobo!'

@app.route('/jay')
def index_jay():
  time.sleep(2)
  return 'hello jay!'

@app.route('/tom')
def index_tom():
  time.sleep(2)
  return 'hello tom!'

if __name__ == '__main__':
  app.run(threaded=True)

aiohttp模块+单线程多任务异步协程

import asyncio
import aiohttp
import requests
import time

start = time.time()
async def get_page(url):
  # page_text = requests.get(url=url).text
  # print(page_text)
  # return page_text
  async with aiohttp.ClientSession() as s: #生成一个session对象
    async with await s.get(url=url) as response:
      page_text = await response.text()
      print(page_text)
  return page_text

urls = [
  'http://127.0.0.1:5000/bobo',
  'http://127.0.0.1:5000/jay',
  'http://127.0.0.1:5000/tom',
]
tasks = []
for url in urls:
  c = get_page(url)
  task = asyncio.ensure_future(c)
  tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(end-start)

# 异步执行!
# hello tom!
# hello bobo!
# hello jay!
# 2.0311079025268555
'''
aiohttp模块实现单线程+多任务异步协程
并用xpath解析数据
'''
import aiohttp
import asyncio
from lxml import etree
import time

start = time.time()
# 特殊函数:请求的发送和数据的捕获
# 注意async with await关键字
async def get_request(url):
  async with aiohttp.ClientSession() as s:
    async with await s.get(url=url) as response:
      page_text = await response.text()
      return page_text    # 返回页面源码

# 回调函数,解析数据
def parse(task):
  page_text = task.result()
  tree = etree.HTML(page_text)
  msg = tree.xpath('/html/body/ul//text()')
  print(msg)

urls = [
  'http://127.0.0.1:5000/bobo',
  'http://127.0.0.1:5000/jay',
  'http://127.0.0.1:5000/tom',
]
tasks = []
for url in urls:
  c = get_request(url)
  task = asyncio.ensure_future(c)
  task.add_done_callback(parse) #绑定回调函数!
  tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

end = time.time()
print(end-start)

requests模块+线程池

import time
import requests
from multiprocessing.dummy import Pool

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',
]
def get_request(url):
  page_text = requests.get(url=url).text
  print(page_text)
  return page_text

pool = Pool(3)
pool.map(get_request, urls)
end = time.time()
print('总耗时:', end-start)

# 实现异步请求
# hello jay!
# hello bobo!
# hello tom!
# 总耗时: 2.0467123985290527

小结

  • 爬虫的加速目前掌握了两种方法:

aiohttp模块+单线程多任务异步协程
requests模块+线程池

  • 爬虫接触的模块有三个:

requests
urllib
aiohttp

  • 接触了一下flask开启服务器

以上就是python如何提升爬虫效率的详细内容,更多关于python提升爬虫效率的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python socket编程实例详解
May 27 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
python爬取微信公众号文章
Aug 31 Python
pandas DataFrame索引行列的实现
Jun 04 Python
Numpy 中的矩阵求逆实例
Aug 26 Python
Python的形参和实参使用方式
Dec 24 Python
Python实现图片识别加翻译功能
Dec 26 Python
有关Tensorflow梯度下降常用的优化方法分享
Feb 04 Python
python实现udp聊天窗口
Mar 31 Python
使用Python实现批量ping操作方法
May 06 Python
python操作链表的示例代码
Sep 27 #Python
python用tkinter实现一个简易能进行随机点名的界面
Sep 27 #Python
python实现暗通道去雾算法的示例
Sep 27 #Python
谈谈python垃圾回收机制
Sep 27 #Python
如何在python中处理配置文件代码实例
Sep 27 #Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 #Python
python 读取、写入txt文件的示例
Sep 27 #Python
You might like
虫族 Zerg 热键控制
2020/03/14 星际争霸
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
javascript 面向对象 function类
2010/05/13 Javascript
Bookmarklet实现启动jQuery(模仿 云输入法)
2010/09/15 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
js实现九宫格图片半透明渐显特效的方法
2015/02/16 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
bootstrap fileinput组件整合Springmvc上传图片到本地磁盘
2017/05/11 Javascript
基于zepto.js实现手机相册功能
2017/07/11 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
解决Vue 项目打包后favicon无法正常显示的问题
2018/09/01 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
js比较两个单独的数组或对象是否相等的实例代码
2019/04/28 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
使用Python轻松完成垃圾分类(基于图像识别)
2019/07/09 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python绘制股票移动均线的实例
2019/08/24 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
Python填充任意颜色,不同算法时间差异分析说明
2020/05/16 Python
python GUI模拟实现计算器
2020/06/22 Python
python 基于PYMYSQL使用MYSQL数据库
2020/12/24 Python
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
AOP的定义以及作用
2013/09/08 面试题
房地产销售员的自我评价分享
2013/12/04 职场文书
妇联主席先进事迹
2014/05/18 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
小学生春游活动方案
2014/08/20 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
大学生团员个人总结
2015/02/14 职场文书
化妆品促销活动总结
2015/05/07 职场文书
创业计划书之水果店
2019/07/18 职场文书