私は自由時間のプロジェクトとしてこれに取り組んでいます。
Python 3 を使用してサイトにログインし (フォームに入力して送信)、ページからいくつかのデータをスクレイピングする予定です。私が厳密に Python 3 での解決策を探している理由は、私が Python についてもっと学ぼうとしていて、すぐに Python 3 に行くと思ったからです。mechanize などの見栄えの良いツールをいくつか見てきましたが、それらは Python 2 しかサポートしていないようです。 .
これを金融投資サイトに使用することを計画していますが、例としてスターバックスを使用しましょう。
def loginToStockSite(username, pwd):
url = "https://www.starbucks.com/account/signin"
values = {"Account.UserName" : username,
"Account.PassWord" : pwd}
data = urllib.parse.urlencode(values)
data = data.encode('utf-8')
req = urllib.request.Request(url, data)
sock = urllib.request.urlopen(req)
htmlSource = sock.read().decode('utf-8')
return htmlSource
さまざまなエンコード、デコード、URL オープナーなどの例から、私は非常に混乱してきました。私はまだうまくいった解決策を見つけていません。
私の「楽しい」プロジェクトを手伝ってくれてありがとう。
アップデート
これが返されたhtmlです(質問の文字数制限に合わせて切り取られた束があります)
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title>Account Sign In | Starbucks Coffee Company</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<div class="fields">
<div class="region size1of1">
<div class="validation_summary warning validation_medium"><h2>Please Enable Cookies to Continue</h2><p>To sign in to the Starbucks web site, please enable cookies in your web browser.</p></div>
<div class="fields">
<form action="/account/signin" class="siren region size1of2" id="accountForm" method="post">
<fieldset class="login_position">
<legend class="hidden_visually">I have a Starbucks account.</legend>
<h2 class="existing_acc_h3">I have a Starbucks account.</h2>
<div id="user_info" class="region size1of2 reset">
Hi,
<span id="info_user"></span>
</div>
<div class="size1of2">
<a id="not_me" href="#notme">Not You?</a>
</div>
</div>
</div>
</div>
<div id="connect_cont" >
<div id="text_cont" class="hidden">
<h3>Have a Starbucks account?</h3>
<p>Connect your Facebook account to your Starbucks account by logging in here.</p>
</div>
</div>
</li>
<li>
<label for="Account_UserName">Username <span class="required">*</span></label>
<label for="Account_UserName" class="hidden">Starbucks Username <span class="required">*</span></label>
<input class="field_xlarge" id="Account_UserName" maxlength="200" name="Account.UserName" type="text" value="MY_USERNAME_WAS_HERE" />
</li>
<li>
<label for="Account_PassWord">Password <span class="required">*</span></label>
<label for="Account_PassWord" class="hidden">Starbucks Password <span class="required">*</span></label>
<input class="field_xlarge password" id="Account_PassWord" maxlength="200" name="Account.PassWord" type="password" value="MY_PASSWORD_WAS_HERE" />
</li>
<li>
Forgot your <a href="/account/forgot-username?AllowGuest=False">username</a> or <a href="/account/forgot-password?AllowGuest=False">password</a>?
<p class="privacy_policy hidden">
<a href="/about-us/company-information/online-policies/privacy-policy">Concerned about privacy?</a>
</p>
</li>
<li class="inline push">
<input type="checkbox" id="Account.IsRememberMe" name="Account.IsRememberMe" value="True" class="checkbox" />
<label for="Account.IsRememberMe">Keep me signed in.</label>
</li>
</ol>
</fieldset>
<fieldset>
<input id="ReturnUrl" name="ReturnUrl" type="hidden" value="" />
<input id="AllowGuest" name="AllowGuest" type="hidden" value="False" />
<input id="isJavaScriptDisabled" name="isJavaScriptDisabled" type="hidden" value="True" />
<span class="button"><button type="submit">Sign In</button></span>
</fieldset>
<fieldset class="submit">
<div id="fb_container">
<div id="fb_btn_cont">
Or log in using Facebook.
<p><a class="fb_button fb_button_medium" id="connect" href="#connect"><span class="fb_button_text">Login with Facebook</span></a></p>
</div>
</div>
</fieldset>
</form>
<div class="region size1of2 block_login">
<h2>I need a Starbucks account.</h2>
<p><span class="button"><a href="/account/create">Create An Account</a></span></p>
<p>With a Starbucks account you can register and manage your Starbucks Cards and participate in <a href="/card/rewards">My Starbucks Rewards</a>.</p>
<ul class ="basic">
<li>Enjoy a free drink on your birthday</li>
<li>Protect your balance if your Starbucks Card is missing or stolen.</li>
<li>Transfer money between cards.</li>
<li>Track your earnings in My Starbucks Rewards</li>
<li>Reload your Card balance automatically</li>
</ul>
</div>
</div>
<div class="fields">
<div class="region size1of1">
<ul id="breadcrumb">
<li><a href="/card">Card</a> .<ul>
<li><a href="/card/rewards">My Starbucks Rewards</a> .<ul>
<li>View Your Stars</li>
</ul></li>
</ul></li>
</ul>
</div>
</div>
</div>
<div id="footer">
<div class="container">
<form id="search" method="get" action="/search">
<fieldset>
<input id="searchbox" name="keywords" title="Search Keyword" maxlength="100" class="search_input" />
<span class="button button_search"><button id="submit_search_util" type="submit">Search</button></span>
</fieldset>
</form>
<div class="fields">
<div class="region size5of6 suffix1of6">
<div class="footer_categorical"><ol class="blocks blocks-five-up">
<li><h4>
<a href="/shop/card">Buy a Card</a>
</h4>
</li>
<li><h4>
<a href="/card">Manage Your Card</a>
</h4>
<ol>
<li><a href="/Card#cardBalanceWrapper">Check Balance</a></li>
<li><a href="/card/reload/one-time">Reload Your Card</a></li>
<li><a href="/card/manage/transfer">Transfer Funds</a></li>
<li><a href="/card/manage/history">View Transactions</a></li>
</ol>
</li>
<li><h4>
<a href="/card/rewards">My Starbucks Rewards</a>
</h4>
<ol>
<li><a href="/account/create/register">Register Your Card</a></li>
<li><a href="/account">View Your Stars</a></li>
<li><a href="/card/rewards/gold">Keep Your Gold Benefits</a></li>
<li><a href="/card/rewards/rewards-program-ts-and-cs">Rewards Program Terms and Conditions</a></li>
</ol>
</li>
<li><h4>
Learn More
</h4>
<ol>
<li><a href="/card/card-terms-and-conditions">Card Terms and Conditions</a></li>
<li><a href="/card/egift">What is a Starbucks Card eGift?</a></li>
<li><a href="/customer-service/faqs/card">Card FAQs</a></li>
<li><a href="/account">Manage Your Account</a></li>
<li><a href="http://mystarbucksidea.force.com/ideaList?ext=0&lsi=0&category=Starbucks+Card">My Starbucks Idea</a></li>
</ol>
</li>
ブラウザを使用してログインし、登録されているデフォルトのギフトカードが何であれ、現在の残高を含む div がある場合のようなページが返されることを期待していました。
<div class="balance-amount numbers">
それが目に見えるdivです。ページ ソースの別の場所にも残高が見つかりましたが、ページには表示されません。
<p class="card_balance numbers">
<span>$27.68</span> <span class="datestamp">3/10/2013 2:12 PM</span>
</p>
とにかく、ログイン情報を入力し、Python 3 を使用してフォームを送信するか、何らかの形でデータを投稿してログインし、(ユースケースとして、しかし質問に答えるために必要なものの範囲外で) html から口座残高を引き出します。 .
ユーザー名とパスワードが対応するフィールドにあるようで、検証の概要にあることがわかりました
<div class="validation_summary warning validation_medium"><h2>Please Enable Cookies to Continue</h2><p>To sign in to the Starbucks web site, please enable cookies in your web browser.</p></div>
Cookie を扱った例をいくつか見ました。それが問題ですか?私はその可能な解決策を研究します。それまでの間、これがお役に立てば幸いです。ありがとう。