私はこれについて特に進んでいるわけではありませんが、urrlib2、リクエスト、およびスクレイピーを使用して過去に成功したことがありますが、これには困惑しています。それで、よく検索してキーボードに頭をぶつけた後、先に進んで質問します。
サイトの HTML ソース コードを取得したいのですが、ユーザー名とパスワードを使用した後、ユーザー名とパスワードが間違っているというページが表示され続けます。それらはブラウザーで正常に動作し、ソース コードにログインすると、(ブラウザー経由で) すぐに利用できます。しかし、python/terminal を介して同じ結果を達成できないようです。以下に、私の試みのいくつかを含めます(これらの役立つページから光ったものです)。
urllib2 を使用:
req = Request(website, headers={ 'User-Agent': 'Mozilla/5.0' })
base64string = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
req.add_header("Authorization", "Basic %s" % base64string)
readweb = urlopen(req).read()
別のバージョン:
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
pagehandle = opener.open(theurl)
return pagehandle.read()
リクエストを使用した試み:
r = requests.session()
try:
r.post(theurl, data={'username' : 'username', 'password' : 'password', 'remember':'1'})
except:
print('Sorry, Unable to...')
result = r.get(theurl)
return result.text
私もスクレイピーを使用しようとしましたが、使用するライブラリに関係なく、パスワード/詳細が間違っているというページのhtmlが返されます。私が送信しているヘッダー/承認(?)に関係していると思いますが、あまり確信が持てません。助けていただければ幸いです。更新できるその他の詳細を教えてください(これで夜中起きていたので、この投稿が意味をなさない場合はご容赦ください!)
編集:
以下のPrashantの回答に対するトレースバック応答は次のとおりです(パスワードなどを除く):
Traceback (most recent call last):
ファイル "/Users/Hatsaw/newpy/pras.py"、3 行目、r = requests.get(URL, auth=('username','password')) 内 ファイル "/Library/Frameworks/Python.framework/Versions /2.7/lib/python2.7/site-packages/requests-2.9.0-py2.7.egg/requests/api.py"、67 行目、get return request('get', url, params=params, **kwargs) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests-2.9.0-py2.7.egg/requests/api.py"、53 行目、リクエストで session.request(method=method, url=url, **kwargs) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests-2.9.0 -py2.7.egg/requests/sessions.py"、468 行目、リクエスト内 resp = self.send(prep, **send_kwargs) ファイル "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests-2.9.0-py2.7.egg/requests/sessions.py"、576行目、send r = adapter.send(request, **kwargs) File" /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests-2.9.0-py2.7.egg/requests/adapters.py"、437 行目、送信時に ConnectionError( e, request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host='website', port=80): url: /dashboard/ で最大再試行回数を超えました (原因 NewConnectionError(': Failed to Establish a new connection: [Errno 8] nodename も servname も指定されていないか、不明です',))7/site-packages/requests-2.9.0-py2.7.egg/requests/adapters.py"、437 行目、送信中、ConnectionError(e、request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host=' website', port=80): URL で最大再試行回数を超えました: /dashboard/ (NewConnectionError(': 新しい接続を確立できませんでした: [Errno 8] nodename も servname も提供されていないか、または不明です',) が原因です))7/site-packages/requests-2.9.0-py2.7.egg/requests/adapters.py"、437 行目、送信中、ConnectionError(e、request=request) requests.exceptions.ConnectionError: HTTPConnectionPool(host=' website', port=80): URL で最大再試行回数を超えました: /dashboard/ (NewConnectionError(': 新しい接続を確立できませんでした: [Errno 8] nodename も servname も提供されていないか、または不明です',) が原因です))
編集:
わかりました、私は現在機械化を使用しています(以下で推奨)。これが返されたものです(これが私の根本的な問題の別のインスタンスなのか、機械化ができないのかはわかりません!):
Traceback (most recent call last):
file "/Users/Hatsaw/newpy/pras2.py", line 13, in browser.form['email'] = 'email address' File "build/bdist.macosx-10.6-intel/egg/mechanize/_form.py "、2780 行目、setitem ファイル "build/bdist.macosx-10.6-intel/egg/mechanize/_form.py"、3101 行目、find_control ファイル "build/bdist.macosx-10.6-intel/egg/mechanize/_form" .py"、3185 行目、_find_control mechanize._form.ControlNotFoundError: 名前 'email' に一致するコントロールがありません
編集:
まだこれに苦労しているので、このプロジェクトの時間がなくなる前に最後の溝の努力をして、手動ですべての html を取得する必要があります! 成功を祈っている..
わかりました、barny のアドバイスで、私はリクエストの使用に戻りました。私は、成功したブラウザー ログインから得た Cookie 情報を投稿に提供しようとしています。これを正しく行っているかどうかはわかりませんが、次のものを使用しています:
cookies = {'PHPSESSID':'5udcifi6p43ma3h1fnpfqghiu0'}
result = sess.get(the_url, cookies=cookies)
現在、内部サーバー エラーの応答が返されています。いくつかの調査の後、aspnet フォームが問題のようです。
最初にリクエストに問題がないことを確認したいだけです。それから、上記のSOリンクでMartijn Pietersが推奨するように、BeautifulSoup/robobrowserを調べてみます。
HTMLのフォームセクションが求めているものは次のとおりです。
<form name="aspnetForm" method="post" action="" id="aspnetForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATEFIELDCOUNT" id="__VIEWSTATEFIELDCOUNT" value="2" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTkwNzg1NTQ3OA9kFgJmD2QWAmYPZBYGAgetc." />
<input type="hidden" name="__VIEWSTATE1" id="__VIEWSTATE1" value="ZyBBIEhvbWUVIE5lZ290aWF0ZSBBZ3JlZW1lbnRzEiBSZetc." />
</div>
<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
<script src="/WebResource.axd?d=t2SAOwDGkbrEfkmUaMOR9sPLXqgxfeenNayRja3DNK2R8JEcH-StTTuiaqXpzp--PAISn3vzVbWQ7biREwPkibCmbAE1&t=635586505120000000" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=EL6tXtJfNfGSoQwhYtVnYEqw4oKvuwBBI4etc." type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax client-side framework failed to load.');
//]]>
</script>
<script src="/ScriptResource.axd?d=qCmNMcECQa0tfmMcZdwJeeOdcyetc." type="text/javascript"></script>
<div>
<input type="hidden" name="__VIEWSTATEGENERATOR" id="__VIEWSTATEGENERATOR" value="FC5C7135" />
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEdABB2xJRvPLCcg6GsBqRFCtw6Xg91QEu10etc." />
</div>
そう。いくつかの小さな質問。
「ユーザー/パス」という用語は、ソース コードと一致する必要がありますか?つまり、ユーザー名 = ユーザー名またはユーザーですか?: HTML でこれを見つけた場所を失ってしまいましたが、「ctl00$cphMain$tbUsername」と「ctl00$cphMain」を見つけました。 $tbPassword'…</p>
パスワードやユーザー名を base64.encodestring として送信する必要がありますか? (これが問題かどうかはわかりませんが、パスワードに !@$ などの文字が含まれています。)
ブラウザーから見つけたすべての Cookie フィールドを追加する必要がありますか?それとも PHPSESSID だけを追加する必要がありますか? クッキーにあるフィールドは次のとおりです。
ASP.NET_SessionId、CFID、CFTOKEN、__atuvc、__utma、__utmb、__utmc、__utmt、__utmz、BRO_CALLME、BRO_ID、BRO_LOGIN、BRO_MEMBER、BROAUTH、ISFULLMEMBER、phpMBLink、__CT_Data、WRUID
- Web サイト (www.website.com)、ログイン ページ (www.website.com/login)、そしてコンテンツ (www.website.com/content) があります。(ログインに成功した) ログイン ページの Cookie を使用して、それをコンテンツ ページに「送信」したと考えるのは正しいですか? これを手動で行う必要がありますか (ブラウザの Cookie 情報からフィールドの詳細を入力する)、またはコード内で行う必要がありますか (したがって、以下のコードでは cookies = r_login.cookies を使用します)?
最後に、内部サーバー エラーを返す現在使用しているコードを次に示します。
import requests
the_url = 'the_url'
login = the_url + '/login'
content = the_url + '/content'
username = 'username'
password = 'password'
sess = requests.Session()
sess.auth = ('username', 'password')
sess.get(the_url)
payload = {'ctl00$cphMain$tbUsername': username, 'ctl00$cphMain$tbPassword': password}
r_login = sess.post(login, data=payload)
cookies = {'PHPSESSID':'5udcifi6p43ma3h1fnpfqghiu0', 'ASP.NET_SessionId':'aspnet', 'BRO_LOGIN':'bro_login'}
r_data = s.get(content, cookies=cookies, data=payload)
print r_data.text
申し訳ありませんが、これはかなり長くなりました。いくつかの投稿に分割する必要がある場合はお知らせください。最初は簡単な質問だと思っていたことが、別のものに変化しました。