如何在Python中使用asyncio和wget下载多个文件?

2023-12-20

我想从 dukaskopy 下载许多文件。典型的 url 如下所示。

url = 'http://datafeed.dukascopy.com/datafeed/AUDUSD/2014/01/02/00h_ticks.bi5'

我尝试了答案here https://stackoverflow.com/questions/31784484/how-to-parallelized-file-downloads但大多数文件的大小都是 0。

但是当我简单地使用 wget 循环时(见下文),我得到了完整的文件。

import wget
from urllib.error import HTTPError

pair = 'AUDUSD'
for year in range(2014,2015):
    for month in range(1,13):
        for day in range(1,32):
            for hour in range(24): 
                try:
                    url = 'http://datafeed.dukascopy.com/datafeed/' + pair + '/' + str(year) + '/' + str(month-1).zfill(2) + '/' + str(day).zfill(2) + '/' + str(hour).zfill(2) + 'h_ticks.bi5'
                    filename = pair + '-' + str(year) + '-' + str(month-1).zfill(2) + '-' + str(day).zfill(2) + '-' + str(hour).zfill(2) + 'h_ticks.bi5'
                    x = wget.download(url, filename)
#                     print(url)
                except HTTPError as err:
                    if err.code == 404:
                        print((year, month,day, hour))
                    else:
                        raise

我已经使用了以下内容code https://stackoverflow.com/questions/55186122/asyncio-aiohttp-not-returning-response早期用于抓取网站,但不用于下载文件。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from aiohttp import ClientSession, client_exceptions
from asyncio import Semaphore, ensure_future, gather, run
from json import dumps, loads

limit = 10
http_ok = [200]


async def scrape(url_list):
    tasks = list()
    sem = Semaphore(limit)

    async with ClientSession() as session:
        for url in url_list:
            task = ensure_future(scrape_bounded(url, sem, session))
            tasks.append(task)

        result = await gather(*tasks)

    return result


async def scrape_bounded(url, sem, session):
    async with sem:
        return await scrape_one(url, session)


async def scrape_one(url, session):
    try:
        async with session.get(url) as response:
            content = await response.read()
    except client_exceptions.ClientConnectorError:
        print('Scraping %s failed due to the connection problem', url)
        return False

    if response.status not in http_ok:
        print('Scraping%s failed due to the return code %s', url, response.status)
        return False

    content = loads(content.decode('UTF-8'))

    return content

if __name__ == '__main__':
    urls = ['http://demin.co/echo1/', 'http://demin.co/echo2/']
    res = run(scrape(urls))

    print(dumps(res, indent=4))

有一个使用多处理下载多个文件的答案here https://stackoverflow.com/questions/52000950/python-wget-download-multiple-files-at-once。但我认为 asyncio 可能会更快。

当返回 0 大小的文件时,可能是服务器限制了请求数量,但我仍然想探索是否有可能使用 wget 和 asyncio 下载多个文件。


这是一个例子。解码/编码以及写入操作应根据目标数据类型进行固定。

   #!/usr/bin/env python3
# -*- coding: utf-8 -*-

from aiofile import AIOFile
from aiohttp import ClientSession
from asyncio import ensure_future, gather, run, Semaphore
from calendar import monthlen
from lzma import open as lzma_open
from struct import calcsize, unpack
from io import BytesIO
from json import dumps

http_ok = [200]
limit = 5
base_url = 'http://datafeed.dukascopy.com/datafeed/{}/{}/{}/{}/{}h_ticks.bi5'
fmt = '>3i2f'
chunk_size = calcsize(fmt)


async def download():
    tasks = list()
    sem = Semaphore(limit)

    async with ClientSession() as session:
        for pair in ['AUDUSD']:
            for year in [2014, 2015]:
                for month in range(1, 12):
                    for day in range(1, monthlen(year, month)):
                        for hour in range(0, 23):
                            tasks.append(ensure_future(download_one(pair=pair,
                                                                    year=str(year).zfill(2),
                                                                    month=str(month).zfill(2),
                                                                    day=str(day).zfill(2),
                                                                    hour=str(hour).zfill(2),
                                                                    session=session,
                                                                    sem=sem)))
        return await gather(*tasks)


