首页 > 解决方案 > 如何在 python 中下载登录表单后面网页的大媒体链接?

问题描述

我正在寻找一些 Python 中的一个或多个库来:

a) 登录网站,b) 找到指向某些媒体文件的所有链接(假设在其 URL 中包含“下载”),以及 c) 将每个文件有效地直接下载到硬盘驱动器(无需将整个媒体文件加载到内存)。

谢谢

标签: pythonweb-scraping

解决方案


您可以使用该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()

streamof 的属性get()设置为 True 时,内容不会立即开始下载到 RAM,而是response表现得像一个可迭代对象,您可以在语句chunk_size之后立即在循环中以大小块进行迭代。get()在继续下一个块之前,您可以将前一个块写入内存,从而确保数据不存储在 RAM 中。

如果要下载links列表中每个链接的媒体,则必须将最后一段代码放入循环中。

您可能最终必须对此代码进行一些更改以使其正常工作,因为我自己还没有为您的用例测试过它,但希望这可以提供一个可以解决的蓝图。


推荐阅读