Python:如何将网页文件下载到内存中?

0 投票
1 回答
1355 浏览
提问于 2025-04-28 16:18

要打开示例网址,你需要登录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")

但我不确定这是否能成功,因为当我尝试下载那个文件时,并没有一个实际的URL路径,比如http://www.shazam.com/myshazam/download-history/myshazam-history.html(这会给你一个404错误)。相反,当你访问那个URL时,它会立即重定向到http://www.shazam.com,并弹出浏览器的下载窗口。

第二个问题是,我仍然需要保持会话的cookies,但我不知道怎么把它们传递给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)    

我想做的是以登录用户的身份访问下载网址(保持会话cookies),将文件下载到内存中,把文件的内容放入一个字符串中,然后用BeautifulSoup解析它。这个方法和我的shazamParse函数完全一样,只不过我这次是从包含myshazam-history.html文件内容的字符串中读取。

有没有什么想法或提示可以帮助我实现这个目标?

暂无标签

1 个回答

0

虽然我这里会给出一个直接的答案,但其实有几个其他的库可以更简单、更好地完成这个任务。它们分别是:

  1. Scrapy - 这是一个网络爬虫工具,可以处理身份验证。虽然它比较大,但如果你需要经常抓取数据,它会非常好用。
  2. requests库 - 这个库是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,那么这个opener之后的所有请求都能访问之前请求中设置的cookie。

另外,你可能会遇到一个问题,就是使用Facebook的身份验证来访问他们的网站。如果你碰到这个问题,建议你另开一个问题来询问!

希望这些信息对你有帮助!

撰写回答