以CSV格式访问IMDB监视列表

时间:2013-12-27 12:41:00

标签: python https

IMDB允许您创建一个可以轻松导出为CSV格式的监视列表。我希望能够使用Python以编程方式执行此操作。

我面临的问题是,如果没有登录,我显然无法访问它。如果我尝试直接访问它,我会收到404响应。所以我想,我需要先登录,然后尝试获取数据。

查看HTML代码,我发现至少有一个登录表单有这些输入:

<input type="hidden" name="49e6c" value="898d" />
<input id="usernameprompt" type="text" size="20" name="login" value="" >
<input id="passwordprompt" type="password" size="20" name="password">
<input type="submit" class="linkasbutton-primary" value="Login!">

第一个输入中的值尚未更改,因此我认为这还不是问题。

表单的位置位于https://secure.imdb.com/register-imdb/login?ref_=nv_usr_lgin_3,在代码中指定为IMDBLOGIN。

现在我想使用此信息登录,使用每个输入的名称作为键,值为值:

form = OrderedDict([("49e6c", "898d"), ("login", username), ("password",  password), ("submit", "submit")])
url = urlsplit(IMDBLOGIN)
try:
    conn = httplib.HTTPSConnection(url.netloc)
    request = url.path + "?" + url.query + "&" + urlencode(form)
    conn.putrequest("POST", request)
    conn.putheader("Content-Type", "application/x-www-form-urlencoded")
    conn.endheaders()
    loggedin = conn.getresponse()
    logger.debug("Log in first %s %s %s", loggedin.status, loggedin.reason, loggedin.getheaders())
except:
    logger.exception("Can't log in via HTTPS")
finally:
    conn.close()                

问题是我不确定如何处理提交输入。我现在得到的结果是400(不良请求)。

此外,我不知道我是否在正确的轨道上。欢迎任何考虑!

2 个答案:

答案 0 :(得分:1)

您最好的选择可能是使用检查员(如Chrome的“F12”开发人员工具)来查看IMDB发送给自己的请求,以响应用户填写登录表单。当我这样做时,我注意到了与你拥有的相似的表单值,尽管还有一些cookie和其他信息,IMDB可能依赖这些信息来完成身份验证。当然,这是一种众所周知的脆弱代码。

如果这仅供您个人使用,您还可以考虑从浏览器登录IMDB,然后查找在浏览器会话中设置的Cookie并在您的请求中使用它们。这是IMDbPY使用的技术,您可以考虑使用它。

答案 1 :(得分:0)

事实证明,实际上并不困难。为了方便起见,我已经从httplib切换到urllib2。

IMDBLOGIN = "https://secure.imdb.com/register/login?ref_=nv_usr_lgin_3"
form = OrderedDict([("49e6c", "3478"), ("login", self.username), ("password",  self.password)])
cj = CookieJar()
opener = build_opener(HTTPHandler(), HTTPSHandler(), HTTPErrorProcessor(), 
                     HTTPRedirectHandler(), HTTPCookieProcessor(cj))
params = urlencode(form)
response = opener.open(IMDBLOGIN, params)

# cookies automatically sent
response2 = opener.open(csv_url)
content = response2.read()

基本上,我不需要添加提交输入,到目前为止我还没能弄清楚第一个输入有什么用途,因为我似乎能够填写任何值。 (虽然未经过广泛测试)

登录后,我确保为下一个请求保留cookie,然后检索文件。