比requests还好用的Python高效爬虫库,效率提升一倍!
什么是协程?
控制权在用户手中:线程的控制权在操作系统手中,而协程完全由用户控制,这减少了上下文切换的开销,提高了效率。 更轻量:线程需要分配较大的栈空间(通常是MB级别),而协程只需要几KB,因此可以在相同内存中运行更多的协程。 避免锁机制:因为协程是单线程的,不存在多线程的资源竞争问题,不需要加锁,避免了死锁和竞争状态,提高了执行效率。
为什么选择httpx?
pip install httpx
使用httpx进行异步请求
同步请求示例
import requestsimport timedef sync_main(url, sign):response = requests.get(url)print(f'sync_main: {sign}: {response.status_code}')sync_start = time.time()[sync_main('http://www.baidu.com', i) for i in range(200)]sync_end = time.time()print(f'Total time for sync requests: {sync_end - sync_start} seconds')
sync_main: 0: 200...sync_main: 199: 200Total time for sync requests: 16.6 seconds
异步请求示例
import asyncioimport httpximport timeasync def async_main(url, sign):async with httpx.AsyncClient() as client:response = await client.get(url)print(f'async_main: {sign}: {response.status_code}')async def main():tasks = [async_main('http://www.baidu.com', i) for i in range(200)]await asyncio.gather(*tasks)async_start = time.time()asyncio.run(main())async_end = time.time()print(f'Total time for async requests: {async_end - async_start} seconds')
async_main: 0: 200...async_main: 199: 200Total time for async requests: 4.5 seconds
深入理解httpx
1. 并发请求
import asyncioimport httpxasync def fetch(url):async with httpx.AsyncClient() as client:response = await client.get(url)return response.textasync def main(urls):tasks = [fetch(url) for url in urls]results = await asyncio.gather(*tasks)return resultsurls = ['http://example.com' for _ in range(100)]results = asyncio.run(main(urls))print(f'Fetched {len(results)} pages')
2. 异步上下文管理
import httpximport asyncioasync def fetch(url):async with httpx.AsyncClient() as client:response = await client.get(url)return responseasync def main():response = await fetch('http://example.com')print(response.text)asyncio.run(main())
3. 超时和重试机制
import httpximport asyncioasync def fetch(url):async with httpx.AsyncClient(timeout=5.0) as client:response = await client.get(url)return responseasync def main():try:response = await fetch('http://example.com')print(response.text)except httpx.TimeoutException:print('Request timed out')asyncio.run(main())
httpx在实际项目中的应用
1. 数据抓取
import asyncioimport httpxasync def fetch_data(url):async with httpx.AsyncClient() as client:response = await client.get(url)return response.json()async def main(urls):tasks = [fetch_data(url) for url in urls]results = await asyncio.gather(*tasks)for result in results:print(result)urls = [f'http://api.example.com/data/{i}' for i in range(100)]asyncio.run(main(urls))
2. 接口测试
import asyncioimport httpxasync def test_api(url):async with httpx.AsyncClient() as client:response = await client.get(url)assert response.status_code == 200async def main(urls):tasks = [test_api(url) for url in urls]await asyncio.gather(*tasks)urls = [f'http://api.example.com/test/{i}' for i in range(100)]asyncio.run(main(urls))
结语
目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB。全部免费领取!全面满足各个阶段程序员的学习需求。