async def download_one(pair, year, month, day, hour, session, sem):
    url = base_url.format(pair, year, month, day, hour)
    data = list()

    async with sem:
        async with session.get(url) as response:
            content = await response.read()

        if response.status not in http_ok:
            print(f'Scraping {url} failed due to the return code {response.status}')
            return

        if content == b'':
            print(f'Scraping {url} failed due to the empty content')
            return

        with lzma_open(BytesIO(content)) as f:
            while True:
                chunk = f.read(chunk_size)
                if chunk:
                    data.append(unpack(fmt, chunk))
                else:
                    break

        async with AIOFile(f'{pair}-{year}-{month}-{day}-{hour}.bi5', 'w') as fl:
            await fl.write(dumps(data, indent=4))

        return


if __name__ == '__main__':
    run(download())

源代码可用here https://github.com/caa06d9c/Examples/tree/master/Python/basic/asyncio/download_file_iterate

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中使用asyncio和wget下载多个文件? 的相关文章

  • 类的 IPython 表示

    我正在使用我创建的模块尝试 IPython 但它没有显示类对象的实际表示 相反 它显示类似的内容 TheClass module TheClass name I heavily在这个模块中使用元类 我有真正有意义的类表示 应该向用户显示 是
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 更好地相当于这个疯狂的嵌套 python for 循环

    for a in map for b in map a for c in map b for d in map c for e in map d print a b c d e 上面的代码用于创建图中一定长度的所有路径 map a 表示从
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 如何使用 AWS Lambda Python 读取 AWS S3 存储的 Word 文档(.doc 和 .docx)文件内容?

    我的场景是 我尝试使用 python 实现从 Aws Lambda 读取 AWS 存储的 S3 word 文档 doc 和 docx 文件内容 下面的代码是我使用的 我的问题是我可以获取文件名 但无法读取内容 def lambda hand
  • 为什么 csv.DictReader 给我一个无属性错误?

    我的 CSV 文件是 200 Service 我放入解释器的代码是 snav csv DictReader open screennavigation csv delimiter print snav fieldnames 200 for
  • 制作一份 Python 文档的 PDF 文件

    Python 官方网站提供 PDF 文档下载 但它们是按章节分隔的 我下载了源代码并构建了 PDF 文档 这些文档也是单独的 PDF 我怎么能够从源代码中的 Makefile 构建一个 PDF 文件 我认为这样阅读起来会更方便 如果连接单独
  • 等待子进程使用 os.system

    我用了很多os system在 for 循环内调用创建后台进程 如何等待所有后台进程结束 os wait告诉我没有子进程 ps 我使用的是Solaris 这是我的代码 usr bin python import subprocess imp
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是
  • python 对浮点数进行不正确的舍入

    gt gt gt a 0 3135 gt gt gt print 3f a 0 314 gt gt gt a 0 3125 gt gt gt print 3f a 0 312 gt gt gt 我期待 0 313 而不是 0 312 有没有
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的
  • 为什么curl允许使用文件URL方案,但wget不允许

    这个问题指的是curl 7 21 4和GNU Wget 1 13 4 我不知道答案是否特定于版本 使用文件 URI 方案 http en wikipedia org wiki File URI scheme我可以使用获取本地文件curl a
  • NLTK:查找单词大小为 2k 的上下文

    我有一个语料库 我有一个词 对于语料库中该单词的每次出现 我想获取一个包含该单词之前的 k 个单词和该单词之后的 k 个单词的列表 我在算法上做得很好 见下文 但我想知道 NLTK 是否提供了一些我错过的功能来满足我的需求 def size

