python实现并发获取html的几种方式
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()
python实现并发获取html的几种方式的更多相关文章
- 获取Type的三种方式
using System;using UnityEngine; public class Type_Test : MonoBehaviour{ private void Awake() { ...
- java动态获取WebService的两种方式(复杂参数类型)
java动态获取WebService的两种方式(复杂参数类型) 第一种: @Override public OrderSearchListRes searchOrderList(Order_Fligh ...
- AngularJS中获取数据源的几种方式
在AngularJS中,可以从$rootScope中获取数据源,也可以把获取数据的逻辑封装在service中,然后注入到app.run函数中,或者注入到controller中.本篇就来整理获取数据的几 ...
- java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMi ...
- 【Struts2】Struts2获取session的三种方式
1.Map<String,Object> map = ActionContext.getContext().getSession(); 2.HttpSession session = S ...
- js获取时间戳的三种方式
js获取时间戳的三种方式 CreateTime--2018年5月23日08:44:10 Author:Marydon // 方式一:推荐使用 var timestamp=new Date().ge ...
- Struts2(四.注册时检查用户名是否存在及Action获取数据的三种方式)
一.功能 1.用户注册页面 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- HTTP获取信息的四种方式
HTTP 从网络获取信息的四种方式 GET GET指代你在浏览器中输入网址,浏览网站时做的事.例如,我们使用 http://www.baidu.com 的时候,可以将GET想象成他说:"hi ...
- SpringMVC获取参数的几种方式
前言: 年末了,忙了一年了却发现系统的整理的东西很少,一些基础的东西都未做整理,这里就将它随便整理一下,增加一些印象,当然在网上看到一些好的资料也会整理下来以备后用.今天整理一下springMVC获取 ...
随机推荐
- Oozie wordcount实战
一.定义 基本概念 Action: An execution/computation task (Map-Reduce job, Pig job, a shell command). It can a ...
- 点击EditText可编辑,点击其他地方不可编辑
我是在Fragment中实现的,在网上查了,有的说要回调Activity的onTouch事件,通过实验直接在Fragment中即可.如下: 我的EditText在ScrollView,因为Scroll ...
- Android 微信支付步骤
以前自己写过微信支付,今天让我用h5调用微信支付,结果还浪费了点时间,虽然时间不长. 1.导入jar包 .微信提供的jar包 2.写你的微信支付的代码,其实如果参数都有了就一段代码: public v ...
- PAT、PMT、SDT详解
下面针对解复用程序详细分析一下PAT,PMT和SDT三类表格的格式. 如下图,四个频道复用 PAT---Program Association Table,节目关联表 .PAT表携带以下信息: (1) ...
- Maven学习 (二) Eclipse 上安装 Maven3插件
eclipse 安装插件的方式最常见的有两种: 1. 一种是在线安装,这貌似是用的最多的,就是:Help --> Install New Software,然后输入 HTTP 地址来安装,但 ...
- 通过学习制作长微博工具来了解水印的制作,及EditText中的内容在图片中换行显示
长微博工具非常有用,140字的要求可能阻止你写更多的内容,于是长微博工具应运而生,虽然网上有很多长微博工具,但是我都不是很满意,所以自己想做一个,通过做这个长微博工具,我学习到了很多东西,有两个难点, ...
- ARC下还会存在内存泄露吗?
1.第三方框架不正当使用.2.block,delegate,NSTimer循环使用.3.非oc对象的内存处理.4.地图类处理.5.大次数循环内存暴涨. 非oc对象的释放: 例如使用CGImageRel ...
- USACO Section1.5 Number Triangles 解题报告
numtri解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...
- Unit Test Generator使用
一.环境 1.单元测试(个人理解):是通过编写测试程序检查和验证其他程序的正确性.测试单元粒度越较越易于发现问题. 2.在VS2010在编辑器右键便出现 创建“单元测试”几个字样,可是到了vs2013 ...
- Android通过onDraw实现在View中绘图操作
Android绘图操作,通过继承View实现,在onDraw函数中实现绘图. 下面是一个简单的例子: public class AndroidTest extends Activity { /** C ...