如何使用urllib登录网站



我正在尝试登录这个网站:http://www.broadinstitute.org/cmap/index.jsp。我在Windows上使用python 3.3。我遵循这个答案https://stackoverflow.com/a/2910487/651779。我的代码:

import http.cookiejar
import urllib
url = 'http://www.broadinstitute.org/cmap/index.jsp'
values = {'j_username' : 'username',
          'j_password' : 'password'}
data = urllib.parse.urlencode(values)
binary_data = data.encode('ascii')
cookies = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(
    urllib.request.HTTPRedirectHandler(),
    urllib.request.HTTPHandler(debuglevel=0),
    urllib.request.HTTPSHandler(debuglevel=0),
    urllib.request.HTTPCookieProcessor(cookies))
response = opener.open(url, binary_data)
the_page = response.read()
http_headers = response.info()

它运行没有错误,但是在the_page的html只是登录页面。我怎样才能登入这个网页?

由于HTTP请求是无状态的,因此站点正在使用JSESSIONID cookie来创建会话。当你发出请求时,你没有首先获得会话id。

我嗅探了一个会话,使用Fiddler登录到该站点,发现POST是对不同的URL进行的,但它具有JSESSIONID cookie集。所以你需要先get到URL,使用cookie处理程序捕获cookie,然后POST到这个URL:

post_url = 'http://www.broadinstitute.org/cmap/j_security_check'

您根本不需要保存HTTP GET请求,您可以简单地调用open .open(url),然后在代码中将响应行更改为:

response = opener.open(post_url, binary_data)

负载也缺少提交方法。以下是我建议修改的全部内容:

import http.cookiejar
import urllib
get_url = 'http://www.broadinstitute.org/cmap/index.jsp'
post_url = 'http://www.broadinstitute.org/cmap/j_security_check'
values = urllib.parse.urlencode({'j_username': <MYCOOLUSERNAME>,
          'j_password': <MYCOOLPASSSWORD>,
          'submit': 'sign in'})
payload = bytes(values, 'ascii')
cj = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(
    urllib.request.HTTPRedirectHandler(),
    urllib.request.HTTPHandler(debuglevel=0),
    urllib.request.HTTPSHandler(debuglevel=0),
    urllib.request.HTTPCookieProcessor(cj))
opener.open(get_url) #First call to capture the JSESSIONID
resp = opener.open(post_url, payload)
resp_html = resp.read()
resp_headers = resp.info()

使用您创建的打开器的任何其他请求都将重用该cookie,并且您应该能够自由地浏览站点。

相关内容

  • 没有找到相关文章

最新更新