开启线程池:

  • 线程池

    • asyncio

      • 特殊的函数
      • 协程
      • 任务对象
        • 任务对象绑定
      • 事件循环
  • from multiprocessing.dummy import Pool

  • map(func,alist):

    • 可以让func回调函数处理alist中的每一个列表元素,这个处理的过程是基于异步。

In [7]:

import requests
import time
from multiprocessing.dummy import Pool
start = time.time()
pool = Pool(3)
urls = [
'http://127.0.0.1:5000/index',
'http://127.0.0.1:5000/index',
'http://127.0.0.1:5000/index'
]
#用作与网络请求(耗时)
def req(url):
return requests.get(url).text page_text_list = pool.map(req,urls)
print(page_text_list)
print('总耗时:',time.time()-start) ['hello bobo!!!', 'hello bobo!!!', 'hello bobo!!!']
总耗时: 2.1126856803894043

单线程+多任务异步协程asyncio

1.asyncio初始

import asyncio
from time import sleep #特殊的函数
async def get_request(url):
print('正在下载:',url)
sleep(2)
print('下载完毕:',url) return 'page_text'
#回调函数的定义(普通的函数)
def parse(task):
#参数表示的就是任务对象
print('i am callback!!!',task.result()) #特殊函数的调用
c = get_request('www.1.com') #创建一个任务对象
task = asyncio.ensure_future(c)
#给任务对象绑定一个回调函数
task.add_done_callback(parse) #创建一个事件循环对象
loop = asyncio.get_event_loop()
#将任务对象注册到该对象中并且开启该对象
loop.run_until_complete(task)#让loop执行了一个任务
解释:
- ##### 特殊函数:

  - 就是async关键字修饰的一个函数的定义