随机推荐

  • 通过 Gremlin 计算大图中的节点/边数?

    通过 Gremlin 计算大图中的节点 边数的最简单且最有效的方法是什么 我发现最好的方法是使用 V 迭代器 gremlin gt g V gather it size 然而 对于大图来说 这不是一个可行的选择V 的文档 http grem
  • numpy 中的加权协方差矩阵

    我想计算协方差C of n的测量p数量 其中每个单独的数量测量都有自己的权重 也就是我的权重数组W与我的数量数组具有相同的形状Q n by p 当地人np cov 函数仅支持赋予各个测量值的权重 即长度向量n 我可以初始化一个p by p矩
  • EF core、Any 无法翻译,将在本地评估

    我有一个程序可以返回我需要的实体 ID 我决定创建此过程 因为应返回给最终用户的实体由相关实体过滤 但 EF Core 不支持相关实体过滤 然后我想使用这个 id 来获取我需要的实体及其相关实体 我正在使用Any operator In m
  • Cleave.js 电话 CA

    我正在尝试使用格式化电话号码字段Cleave js https nosir github io cleave js 它不起作用 但我似乎不明白为什么 我是这样开始的 import Cleave from cleave js var clea
  • 如何在android中的string.xml中添加多段落的长文本

    当我在之间添加许多段落时
  • 组播中的环回

    这个问题是关于在同一主机内发送和接收多播 同时将其发送到其他主机 即使经过几个小时的谷歌搜索 我仍然无法弄清楚多播数据报是如何在同一主机内路由的 下面是问题的详细描述 Linux 盒子 A 通过电缆连接到交换机 路由器 我们将交换机 路由器
  • PHP 转义用户输入的文件名

    我有一个用户可以上传文件的表单 我想将该文件命名为 id lastname firstname pdf 该名称是由用户输入的 我担心他们输入的内容中带有斜杠 否则 类似的事情 path dir filename可能会导致 path uplo
  • 返回 PagedResources 的单元测试 Spring MVC 控制器

    我正在使用 Spring Boot 1 4 1 Spring Data Jpa 和 Spring Data Test 构建一个应用程序 我有以下控制器 我想用它返回分页帐户 RequestMapping method RequestMeth
  • 稠密对称矩阵的特征有效类型

    Does Eigen http eigen tuxfamily org index php title Main Page有存储密集 固定大小 对称矩阵的有效类型吗 嘿 它们无处不在 IE 对于 N 9 它应该只存储 1 9 9 2 45
  • 决定何时使用 XmlDocument 与 XmlReader

    我正在优化自定义对象 gt XML 序列化实用程序 一切都已完成并正常工作 这不是问题 它的工作原理是将文件加载到XmlDocument对象 然后递归地遍历所有子节点 我想也许使用XmlReader而不是有XmlDocument加载 解析整
  • Objective-C UIViewImage 动画

    现在我可以使用下面的代码制作一个简单的动画 但是 下面的解决方案需要我预先定义图像名称 我怎样才能做类似 NSArray push image1 png 的事情例如 然后将动态数组指定为animationImages 谢谢你 球座 UIIm
  • 如何在 Node.js 和 TypeScript 项目中使用 URLSearchParams [重复]

    这个问题在这里已经有答案了 我有一个使用 TypeScript 构建的 Node js 项目 我正在尝试使用URLSearchParams https developer mozilla org en US docs Web API URL
  • Google Apps / App Engine:https 版本的裸域不会重定向

    我有以下场景 网站托管在 AppEngine 中 我们希望强制它始终以 https 加载 我们在 app yaml 中使用 secure always 域在 Google Apps 中进行管理 我们已经上传了 SNI 证书 一切看起来都很好
  • 如何让 SQL Server Management Studio 在出现错误时停止处理?

    这似乎是一个非常愚蠢的问题 但如何让 SQL Server Management Studio 在遇到错误时停止处理 SQL 脚本 我有一个很长的脚本 如果开始时出现错误 SSMS 会报告它 然后盲目地继续 把事情搞砸得更多 我无法使用事务
  • 计算随机放在桌子上的卡片所覆盖的面积

    这是一道面试题 面试已经做过了 给定一副矩形卡片 将它们随机放在一张长方形桌子上 桌子的尺寸远大于卡片尺寸的总和 有些卡片可能会随机重叠 设计一个算法 可以计算所有卡片覆盖桌子的面积 并分析算法的时间复杂度 所有卡片每个顶点的所有坐标都是已
  • 需要帮助在 angularjs 中使用 visjs 创建网络图

    我需要帮助制作这个笨蛋 http plnkr co edit 0LQidVPnOSLhyydsoTwD p preview做类似的事情这个例子 http visjs org examples network exampleApplicati
  • Microsoft Graph API 用户自定义属性

    我需要通过图形 API 访问用户对象的自定义属性 目前 文档显示了可以在 v1 0 的 更新用户 部分中访问的属性 http graph microsoft io docs api reference v1 0 api user updat
  • RESTFul OAuth 与 FOSOAuthServer / FOSRest 和 FOSUser

    我很难完全理解解释的客户端创建的概念here http blog tankist de blog 2013 07 17 oauth2 explained part 2 setting up oauth2 with symfony2 usin
  • 使用 Google Apps 脚本在 Gmail 中创建新过滤器

    我想使用 Google Apps 脚本在 Gmail 中创建一个新标签和一个新过滤器 这会将所有新电子邮件推送到特定标签中 我已经创建了一个工作正常的标签 但我无法创建过滤器 我知道在 GMail 的搜索条件中创建新的过滤器很容易 但我想自
  • 如何在Python中使用asyncio和wget下载多个文件?

    我想从 dukaskopy 下载许多文件 典型的 url 如下所示 url http datafeed dukascopy com datafeed AUDUSD 2014 01 02 00h ticks bi5 我尝试了答案here ht