私はまだ python を学んでいます。これは、Web サイトにアクセスして自分で特定の情報をスクレイピングする最初の試みです。私はその言語に頭を悩ませようとしています。したがって、任意の入力を歓迎します。
以下のデータは、ページのソースから見たものです。ログイン情報を入力するには、特定のページにアクセスする必要があります。エントリー成功後。パスワードを入力するために別のページにリダイレクトされます。Pythonリクエストを介して投稿しようとしています。3 ページ目の情報を廃棄する前に、2 ページを通過する必要があります。ただし、ログインの最初のページしか通過できません。
これは、USERNAME に対して呼び出されているヘッダーと POST 情報です。
ユーザー名ページの場合:
(Request-Line)
POST /client/factor2UserId.recip;jsessionid=15AD9CDEB48362372EFFC268C146BBFC HTTP/1.1
Host www.card.com
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-US,en;q=0.5
Accept-Encoding gzip, deflate
DNT 1
Referer https://www.card.com/client/
Cookie JSESSIONID=15AD9CDEB48362372EFFC268C146BBFC
Connection keep-alive
Content-Type application/x-www-form-urlencoded
Content-Length 13
Post Data:
login, USERLOGIN
パスワードのために呼び出されているヘッダーと投稿情報は次のとおりです。
For the PASSWORD PAGE:
(Request-Line)
POST /client/siteLogonClient.recip HTTP/1.1
Host www.card.com
User-Agent Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-US,en;q=0.5
Accept-Encoding gzip, deflate
DNT 1
Referer https://www.card.com/client/factor2UserId.recip;jsessionid=15AD9CDEB48362372EFFC268C146BBFC
Cookie JSESSIONID=15AD9CDEB48362372EFFC268C146BBFC
Connection keep-alive
Content-Type application/x-www-form-urlencoded
Content-Length 133
Post Data:
org.apache.struts.taglib.html.TOKEN, 583ed0aefe4b04b
login, USERLOGIN
password, PASSWORD
これは私が思いついたものですが、最初のページにしかアクセスできません。関数 second_pass() を呼び出すと、最初のページにリダイレクトされます。
関数 first_pass() を使用すると、応答コード 200 を受け取ります。ただし、second_pass() で同じコードを受け取りますが、ページのテキストを出力すると、ページ 1 にリダイレクトされます。3ページにたどり着くことはありません。
import requests
import re
response = None
r = None
payload = {'login' : 'USERLOGIN'}
# acesses the username screen and adds username
# give login name
def first_pass():
global response
global payload
url = 'https://www.card.com/client/factor2UserId.recip'
s = requests.Session()
response = s.post(url, payload)
return response.status_code
# merges payload with x that contains user password
def second_pass():
global payload
global r
# global response
x = {'password' : 'PASSWORD'} # I add the Password in this function cause I am not sure if it will fail the first_pass()
payload.update(x)
url = 'https://www.card.com/client/siteLogonClient.recip'
r = requests.post(url, payload)
return payload
return r.status_code
# searches response for Token!
# if token found merges key:value into payload
def token_search():
global response
global payload
f = response.text
# uses regex to find the Token from the HTML
patFinder2 = re.compile(r"name=\"(org.apache.struts.taglib.html.TOKEN)\"\s+value=\"(.+)\"",re.I)
findPat2 = re.search(patFinder2, f)
# if the Token in found it turns it into a dictionary. and prints the dictionary
# if no Token is found it prints "nothing found"
if(findPat2):
newdict = dict(zip(findPat2.group(1).split(), findPat2.group(2).split()))
payload.update(newdict)
print payload
else:
print "No Token Found"
私は今、シェルから自分の関数を呼び出しています。この順番で呼んでいます。first_pass()、token_search()、second_pass()。
token_search() を呼び出すと、Unicode で辞書が更新されます。それが私のエラーの原因であるかどうかはわかりません。
コードに関するアドバイスは大歓迎です。私は学ぶことを楽しんでいます。しかし、この時点で私は頭を壁にぶつけています。