aiohttp

aiohttp: rate limiting requests-per-second by domain

Deadly 提交于 2020-05-13 06:04:38
问题 I am writing a web crawler that is running parallel fetches for many different domains. I want to limit the number of requests-per-second that are made to each individual domain , but I do not care about the total number of connections that are open, or the total requests per second that are made across all domains. I want to maximize the number of open connections and requests-per-second overall, while limiting the number of requests-per-second made to individual domains. All of the

Aiohttp logging: how to distinguish log messages of different requests?

…衆ロ難τιáo~ 提交于 2020-04-29 18:55:25
问题 Imagine I have this web application based on Aiohttp: from aiohttp import web import asyncio import logging logger = logging.getLogger(__name__) async def hello(request): logger.info('Started processing request') await asyncio.sleep(1) logger.info('Doing something') await asyncio.sleep(1) return web.Response(text="Hello, world!\n") logging.basicConfig( level=logging.DEBUG, format='%(asctime)s %(name)-14s %(levelname)s: %(message)s') app = web.Application() app.add_routes([web.get('/', hello)]

你不会Python这几个库,不要说你会爬虫

老子叫甜甜 提交于 2020-04-22 00:58:50
很多朋友不知道Python爬虫怎么入门,怎么学习,到底要学习哪些内容。今天我来给大家说说学习爬虫,我们必须掌握的一些第三方库。 废话不多说,直接上干货。 这里要注意:不管你是为了Python就业还是兴趣爱好,记住:项目开发经验永远是核心,如果你没有2020最新python入门到高级实战视频教程,可以去小编的Python交流.裙 :七衣衣九七七巴而五(数字的谐音)转换下可以找到了,里面很多新python教程项目,还可以跟老司机交流讨教! 请求库 1. requests GitHub:https://github.com/psf/requests requests库应该是现在做爬虫最火最实用的库了,非常的人性化。有关于它的使用我之前也写过一篇文章 一起看看Python之Requests库 ,大家可以去看一下。 有关于requests最详细的使用方法,大家可以参考官方文档:https://requests.readthedocs.io/en/master/ 小案例 >>> import requests >>> r = requests.get( 'https://api.github.com/user', auth=( 'user', 'pass')) >>> r.status_code 200 >>> r.headers[ 'content-type'] 'application

python教程:使用 async 和 await 协程进行并发编程

江枫思渺然 提交于 2020-04-21 13:08:11
python 一直在进行并发编程的优化, 比较熟知的是使用 thread 模块多线程和 multiprocessing 多进程,后来慢慢引入基于 yield 关键字的协程。 而近几个版本,python 对于协程的写法进行了大幅的优化,很多之前的协程写法不被官方推荐了。如果你之前了解过 python 协程,你应该看看最新的用法。 并发、并行、同步和异步 并发指的是 一个 CPU 同时处理多个程序,但是在同一时间点只会处理其中一个。并发的核心是:程序切换。 但是因为程序切换的速度非常快,1 秒钟内可以完全很多次程序切换,肉眼无法感知。 并行指的是多个 CPU 同时处理多个程序,同一时间点可以处理多个。 同步:执行 IO 操作时,必须等待执行完成才得到返回结果。 异步:执行 IO 操作时,不必等待执行就能得到返回结果。 协程,线程和进程的区别 多进程通常利用的是多核 CPU 的优势,同时执行多个计算任务。每个进程有自己独立的内存管理,所以不同进程之间要进行数据通信比较麻烦。 多线程是在一个 cpu 上创建多个子任务,当某一个子任务休息的时候其他任务接着执行。多线程的控制是由 python 自己控制的。 子线程之间的内存是共享的,并不需要额外的数据通信机制。但是线程存在数据同步问题,所以要有锁机制。 协程的实现是在一个线程内实现的,相当于流水线作业。由于线程切换的消耗比较大

小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

穿精又带淫゛_ 提交于 2020-04-18 06:53:26
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基础 小白学 Python 爬虫(9):爬虫基础 小白学 Python 爬虫(10):Session 和 Cookies 小白学 Python 爬虫(11):urllib 基础使用(一) 小白学 Python 爬虫(12):urllib 基础使用(二) 小白学 Python 爬虫(13):urllib 基础使用(三) 小白学 Python 爬虫(14):urllib 基础使用(四) 小白学 Python 爬虫(15):urllib 基础使用(五) 小白学 Python 爬虫(16):urllib 实战之爬取妹子图 小白学 Python 爬虫(17):Requests 基础使用 小白学 Python 爬虫(18):Requests 进阶操作 小白学 Python 爬虫(19):Xpath 基操

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError('Event loop is closed')

限于喜欢 提交于 2020-04-11 10:48:14
找了半天没找到原因,记录一下 操作系统:windows 8.1 python版本:python 3.8.1 aiohttp版本:3.6.2 源码: 1 import asyncio 2 import aiohttp 3 4 5 async def aiohttp_request_test(url): 6 async with aiohttp.request( ' get ' , url= url) as resp: 7 await resp.text() 8 # await asyncio.sleep(1) # A1 9 10 11 async def main(): 12 await asyncio.gather(aiohttp_request_test( ' https://www.baidu.com ' )) 13 14 15 asyncio.run(main()) 16 # loop = asyncio.get_event_loop() 17 # loop.run_until_complete(main()) 运行以上代码时,出现如下异常: Exception ignored in : <function _ProactorBasePipeTransport. __del__ at 0x02A8C8E0> Traceback (most recent call last):

[未解决问题记录]python asyncio+aiohttp出现Exception ignored:RuntimeError(&apos;Event loop is closed&apos;)

断了今生、忘了曾经 提交于 2020-04-11 10:12:53
找了半天没找到原因,记录一下 操作系统:windows 8.1 python版本:python 3.8.1 aiohttp版本:3.6.2 源码: 1 import asyncio 2 import aiohttp 3 4 5 async def aiohttp_request_test(url): 6 async with aiohttp.request( ' get ' , url= url) as resp: 7 await resp.text() 8 # await asyncio.sleep(1) # A1 9 10 11 async def main(): 12 await asyncio.gather(aiohttp_request_test( ' https://www.baidu.com ' )) 13 14 15 asyncio.run(main()) 16 # loop = asyncio.get_event_loop() 17 # loop.run_until_complete(main()) 运行以上代码时,出现如下异常: Exception ignored in : <function _ProactorBasePipeTransport. __del__ at 0x02A8C8E0> Traceback (most recent call last):

Python中有许多HTTP客户端,但使用最广泛且最容易的是requests

[亡魂溺海] 提交于 2020-04-10 14:21:31
前言 文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:北京尚脑软件测试 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun 持续连接 持续连接是自HTTP 1.1以来的标准,尽管许多应用程序并未使用它们。以简单模式使用请求时(例如使用get函数),连接会在返回时关闭,Session对象允许重用已经打开的连接。 每个连接都存储在连接池中(默认为10) 重用TCP连接有许多性能优势: 降低CPU和内存使用率(同时打开的连接较少)。 减少了后续请求中的延迟(无TCP握手)。 可以引发异常而不会关闭TCP连接。 HTTP协议还提供了流水线,流水线化允许在同一连接上发送多个请求,而无需等待答复(批处理)。不幸的是,请求库不支持此功能。但是,流水线请求可能不如并行发送它们那么快。实际上,HTTP 1.1协议强制以与发送请求相同的顺序发送答复-先进先出。 并行 requests的主要缺点是同步的。调用requests.get("http://example.org")会阻塞程序,直到HTTP服务器完全答复为止。可以通过使用并发线程提供的线程池来缓解此问题。它允许以非常快速的方式并行化HTTP请求。 也可以借助requests-futures的库:

接口自动化测试框架开发 (pytest+allure+aiohttp+ 用例自动生成)

孤街浪徒 提交于 2020-04-06 22:46:22
近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越多,所以提高执行效率很有必要 接口测试的用例其实也可以用来兼做简单的压力测试,而压力测试需要并发 接口测试的用例有很多重复的东西,测试人员应该只需要关注接口测试的设计,这些重复劳动最好自动化来做 pytest和allure太好用了,新框架要集成它们 接口测试的用例应该尽量简洁,最好用yaml,这样数据能直接映射为请求数据,写起用例来跟做填空题一样,便于向没有自动化经验的成员推广 加上我对Python的协程很感兴趣,也学了一段时间,一直希望学以致用,所以http请求我决定用aiohttp来实现。 但是pytest是不支持事件循环的,如果想把它们结合还需要一番功夫。于是继续思考,思考的结果是其实我可以把整个事情分为两部分。 第一部分,读取yaml测试用例,http请求测试接口,收集测试数据。 第二部分,根据测试数据,动态生成pytest认可的测试用例,然后执行,生成测试报告。 这样一来,两者就能完美结合了,也完美符合我所做的设想。想法既定,接着 就是实现了。 第一部分(整个过程都要求是异步非阻塞的) 读取yaml测试用例 一份简单的用例模板我是这样设计的,这样的好处是,参数名和aiohttp

How i call async function without await?

久未见 提交于 2020-03-14 07:48:03
问题 I have a controller action in aiohttp application. async def handler_message(request): try: content = await request.json() perform_message(x,y,z) except (RuntimeError): print("error in perform fb message") finally: return web.Response(text="Done") perform_message is async function. Now, when I call action I want that my action return as soon as possible and perform_message put in event loop. In this way, perform_message isn't executed 回答1: One way would be to use create_task function: import