python, аутентификация не распознана - urllib2, запросы, asp.net
Хотя я не особенно продвинут в этом, у меня был некоторый прошлый успех в использовании urrlib2, запросов и scrap, но это поставило меня в тупик. Поэтому, после долгих поисков и ударов головой о клавиатуру, я просто продолжу и буду спрашивать.
Я хотел бы получить 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
Я также пытался использовать scrapy, но независимо от того, какую библиотеку я использую, она возвращается с html-страницей, где говорится, что мой пароль / данные неверны. Я предполагаю, что это как-то связано с заголовками / авторизацией (?), Которые я отправляю, но я не слишком уверен. Буду признателен за любую помощь, пожалуйста, дайте мне знать, какие еще подробности я могу обновить (я проснулся с этим всю ночь, поэтому, если этот пост не имеет смысла, пожалуйста, прости меня!)
РЕДАКТИРОВАТЬ:
Вот ответ трассировки на ответ Прашанта ниже (без паролей и т. Д.):
Traceback (most recent call last):
Файл "/Users/Hatsaw/newpy/pras.py", строка 3, в r = запросы.get(URL, auth=('имя пользователя', 'пароль')) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests-2.9.0-py2.7.egg/requests/api.py", строка 67, в запросе на получение возврата ('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 / reports/sessions.py", строка 468, в запросе resp = self.send(prep, **send_kwargs) File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/ запросы-2.9.0-py2.7.egg / запросы / sessions.py ", строка 576, в файле send r = adapter.send(request, **kwargs)" / Library / Frameworks / Python.framework / Версии / 2.7 / Lib / python2.7 / сайт-пакеты / запросы-2.9.0-py2.7.egg / запросы / адаптер s.py ", строка 437, при отправке поднять ConnectionError(e, request=request) request.exceptions.ConnectionError: HTTPConnectionPool(host='website', port=80): максимальное число повторов превышено с помощью url: /dashboard/ (вызвано NewConnectionError(': не удалось установить новое соединение: [Errno 8] имя узла или имя сервера указаны или неизвестны',))
РЕДАКТИРОВАТЬ:
Хорошо, теперь я использую Mechanize (рекомендуется ниже), и вот что я получаю (не уверен, является ли это еще одним случаем моей корневой проблемы или моей неспособности с Mechanize!):
Traceback (most recent call last):
Файл "/Users/Hatsaw/newpy/pras2.py", строка 13, в browser.form['email'] = 'адрес электронной почты' Файл "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, кажется, проблема:
- Отправка ASP.net POST с запросами Python
- Использование запросов Python для проверки подлинности ASP.NET
Я просто хочу убедиться, что сначала я не делаю что-то не так с запросами, а затем, возможно, я исследую BeautifulSoup/robobrowser, как рекомендовано Martijn Pieters в ссылке SO выше.
Вот что спрашивает секция формы 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>
Так. Несколько небольших вопросов.
Должна ли моя терминология 'user / pass' соответствовать исходному коду, т.е. username = username или user?: Я потерял, где я нашел это в html сейчас, но я нашел 'ctl00$cphMain$tbUsername' и 'ctl00$cphMain$tbPassword'...
Нужно ли отправлять пароль и / или имя пользователя в виде base64.encodestring? (Я не знаю, если это проблема, но пароль содержит символы, такие как!@$ И т. Д.)
Нужно ли добавлять ВСЕ поля cookie, которые я нашел в браузере, или просто PHPSESSID? Вот поля, которые я получил в куки:
ASP.NET_SessionId, CFID, CFTOKEN, __atuvc, __utma, __utmb, __utmc, __utmt, __utmz, BRO_CALLME, BRO_ID, BRO_LOGIN, BRO_MEMBER, BROAUTH, ISFULLMEMID, WTB, PHBM
- Существует веб-сайт (www.website.com), страница входа (www.website.com/login), а затем контент (www.website.com/content). Правильно ли я считаю, что использую 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
Извинения, это стало довольно длинным сейчас, если мне нужно разделить его на несколько постов, пожалуйста, дайте мне знать - то, что я предполагал, что вначале был простой вопрос, превратилось во что-то еще!
2 ответа
Победа!
Хорошо, с благодарностью Прашанту и Барни за их ответы, а также большое спасибо Мартину Питерсу через это сообщение: Отправка POST ASP.net с запросами Python
Я нашел свое спасение в робоботе.
Вот код:
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
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()