python - 如何在 python 中下载登录表单后面网页的大媒体链接?
问题描述
我正在寻找一些 Python 中的一个或多个库来:
a) 登录网站,b) 找到指向某些媒体文件的所有链接(假设在其 URL 中包含“下载”),以及 c) 将每个文件有效地直接下载到硬盘驱动器(无需将整个媒体文件加载到内存)。
谢谢
解决方案
您可以使用该mechanize
模块登录网站,如下所示:
import mechanize
br = mechanize.Browser()
br.set_handle_robots(False)
br.open("http://www.example.com")
br.select_form(nr=0) #Pass parameters to uniquely identify login form if needed
br['username'] = '...'
br['password'] = '...'
result = br.submit().read()
用于bs4
解析此响应并查找页面中的所有超链接,如下所示:
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(result, "lxml")
links = []
for link in soup.findAll('a'):
links.append(link.get('href'))
您可以使用re
响应网页中存在的所有链接来进一步缩小您需要的链接,在您的情况下,这些链接是媒体链接(.mp3、.mp4、.jpg 等)。
最后,使用requests
模块流式传输媒体文件,这样它们就不会占用太多内存,如下所示:
response = requests.get(url, stream=True) #URL here is the media URL
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
当stream
of 的属性get()
设置为 True 时,内容不会立即开始下载到 RAM,而是response
表现得像一个可迭代对象,您可以在语句chunk_size
之后立即在循环中以大小块进行迭代。get()
在继续下一个块之前,您可以将前一个块写入内存,从而确保数据不存储在 RAM 中。
如果要下载links
列表中每个链接的媒体,则必须将最后一段代码放入循环中。
您可能最终必须对此代码进行一些更改以使其正常工作,因为我自己还没有为您的用例测试过它,但希望这可以提供一个可以解决的蓝图。
推荐阅读
- macos - 您可以在 MacOS 上跟踪进程的 I/O 活动吗?
- database-design - 强制数据库约束
- assembly - equ $ - 指令如何以 nasm 语法获取字符串的长度?
- elasticsearch - 如何解决在 Windows 中启动 Kibana 时出现的错误“No living connection”
- angular - 使用 Angular 材料的自定义验证
- sql - R 中的 Copy_to 导致日期转换为数字列
- java - 没有得到正确的输出
- flutter - 如何在小部件树中添加命令?
- php - foreach laravel 没有结果
- bash - 如何在秒表中同时使用 read 和 while