0

オンラインの内部 Web ページから自分の成績を取得できるスクリプトを作成しようとしています。

データを取得したいページは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 の場合は常に、リダイレクトされた URL を「location」パラメーターで取得します。次に、その URL を使用して、再度リクエストを行う必要があります。この URL はユーザーがログインしていることを前提としているため、すべての Cookie も渡す必要があることに注意してください。

あなたが本質的に行っていることは、この Web サイトをスクレイピングしてデータを取得することです。次のことを実行する必要があります。

  1. ブラウザで従うのと同じ手順を実行します。ウェブページを開く、フォームを投稿する、リンクをクリックするなど。
  2. ブラウザーで開発ツール (例: Firefox ブラウザーの場合は firebug) を使用し、コードを介して毎回同じ要求を複製します。
  3. Web ページの応答に含まれるすべての 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 に答える