【发布时间】:2020-09-13 05:56:53
【问题描述】:
我的原始代码(使用了requests 库):
sess = requests.session()
req = sess.get(i) #i is a url
soup = BeautifulSoup(req.content, 'html.parser')
link = soup.find('a')['href']
with sess.get(link, stream=True) as req2:
with open(os.path.join('C:\\save\\location', "download.txt"), "wb") as x_file:
shutil.copyfileobj(req2.raw, x_file)
这段代码的作用:
- 在 url
i处获取页面 - 使用
bs4在所述页面(它是一个文本文件)上找到特定的下载链接link。 - 该网站使用会话 cookie,因此我使用来自
requests的sessions来保存我的 cookie 从一个请求到下一个请求,以便它可以下载文件。 - 使用
shutil将文本文件写入我的设备中提到的目录。
就代码的工作而言,没问题。该文件已下载,我在所需文件夹中有名为 download.txt 的所需文件。
但是,当我尝试在async 函数中将其用作discord.py 机器人的一部分时,就会出现问题。代码仍然做了它需要做的事情但是:当它得到多个命令时,它会一个接一个地执行它们,这显然是不可取的。我从 Stack Overflow 本身发现这是因为在 async 函数中使用 requests 会导致整个代码阻塞,从而导致我观察到的情况。因此,我尝试使用aiohttp,而不是requests,它显然与async 函数配合得很好。我已经设法用aiohttp 替换了我对requests 的大部分使用,它似乎运行良好,但是我似乎无法找出正确的语法来做我上面所做的事情(下载文本文件同时使用会话 cookie,bs4 和 shutil。
在使用aiohttp 时,我将如何使用 bs4 保留会话 cookie 并将文件写入我的设备?
编辑 原始链接和文件属于个人性质,但如果您想要一个样本进行测试,这应该以类似的方式工作:
import requests
from bs4 import BeautifulSoup
import os
import shutil
sess = requests.session()
req = sess.get('https://www.gutenberg.org/ebooks/2600')
soup = BeautifulSoup(req.content, 'html.parser')
link = soup.find('a', text="EPUB (no images)")['href']
link="https://www.gutenberg.org"+link
with sess.get(link, stream=True) as req2:
with open(os.path.join('C:\\save\\location', "war.epub"), "wb") as x_file:
shutil.copyfileobj(req2.raw, x_file)
这会在您想要的目录中创建一个名为 war.epub 的文件,其中包含从 Gutenberg 项目下载的战争与和平的 epub 版本。我将如何使用 aiohttp 而不是请求来实现这一点?
【问题讨论】:
-
你能提供一个我们可以用于测试目的的 URL 吗?或者,您使用
shutil保存的内容 -
@Benjin 啊,我不能真正提供网址,因为它是一种个人网站,但我要保存的细节是:它是一个基本的 .txt 文件,有几个字符在里面。
-
@Benjin 实际上,现在我找到了一个公共 url,我的代码似乎以类似的方式工作。已更新问题。也许现在你可以看看?提前致谢!
标签: python-3.x python-requests discord.py aiohttp