1.线程池

from concurrent.futures import ThreadPoolExecutor
import requests
from fake_useragent import UserAgent

def task(url):
    res = requests.get(url,
                       headers={"User-Agent": UserAgent().chrome})
    print(f"{url}--{res}")

url_list = ["http://www.baidu.com",
            "http://www.acfun.cn",
            "http://www.bilibili.com",
            "http://www.zhihu.com",
            "http://www.douban.com"]

executor = ThreadPoolExecutor(max_workers=3)

tasks = [executor.submit(task, url) for url in url_list]
executor.shutdown(wait=True)

  

2.asyncio+aiohttp

import asyncio
import aiohttp

async def task(url):
    async with aiohttp.request("GET", url) as response:
        res = await response.text()
        print(res)

url_list = ["http://www.baidu.com",
            "http://www.acfun.cn",
            "http://www.bilibili.com",
            "http://www.zhihu.com",
            "http://www.douban.com"]

tasks = [task(url) for url in url_list]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

  

3.gevent

from gevent import monkey
monkey.patch_all()
import gevent
from fake_useragent import UserAgent
import requests

def task(url):
    res = requests.get(url,
                       headers={"User-Agent": UserAgent().chrome})
    res.encoding = res.apparent_encoding
    print(f"{url}--{res.text}")

url_list = ["http://www.baidu.com",
            "http://www.acfun.cn",
            "http://www.bilibili.com",
            "http://www.zhihu.com",
            "http://www.douban.com"]

gevent.joinall([gevent.spawn(task, url) for url in url_list])

  

4.tornado

from tornado.httpclient import AsyncHTTPClient
from tornado.httpclient import HTTPRequest
from tornado import ioloop
from functools import partial
from fake_useragent import UserAgent

count = None
def handler_response(response):
    global count
    count -= 1
    if response.error:
        print("error")
    else:
        print(response.effective_url)
    if count == 0:
        ioloop.IOLoop.current().stop()

def func(url_list):
    global count
    count = len(url_list)
    for url in url_list:
        client = AsyncHTTPClient()
        client.fetch(HTTPRequest(url, headers={"User-Agent": UserAgent().chrome}), callback=handler_response)

url_list = ["http://www.baidu.com",
            "http://www.acfun.cn",
            "http://www.bilibili.com",
            "http://www.zhihu.com",
            "http://www.douban.com"]

ioloop.IOLoop.current().run_sync(partial(func, url_list))
ioloop.IOLoop.current().start()

  

5. twisted

from twisted.internet import reactor  # 事件循环(终止条件,所有的socket都已经移除)
from twisted.internet import defer  # defer.Deferred 特殊的socket对象(不发请求,手动移除)
from twisted.web.client import getPage  # 用于创建socket对象(下载完成,自动从事件循环中移除)
from fake_useragent import UserAgent

# 1. 利用getPage创建socket
# 2. 将socket添加到事件循环
# 3. 开始事件循环(内部发送请求,并接受相应。当所有的socket请求完成之后,终止事件循环)

@defer.inlineCallbacks  # 添加到事件循环
def task(url):
    # 创建socket,注意url要转换成字节。headers中的"User-Agent"也要是字节
    d = getPage(bytes(url, encoding="utf-8"), headers={b"User-Agent": UserAgent().chrome})
    # 获取到的html页面会自动传到response函数的第一个参数里面
    d.addCallback(response)
    yield d

def response(content):
    print(str(content, encoding="utf-8"))

def done(*args):
    reactor.stop()
url_list = ["http://www.baidu.com",
            "http://www.acfun.cn",
            "http://www.bilibili.com",
            "http://www.zhihu.com",
            "http://www.douban.com"]
defer_list = []
for url in url_list:
    t = task(url)
    defer_list.append(t)
# 监听defer_list里面的任务是否执行完毕
d = defer.DeferredList(defer_list)
#如果执行完毕,执行对应的回调函数
d.addBoth(done)
# 启动事件循环
reactor.run()

  

python实现并发获取html的几种方式的更多相关文章

  1. 获取Type的三种方式

    using System;using UnityEngine; public class Type_Test : MonoBehaviour{    private void Awake()    { ...

  2. java动态获取WebService的两种方式(复杂参数类型)

    java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...

  3. AngularJS中获取数据源的几种方式

    在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中.本篇就来整理获取数据的几 ...

  4. java 获取时间戳的三种方式

      java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...

  5. 【Struts2】Struts2获取session的三种方式

    1.Map<String,Object> map =  ActionContext.getContext().getSession(); 2.HttpSession session = S ...

  6. js获取时间戳的三种方式

      js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...

  7. Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)

    一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  8. HTTP获取信息的四种方式

    HTTP 从网络获取信息的四种方式 GET GET指代你在浏览器中输入网址,浏览网站时做的事.例如,我们使用 http://www.baidu.com 的时候,可以将GET想象成他说:"hi ...

  9. SpringMVC获取参数的几种方式

    前言: 年末了,忙了一年了却发现系统的整理的东西很少,一些基础的东西都未做整理,这里就将它随便整理一下,增加一些印象,当然在网上看到一些好的资料也会整理下来以备后用.今天整理一下springMVC获取 ...

随机推荐

  1. Invalid bound statement (not found): com.up.sell.mapper.system.H5operationMapper.

    springboot + mybatis项目,出现这样的错误原因就是mapper类的名字和xml的id不对应或者是忘记写了,仔细检查一下吧

  2. Django基本使用

    目录 1 安装 1.1 安装pip 1.2 安装django 2 创建项目 2.1 使用 管理工具 django-admin.py 来创建 PyLearn 项目: 2.2 启动服务 本文章以下所有列子 ...

  3. 《Cracking the Coding Interview》——第13章:C和C++——题目6

    2014-04-25 20:07 题目:为什么基类的析构函数必须声明为虚函数? 解法:不是必须,而是应该,这是种规范.对于基类中执行的一些动态资源分配,如果基类的析构函数不是虚函数,那么 派生类的析构 ...

  4. 《Cracking the Coding Interview》——第13章:C和C++——题目1

    2014-04-25 19:13 题目:用C++写一个读取文件倒数K行的方法. 解法:因为是要取倒数K行,所以我的思路是一行一行地读.过程中需要保存一个长度为K的链表,每次新读到一行都将表头节点移到表 ...

  5. 【APUE】Chapter7 Process Environment

    这一章内容是Process的基础准备篇章.这一章的内容都是基于C Programm为例子. (一)进程开始: kernel → C start-up rountine → main function ...

  6. appium-手势密码实现-automationName 是automator2

    上一篇博客已经说了 appium-手势密码实现-automationName 是Appium的情况 下面就说一下automator2的情况: 手势密码的moveTo方法的参数进行了改变. 参数是相对于 ...

  7. Oracle 遇到的问题:dos命令下imp导入数据时出错

    赋予用户dba权限:很多情况下会遇到没有权限需要输入用户名及密码才能导入 --已知被赋予权限的用户名为:batch --第一步 登陆 sqlplus /nolog sql>conn /as sy ...

  8. Oz 创建CentOS6镜像

    参考 http://linuxblind.blog.51cto.com/7616603/1655550/ http://www.chenshake.com/oz-making-centos-mirro ...

  9. nagios客户端安装

    在被监控服务器(Linux/unix)上安装Nagios-plugins和nrpe 1.添加用户   1 2 ; html-script: false ]/usr/sbin/useradd -m na ...

  10. Java8并行流使用注意事项

    对于从事Java开发的童鞋来说,相信对于Java8的并行流并不陌生,没错,我们常常用它来执行并行任务,但是由于并行流(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响, ...