Python:如何将网页文件下载到内存中?
要打开示例网址,你需要登录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 个回答
虽然我这里会给出一个直接的答案,但其实有几个其他的库可以更简单、更好地完成这个任务。它们分别是:
- Scrapy - 这是一个网络爬虫工具,可以处理身份验证。虽然它比较大,但如果你需要经常抓取数据,它会非常好用。
- 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的身份验证来访问他们的网站。如果你碰到这个问题,建议你另开一个问题来询问!
希望这些信息对你有帮助!