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()

  

最新文章

  1. WPF Datagrid删除一行
  2. 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)
  3. css文本属性
  4. iBatisnet系列(二) 配置运行环境和日志处理
  5. 海量数据导入MySQL的注意事项
  6. 为什么在SQL Server2008在视图中修改表结构无效
  7. python使用zlib实现压缩与解压字符串
  8. php,apache伪静态(1转)
  9. 内存数据网格IMDG简单介绍
  10. 转化来的图标用法symbol引用‘font-class引用及Unicode引用
  11. 解决vi上下左右变ABCD问题
  12. 【翻译】Neural Collaborative Filtering--神经协同过滤
  13. 《effective Go》读后记录:GO基础
  14. POJ 2923 Relocation 装车问题 【状态压缩DP】+【01背包】
  15. RzCheckTree基本使用
  16. 0703-spring cloud config-git配置属性加解密之对称加密
  17. 安装Eclipse Maven插件的几种方法
  18. 【设计模式】适配器模式与Reader、InputStream之间的适配
  19. SQL 将一个字段内用逗号分隔的内容分成多条记录
  20. eclipse 如何修改maven插件本地仓库jar包默认存储位置

热门文章

  1. ansible-1
  2. 剑指Offer - 九度1523 - 从上往下打印二叉树
  3. Python 3基础教程1-环境安装和运行环境
  4. Python学习1,代码
  5. 算法のLowLow三人行
  6. net对象的克隆
  7. [译]如何去除pandas dataframe里面的Unnamed的列?
  8. Spring 学习笔记(四)—— XML配置依赖注入
  9. 软工实践 - 第十七次作业 Alpha 冲刺 (8/10)
  10. [Codeforces 1027 F] Session in BSU [并查集维护二分图匹配问题]