0

我一直在尝试制作一个脚本,这将使我能够从我们的在线内部网页获取我的成绩。

我要从中检索数据的页面是https://sb.stads.ku.dk/SB_PSTA/sb/resultater/studresultater.jsp

我曾尝试在 Python 中执行此操作。但是每当我登录时,我都不知道如何在脚本中访问此页面。仅仅访问页面是不够的。好像登录后我被重定向了。

这是我到目前为止所拥有的。

import urllib2

theurl = 'https://intranet.ku.dk/Selvbetjening/Sider/default.aspx'
username = 'MYUSERNAME'
password = 'MYPASSWORD'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)

authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)

pagehandle = urllib2.urlopen(theurl)

for elm in pagehandle: 
    print elm

谢谢!

4

1 回答 1

0

每当响应状态为 301 或 302 时,这意味着重定向,我们将在 'location' 参数中获取重定向的 url。然后使用该网址,您需要再次发出请求。请记住,此 url 将期望用户登录,因此您还需要传递所有 cookie。

您实际上所做的是抓取该网站以从中检索数据。您需要采取以下措施:

  1. 在浏览器中执行您要执行的相同步骤。比如打开网页、发布表格和点击链接等。
  2. 使用浏览器上的开发工具(例如 Firefox 浏览器的 firebug)并通过代码每次复制相同的请求。
  3. 网页响应中的任何 cookie 都会由浏览器自动保存,并与下一个请求一起发送。因此,我们需要在这里做同样的事情。每次我们收到响应时,将 cookie 保存在一个变量中,并将其与下一个请求的请求标头一起发送。
  4. 如果有任何重定向响应,则向重定向的 url 发出另一个请求。基本上做与浏览器相同的事情。

这是使用 httplib 的代码片段。

class scraper():
    def somefunc(self):
        self.host = "intranet.ku.dk"
        self.url = "https://intranet.ku.dk/Selvbetjening/Sider/default.aspx"
        self.data = urllib.urlencode(postDataDict)
        self.headers = {   #You can fill these values by looking into what the browser sends.
            'Accept': 'text/html; */*',
            'Accept-Language': '',
            'Accept-Encoding': 'identity',
            'Connection': 'keep-alive',
            'Content-Type': 'application/x-www-form-urlencoded'}
        response = makeRequest(host,url,data)
        if (response.status == 302):
            url = '/'+response.getheader("Location").split('/')[3]
            response = makeRequest(host,url,{})

    def makeRequest(self,host,url,data):
        cookies = ''
        for key in self.cookies:
            cookies = cookies + key + '=' + self.cookies[key] + '; '
        self.headers['Cookie'] = cookies
        conn = httplib.HTTPSConnection(host)
        conn.request("POST", url, data, self.headers)
        response = conn.getresponse()
        self.saveCookies(response.getheader("Set-Cookie"))
        responseVal = response.read()
        conn.close()
        self.headers['Referer'] = fullUrl #setting header for next request
        return response

    def saveCookies(self,cookies):
        if cookies is not None:
            values = cookies.split()
            for value in values:
                parts = value.split('=')
                if(len(parts) > 1):
                    if((parts[0] != 'expires') and (parts[0] != 'Max-Age') and (parts[0] != 'Path') and (parts[0] != 'path') and (parts[0] != 'Domain')):
                        self.cookies[parts[0]] = parts[1].rstrip(';')

PS:我已经修改了我的特定代码以使其通用,因此请检查是否有任何错误。

于 2013-06-28T09:46:20.943 回答