0

私はこれについて特に進んでいるわけではありませんが、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&amp;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

申し訳ありませんが、これはかなり長くなりました。いくつかの投稿に分割する必要がある場合はお知らせください。最初は簡単な質問だと思っていたことが、別のものに変化しました。

4

2 に答える 2

0
import requests
URL = "http://www.facebook.com'
r = requests.get(URL, auth=('username','password'))
source = r.text
print source

- - -変化する - - -

import mechanize
browser = mechanize.Browser()
browser.set_handle_robots(False)
cookies = mechanize.CookieJar()
browser.set_cookiejar(cookies)
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7')]
browser.set_handle_refresh(False)

url = 'http://www.facebook.com/login.php'
self.browser.open(url)
self.browser.select_form(nr = 0)       #This is login-password form -> nr = number = 0
self.browser.form['email'] = YourLogin
self.browser.form['pass'] = YourPassw
response = self.browser.submit()
print response.read()

リンク

于 2015-12-16T11:40:25.967 に答える
0

勝利!

わかりました。Prashant と barny の応答に感謝し、Martijn Pieters の投稿 ( Sending an ASP.net POST with Python's Requests ) に大いに感謝します。

私の救いは ロボボットであることがわかりました。

コードは次のとおりです。

from robobrowser import RoboBrowser

the_url = 'the_url'
login = the_url + '/login'
content = the_url + '/content'
username = 'username'
password = 'password'

browser = RoboBrowser(parser='lxml')

browser.open(login)
form = browser.get_forms()  

# You can use '.get_form()' for a specific form but I'm finding it easier to 
# using '.get_forms()' to get all the forms and then I'm just interested 
# in the first one:

form = form[0]
print form     # this will give you the information you need to 
               # now enter your password details:   

form['the_user'].value = username
form['the_pass'].value = password

browser.submit_form(form)

# and then because I'm after the html of certain content pages:

browser.open(content)
source = str(browser.parsed)
return source
于 2015-12-18T20:15:06.540 に答える