【问题标题】:Python: How to download a webfile into the memory?Python:如何将网络文件下载到内存中?
【发布时间】:2014-12-16 01:07:39
【问题描述】:

[要打开示例网址,您需要登录 Shazam]

所以我正在编写一个脚本来下载我的 Shazam 历史记录,这样我就可以操纵它来将播放列表写入其他服务。无论如何,我无法直接解析来自 http://www.shazam.com/myshazam 的历史记录,因为那里正在进行大量 JavaScript 重新加载,我想解决这个问题会更难。 这就是为什么我要操作你可以下载的文件,你可以在这里找到http://www.shazam.com/myshazam/download-history

我正在尝试找到一种方法来做到这一点,但我在这里遇到了一些问题。

第一次我打算使用 urlretrieve

import urllib
urllib.urlretrieve ("http://www.shazam.com/myshazam/download-history, "myshazam-history.html")

但我什至不确定这是否会起作用,因为当我尝试下载该文件时,没有像 http://www.shazam.com/myshazam/download-history/myshazam-history.html 这样的实际 URL 路径(这会给你一个 404 错误)。相反,当您点击该 URL 时,它会立即重定向到 http://www.shazam.com,并提示浏览器的下载窗口。

第二个问题是我仍然需要保存会话的 cookie,我不知道如何将其传递给 urlretrieve 以测试它是否有效。下面是我写的一个测试代码,它正在登录,保持会话,然后解析一个网页。

def LoginFB(username,password):
   opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))
   url = "https://www.facebook.com/login.php?skip_api_lo....allthe_loginshazam_stuff)"
   data = "&email="+username+"&pass="+password
   socket = opener.open(url)
   return socket, opener

def shazamParse(opener):
   url = "http://www.shazam.com/myshazam/"
   content = opener.open(url).read()
   soup = BeautifulSoup(content)
   finalParse = soup.prettify()
   return finalParse.encode("utf-8")

(socket, opener) = LoginFB("email","password")

shazamParse(opener)    

我想要做的是以登录用户(持有会话cookie)的身份点击下载网址,将文件下载到内存中,将文件的内容放入一个字符串,然后用BeautifulSoup解析它。与我的 shazamParse 函数完全相同的方法只是我从 myshazam-history.html 文件内容的字符串中读取。

关于如何做到这一点的任何想法或提示?

【问题讨论】:

  • Python 有许多库可以自动执行此操作。斜纹布是我的最爱。

标签: python cookies urllib2 python-requests stringio


【解决方案1】:

虽然我会在这里提供直接的答案,但还有其他几个库会以更简洁、更易于维护的方式为您完成此类事情。它们是:

  1. Scrapy - 一个处理身份验证的网络蜘蛛。这是一个很大的工具,但如果你进行大量的抓取,它会很好地工作。
  2. requests library - 这是 urllib2 应该的。 强烈推荐这份工作!

要使用 urllib2 执行此操作,您需要使用 CookieJar 库,以便 urllib2 有机会保留在初始身份验证请求中设置的会话和 cookie 变量。

import urllib2
from cookielib import CookieJar

cj = CookieJar()
# Creates a custom page opener, which is cookie aware
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Make the actual url request from the server
data = {}  # Any optional data to add to the headers.
response = opener.open("http://www.example.com/page/page2", data)
page_data = response.read()

# Look at the HTML from the response
print page_data[0:200]

一旦您使用 CookieJar 设置 urllib2 opener,来自此开启程序的所有未来请求都将能够访问先前请求中设置的 cookie。

关于使用 facebook auth 访问他们的网站,您可能会遇到另一个问题,但如果您可能遇到该问题,应该将其发布在一个新问题上!

希望有帮助!

【讨论】:

  • 谢谢。所以我想我已经用你刚刚发布的相同实现解决了 cookie 的问题。我的问题是我不知道如何将 cookie 传递给 .urlretrieve() 方法,所以我可以使用该方法下载文件。
  • @user3381594:我编辑了答案,以便您了解如何检索页面的 HTML 数据。无需使用urlretrieve,因为它将它存储在驱动器上。我们可以在内存中使用它。
  • 谢谢伙计。我尝试了你的方法,但它不起作用。我收到 HTTP 错误 401。问题是我尝试解析的 URL 根本不会呈现 HTML。它的作用是提示您下载 HTML 文件。这就是你的 Shazam 历史。我想要实现的是将该文件下载到内存中,并且一旦将其解析为普通 HTML。但我想重复一遍,这个 URL 不会呈现 HTML。相反,它为您提供了一个 HTML 文件供您下载。几周前,他们以 PDF 格式提供列表,但几天前他们更改为 HTML 文件。有什么提示吗?
  • 401 错误意味着 Shazam 认为您无权查看该页面。首先处理 auth 部分。 urllib2 将下载服务器返回给请求的任何页面,即使那是文件下载响应。
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多