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