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获取 ...
随机推荐
- 使用泛型类简化ibatis系统架构
jdk1.5的推出为我们带来了枚举.泛型.foreach循环.同步工具包等等好东西.其中,泛型的使用为我们的代码开发提供了很大的简便,简化了我们的代码. 1.设计思路 1)GenericDao泛型类提 ...
- TouTiao开源项目 分析笔记8 图解分析数据加载方式
1.整体构架 1.1.以一个段子页面为例,列出用到的主要的类,以图片的方式展示. 1.2.基础类 这里最基础的接口有: IBaseView<T>==>定义了5个方法. 然后最基础 ...
- 如何让button保持点击状态
http://blog.csdn.net/u010957508/article/details/38385207 他的原理就是在代码里面: view.setSelected(true); 而其他的: ...
- 在ddms 里面查看data/data里面的东西 不显示data/data
今天我要查看data/anr/tarces.txt,没办法,我只有root手机. 可是root之后,我发现还是不能查看或者导出traces.txt. 后来我才知道,root之后,文件夹权限没有变,所以 ...
- CC3200串口UART1配置
1. 首先打开工程\CC3200SDK_1.1.0\example\adc\ewarm,以ADC例程为例,修改串口引脚复用,先看下引脚图 2. 修改引脚复用代码 void PinMuxConfig(v ...
- 容器技术的落地还要依靠SDN
容器能够实现新应用程序的快速部署,代表着目前IT开发社区的最热门趋势之一.然而,想要实现容器部署生产环境,IT人员还需要使用SDN技术,在分布式微应用程序之间实现可扩展.可管理且安全的通信. 什么是容 ...
- 《Cracking the Coding Interview》——第17章:普通题——题目9
2014-04-28 23:52 题目:设计算法,找出一本书中某个单词的出现频率. 解法:数就行了. 代码: // 17.9 Given a book, find out the occurrence ...
- HTML5标签学习笔记
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta http-equiv="con ...
- day06_02 元组
1.0 元组 元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组.元素卸载小括号(())里,元素之间用逗号隔开. tup1 = () #空元组 tup2 = (20 ...
- Windows批处理中获取日期和时间
编写Windows bat 批处理时经常会需要使用到日期和时间作为文件名,所以是非常重要的. 如何获取日期呢? 格式: %date% 结果: -- 如何获取时间呢? 格式: %time% 结果: :: ...