0

私はまだ 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 で辞書が更新されます。それが私のエラーの原因であるかどうかはわかりません。

コードに関するアドバイスは大歓迎です。私は学ぶことを楽しんでいます。しかし、この時点で私は頭を壁にぶつけています。

4

1 に答える 1