- 特殊之处:
- 特殊函数被调用后会返回一个协程对象
- 特殊函数调用后内部的程序语句没有被立即执行 - ##### 协程 - 对象,协程==特殊的函数。协程表示的就是一组特定的操作。 - ##### 任务对象 - 高级的协程(对协程的进一步的封装)
- 任务对象==协程==特殊的函数
- 任务对象==特殊的函数
- 绑定回调:
- task.add_done_callback(task)
- 参数task:当前回调函数对应的任务对象
- task.result():返回的就是任务对象对应的特殊函数的返回值 - ##### 事件循环对象 - 创建事件循环对象
- 将任务对象注册到该对象中并且开启该对象
- 作用:loop可以将其内部注册的所有的任务对象进行异步执行 - ##### 挂起: 就是交出cpu的使用权。
多任务异步爬虫:
import asyncio
import requests
import time
from bs4 import BeautifulSoup
#将被请求的url全部整合到一个列表中
urls = ['http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom']
start = time.time() async def get_request(url):
#requests模块不支持异步,中断了整个的异步效果
page_text = requests.get(url).text
return page_text def parse(task):
page_text = task.result()
soup = BeautifulSoup(page_text,'lxml')
data = soup.find('div',class_="tang").text
print(data)
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)) print('总耗时:',time.time()-start)
  • 【重点】在特殊函数内部的实现中,不可以出现不支持异步的模块代码,如果出现了,

    则会中断整个的异步效果!!!

  • requests一定是不支持异步

  • aiohttp是一个支持异步的网络请求模块

    • 环境安装

    • 编码流程:

      • 大致的架构:
      with aiohttp.ClientSession() as s:
      #s.get(url,headers,params,proxy="http://ip:port")
      with s.get(url) as response:
      #response.read()二进制(.content)
      page_text = response.text()
      return page_text
        - 补充细节
    - 在每一个with前加上async
    - 需要在每一个阻塞操作前加上await ```python
    async with aiohttp.ClientSession() as s:
    #s.get(url,headers,params,proxy="http://ip:port")
    async with await s.get(url) as response:
    #response.read()二进制(.content)
    page_text = await response.text()
    return page_text
    • 代码的实现:

      import asyncio
      import aiohttp
      import time
      from bs4 import BeautifulSoup
      #将被请求的url全部整合到一个列表中
      urls = ['http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom']
      start = time.time() async def get_request(url):
      async with aiohttp.ClientSession() as s:
      #s.get(url,headers,params,proxy="http://ip:port")
      async with await s.get(url) as response:
      #response.read()二进制(.content)
      page_text = await response.text()
      return page_text def parse(task):
      page_text = task.result()
      soup = BeautifulSoup(page_text,'lxml')
      data = soup.find('div',class_="tang").text
      print(data)
      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)) print('总耗时:',time.time()-start)

python爬虫如何提高效率的更多相关文章

  1. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  2. (转)python爬虫----(scrapy框架提高(1),自定义Request爬取)

    摘要 之前一直使用默认的parse入口,以及SgmlLinkExtractor自动抓取url.但是一般使用的时候都是需要自己写具体的url抓取函数的. python 爬虫 scrapy scrapy提 ...

  3. python爬虫13 | 秒爬,这多线程爬取速度也太猛了,这次就是要让你的爬虫效率杠杠的

    快 快了 啊 嘿 小老弟 想啥呢 今天这篇爬虫教程的主题就是一个字 快 想要做到秒爬 就需要知道 什么是多进程 什么是多线程 什么是协程(微线程) 你先去沏杯茶 坐下来 小帅b这就好好给你说道说道 关 ...

  4. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  5. python爬虫:一些常用的爬虫技巧

    python爬虫:一些常用的爬虫技巧 1.基本抓取网页 get方法: post方法: 2.使用代理IP 在开发爬虫过程中经常会遇到IP被封掉的情况,这时就需要用到代理IP; 在urllib2包中有Pr ...

  6. Python爬虫:一些常用的爬虫技巧总结

    爬虫在开发过程中也有很多复用的过程,这里总结一下,以后也能省些事情. 1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com&qu ...

  7. 【Python爬虫】入门知识

    爬虫基本知识 这阵子需要用爬虫做点事情,于是系统的学习了一下python爬虫,觉得还挺有意思的,比我想象中的能干更多的事情,这里记录下学习的经历. 网上有关爬虫的资料特别多,写的都挺复杂的,我这里不打 ...

  8. 常用的 Python 爬虫技巧总结

    用python也差不多一年多了,python应用最多的场景还是web快速开发.爬虫.自动化运维:写过简单网站.写过自动发帖脚本.写过收发邮件脚本.写过简单验证码识别脚本. 爬虫在开发过程中也有很多复用 ...

  9. [转载]python 爬虫总结

    1.基本抓取网页 get方法 import urllib2 url = "http://www.baidu.com" response = urllib2.urlopen(url) ...

随机推荐

  1. js--数组的filter()过滤方法的使用

    前言 你还在通过for循环遍历数组吗?你还在遍历之后一项一项的通过if判断过滤你需要的数据吗?你还在写着一大堆代码实现一个简单的过滤数据功能吗?那么,今天他来了.他就是这里要介绍的es6中数组filt ...

  2. MySQL索引与SQL注入

    SQL注入: SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作, ...

  3. 配置redis服务器允许远程连接

    说明 默认情况下,redis只允许本机访问.如果需要外部访问,需要修改下配置文件. 配置修改 redis.windows.conf 将bind 127.0.0.1 注释 将protected-mode ...

  4. Dovecot邮件服务器的正确安装方法

    Dovecot邮件服务器的正确安装方法 apt remove dovecot-coredpkg -P dovecot-core sudo apt install dovecot-imapd dovec ...

  5. Proguard结合maven使用

    添加插件配置 项目是maven项目,则可以在 pom 的 build 标签下添加插件 <plugin> <groupId>com.github.wvengen</grou ...

  6. spring: 我是如何解决循环依赖的?

    1.由同事抛的一个问题开始 最近项目组的一个同事遇到了一个问题,问我的意见,一下子引起的我的兴趣,因为这个问题我也是第一次遇到.平时自认为对spring循环依赖问题还是比较了解的,直到遇到这个和后面的 ...

  7. 使用ThreadLocal

    使用ThreadLocal 阅读: 135212 多线程是Java实现多任务的基础,Thread对象代表一个线程,我们可以在代码中调用Thread.currentThread()获取当前线程.例如,打 ...

  8. Mysql 实战关于date,datetime,timestamp类型使用

    最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位  其实很 ...

  9. 漫画 | 小公司卧薪尝胆三年,意外拿到美团offer

    今天给大家分享一篇,非科班出生的野生前端从业者的励志成长故事,故事的主人公王大拿(化名),在小公司打杂三年后,意外拿到了美团的offer,成功进阶大厂,跳槽到了美团的核心外卖事业部. 事故主人公:王大 ...

  10. 通过BulkLoad快速将海量数据导入到Hbase(TDH,kerberos认证)

    一.概念 使用BlukLoad方式利用Hbase的数据信息是 按照特点格式存储在HDFS里的特性,直接在HDFS中生成持久化的Hfile数据格式文件,然后完成巨量数据快速入库的操作,配合MapRedu ...