ahttp
# -*- coding: utf-8 -*-
# @Time : 2018/8/20 14:35
# @Author : cxa
# @File : chttp.py
# @Software: PyCharm
# !/usr/bin/env python3
# -*- coding: utf-8 -*-
from functools import partial, wraps
from random import random
import asyncio, os
from cchardet import detect
try:
import aiohttp
except ImportError:
raise RuntimeError('您没有安装aiohttp,请执行安装命令 pip install aiohttp ')
result, all_tasks, connector, sessiondict = [], [], [], {}
class AhttpRequest():
def __init__(self, method, url, timeout=None, session=False, headers=None, cookies=None, unsafe=None,
mark='1111111111', **kwargs):
self.method, self.session, self.url, self.mark, self.timeout = method, session, url, mark, timeout
callback = kwargs.pop('callback', None)
self.callback = callback
self.kwargs = kwargs
if not session:
self.sessiondict = (cookies, headers, aiohttp.CookieJar(unsafe=True) if unsafe else None)
def run(self, pool=5, exception_handle=None):
result = run([self], pool=pool, exception_handle=exception_handle)
return result[0]
class WithSession():
def __init__(self, mark, session=True):
self.get = partial(AhttpRequest, 'GET', session=session, mark=mark)
self.options = partial(AhttpRequest, 'OPTIONS', session=session, mark=mark)
self.head = partial(AhttpRequest, 'HEAD', session=session, mark=mark)
self.post = partial(AhttpRequest, 'POST', session=session, mark=mark)
self.put = partial(AhttpRequest, 'PUT', session=session, mark=mark)
self.patch = partial(AhttpRequest, 'PATCH', session=session, mark=mark)
self.delete = partial(AhttpRequest, 'DELETE', session=session, mark=mark)
get = partial(AhttpRequest, 'GET')
options = partial(AhttpRequest, 'OPTIONS')
head = partial(AhttpRequest, 'HEAD')
post = partial(AhttpRequest, 'POST')
put = partial(AhttpRequest, 'PUT')
patch = partial(AhttpRequest, 'PATCH')
delete = partial(AhttpRequest, 'DELETE')
class ClientSession(aiohttp.ClientSession):
def close(self):
"""
对ClientSession类的close方法进行重写
"""
if not self.closed:
if self._connector_owner:
self._connector.close()
connector.append(self._connector)
return 'ClientSession.close() is a coroutine'
def Session(cookies=None, headers=None, unsafe=None):
mark = str(round(random() * 10 ** 10))
sessiondict[mark] = (cookies, headers, aiohttp.CookieJar(unsafe=True) if unsafe else None)
return WithSession(mark=mark)
def run(tasks, pool=2, exception_handle=None):
del result[:]
del connector[:]
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(go(tasks, pool, exception_handle, loop=loop))
loop.run_until_complete(future)
# loop.close()
return result
class AhttpResponse():
def __init__(self, content, clientResponse):
self.content = content
self.clientResponse = clientResponse
def raw(self):
return self.clientResponse
@property
def url(self):
return self.clientResponse.url
@property
def cookies(self):
return self.clientResponse.cookies
@property
def headers(self):
return self.clientResponse.headers
@property
def status(self):
return self.clientResponse.status
@property
def method(self):
return self.clientResponse.method
def text(self, encoding=None):
encoding = encoding or detect(self.content)['encoding']
return self.content.decode(encoding=encoding)
def __repr__(self):
return "<AhttpResponse [status {}]>".format(self.clientResponse.status)
__str__ = __repr__
async def go(tasks, pool, exception_handle, loop):
del all_tasks[:]
conn = aiohttp.TCPConnector(use_dns_cache=True, loop=loop, verify_ssl=False)
sem = asyncio.Semaphore(pool)
classify = {}
[classify[i.mark].append(i) if classify.get(i.mark, 0) else classify.setdefault(i.mark, [i]) for i in tasks]
print(classify)
try:
for i in classify.pop('1111111111'):
all_tasks.append(control_sem(sem, i, exception_handle, session=False))
except:
pass
for i in classify:
async with ClientSession(cookies=sessiondict[i][0], headers=sessiondict[i][1], cookie_jar=sessiondict[i][2],
connector_owner=False, connector=conn) as locals()['session{}'.format(i)]:
for j in classify[i]:
all_tasks.append(control_sem(sem, j, exception_handle, session=locals()['session{}'.format(i)]))
await asyncio.wait(all_tasks)
# 关闭所有连接
for i in connector:
i.close()
return True
async def fetch(session, i, exception_handle):
try:
if session:
async with session.request(i.method, i.url, timeout=i.timeout, **(i.kwargs)) as resp:
content = await resp.read()
myAhttp = AhttpResponse(content, resp)
else:
async with aiohttp.ClientSession(cookies=i.sessiondict[0], headers=i.sessiondict[1],
cookie_jar=i.sessiondict[2]) as session2:
async with session2.request(i.method, i.url, timeout=i.timeout, **(i.kwargs)) as resp:
content = await resp.read()
myAhttp = AhttpResponse(content, resp)
if i.callback:
try:
i.callback(myAhttp)
except:
pass
except Exception as e:
myAhttp = None
exception_handle and exception_handle(i, e)
finally:
result.append(myAhttp)
async def control_sem(sem, i, exception_handle, session):
# 限制信号量
async with sem:
await fetch(session, i, exception_handle)
# __all__ = (
# 'Session', 'get', 'options', 'head', 'post', 'put', 'patch', 'delete'
# )
if __name__ == '__main__':
urls = ["http://www.runoob.com/python/att-time-mktime.html",
"https://blog.csdn.net/getcomputerstyle/article/details/71515331"]
ahttp的更多相关文章
- CocoaPods使用 主要带图。转载。
原文地址 快速更新,不需要查找更新库 命令:pod update --verbose --no-repo-update 虽然网上关于CocoaPods安装教程多不胜数,但是我在安装的过程中还是出现了 ...
- 网站统计中的数据收集原理及实现(share)
转载自:http://blog.codinglabs.org/articles/how-web-analytics-data-collection-system-work.html 网站数据统计分析工 ...
- CocoaPods 安装
虽然网上关于CocoaPods安装教程多不胜数,但是我在安装的过程中还是出现了很多错误,所以大家可以照下来步骤装一下,我相信会很好用. 前言 在iOS项目中使用第三方类库可以说是非常常见的事,但是要正 ...
- 使用nginx lua实现网站统计中的数据收集
导读网站数据统计分析工具是各网站站长和运营人员经常使用的一种工具,常用的有 谷歌分析.百度统计和腾讯分析等等.所有这些统计分析工具的第一步都是网站访问数据的收集.目前主流的数据收集方式基本都是基于ja ...
- How to disable certain HTTP methods (PUT, DELETE, TRACE and OPTIONS) in JBOSS7 .
Resolution Option 1 -Using RewriteValve (can apply globally) You can use RewriteValve to disable the ...
- 使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程
使用Nginx和Logstash以及kafka来实现网站日志采集的详细步骤和过程 先列出来总体启动流程: (1)启动zookeeper集群(hadoop01.hadoop02和hadoop03这3台机 ...
- cocopods的使用方法
虽然网上关于CocoaPods安装教程多不胜数,但是我在安装的过程中还是出现了很多错误,所以大家可以照下来步骤装一下,我相信会很好用. 前言 在iOS项目中使用第三方类库可以说是非常常见的事,但是要正 ...
- iOS开发:cocoapods的使用
Cocoapods是OS X和iOS下的一个第三方类库管理工具,通过CocoaPods工具我们可以为项目添加各种依赖库,减少了我们手动引入库需要的各种配置,同时使用cocoapods可以方便的查找新的 ...
- python 站点爬虫 下载在线盗墓笔记小说到本地的脚本
近期闲着没事想看小说,找到一个全是南派三叔的小说的站点,决定都下载下来看看,于是动手,在非常多QQ群里高手的帮助下(本人正則表達式非常烂.程序复杂的正则都是一些高手指导的),花了三四天写了一个脚本 须 ...
随机推荐
- 【uoj#164】[清华集训2015]V 线段树维护历史最值
题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...
- 【bzoj5130】[Lydsy12月赛]字符串的周期 DFS+KMP
题目描述 给定 $n$ 和 $m$ ,求所有 长度为 $n$ ,字符集大小为 $m$ 的字符串,每个前缀的最短循环节长度乘积 的总和. $n\le 12,m\le 10^9$ 题解 DFS+KMP 对 ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- python 内置函数02
1. lambda 匿名函数 lambda 参数: 返回值 #常规计算两个数相加的函数 def func(a,b): return a+b print(func(1,9)) #lambda函数 my_ ...
- Spring Boot系列教程九:Spring boot集成Redis
一.创建项目 项目名称为 “springboot_redis”,创建过程中勾选 “Web”,“Redis”,第一次创建Maven需要下载依赖包(耐心等待) 二.实现 properties配置文件中添加 ...
- 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...
- 洛谷 P2498 [SDOI2012]拯救小云公主 解题报告
P2498 [SDOI2012]拯救小云公主 题目描述 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到\(boss\)的洞穴门口,他一下子就懵了,因为面前不只是一 ...
- bzoj2396: 神奇的矩阵(矩阵乘法+随机化)
这题n三方显然会GG... 运用矩阵乘法的性质A*B*R=A*(B*R)=C*R,于是随机化出一个一列的R,就可以把复杂度降低成n方...大概率是不会错的 #include<iostream&g ...
- 手脱tElock 0.98b1 -> tE!
声明: 只为纪录自己的脱壳历程,高手勿喷 第一种:两次内存法 注: ①这是在win7x32系统上运行的脱壳,所以可能地址不同 ②修复的时候用等级三修复,最后修复不了的剪切掉然后转存合一正常运行,已测试 ...
- duilib 修复CTreeViewUI复选功能判断不准确的bug
转载请说明出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/42265209 CTreeViewUI里面自带了复选的功能,但是复选功能存在 ...