Python:如何将webfile下载到内存中?

时间:2014-10-20 22:31:10

标签: python cookies urllib2 python-requests stringio

[为了打开示例网址,您需要登录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 文件内容的字符串中读取。

关于我该怎么做的任何想法或提示?

1 个答案:

答案 0 :(得分:0)

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

  1. Scrapy - 处理身份验证的网络蜘蛛。这是一个很大的工具,但如果你做了大量的刮擦,它会很好用。
  2. requests库 - 这就是urllib2应该是的。 强烈推荐这份工作!
  3. 要使用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访问他们的网站可能会遇到另一个问题,但是如果您遇到这个问题,应该在新问题上发布这个问题!

    希望有所帮助!