[为了打开示例网址,您需要登录Shazam]
所以我正在编写一个下载我的Shazam历史记录的脚本,以便我可以操作它来将播放列表写入其他服务。无论如何,我不能直接从http://www.shazam.com/myshazam解析历史记录,因为那里有很多JavaScript重新加载,我想解决这个问题会更难。 这就是为什么我想操纵你可以下载的文件,你可以在这里找到http://www.shazam.com/myshazam/download-history
我正试图找到一种方法来做到这一点,但我在这里遇到了一些问题。
1我计划使用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)
我想要做的是以下载URL作为已登录用户(持有会话cookie),将文件下载到内存中,将文件内容放入字符串中,然后使用BeautifulSoup进行解析。与我的shazamParse函数完全相同的方法只是我从带有 myshazam-history.html 文件内容的字符串中读取。
关于我该怎么做的任何想法或提示?
答案 0 :(得分:0)
虽然我会在这里提供一个直接的答案,但还有其他几个库会以更清洁,更易于维护的方式为您做这类事情。他们是:
要使用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访问他们的网站可能会遇到另一个问题,但是如果您遇到这个问题,应该在新问题上发布这个问题!
希望有所帮助!