応答ステータスがリダイレクトを意味する 301 または 302 の場合は常に、リダイレクトされた URL を「location」パラメーターで取得します。次に、その URL を使用して、再度リクエストを行う必要があります。この URL はユーザーがログインしていることを前提としているため、すべての Cookie も渡す必要があることに注意してください。
あなたが本質的に行っていることは、この Web サイトをスクレイピングしてデータを取得することです。次のことを実行する必要があります。
- ブラウザで従うのと同じ手順を実行します。ウェブページを開く、フォームを投稿する、リンクをクリックするなど。
- ブラウザーで開発ツール (例: Firefox ブラウザーの場合は firebug) を使用し、コードを介して毎回同じ要求を複製します。
- Web ページの応答に含まれるすべての Cookie は、ブラウザーによって自動的に保存され、次の要求と共に送信されます。したがって、ここでも同じことを行う必要があります。応答を受け取るたびに、Cookie を変数に保存し、次の要求の要求ヘッダーと共に送信します。
- リダイレクト応答がある場合は、リダイレクトされた 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: 特定のコードを一般的なものに変更したため、エラーがないか確認してください。