POST запросы - Python
Формулировка задачи:
Всем привет, не могу понять нюанс работы с POST запросами. Например, я хочу авторизоваться на Хабре при помощи POST запроса (возьмем библиотеку Grab для примера, хотя можно и requests). При POST запросе, как я понимаю, используются словари для передачи данных (в формате ключ:значение). В "значение", выходит, надо писать, что я хочу передать (в случае авторизации на Хабре - пароль и логин для авторизации), а вот в "ключ" надо передать данные, какому элементу я их адресую (формам для ввода логина и пароля). Так вот вопрос - как правильно указывать элемент, куда я хочу передать данные? По атрибуту name, id, class, XPath или как?
P. S. Поправьте, если я где-то глупость написал, только разбираюсь)
Решение задачи: «POST запросы»
textual
Листинг программы
- import lxml.html
- import requests
- login = 'login'
- password = 'password'
- url = 'http://www.cyberforum.ru/'
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'Accept-Language':'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
- 'Accept-Encoding':'gzip, deflate',
- 'Connection':'keep-alive',
- 'DNT':'1'
- }
- session = requests.Session()
- # способ №1 - используем поля форм
- def auth_1():
- # отправляем первичный запрос главной страницы
- data = session.get(url, headers=headers).content
- page = lxml.html.fromstring(data) # получаем разобранное дерево элементов
- form = page.forms[0] # берем самую первую форму - то, что брать нужно именно ее - нужно убеждаться эмпирическим путем, заглянув в исходный код страницы, так как нужная форма может и не быть первой
- form.fields['vb_login_username'] = login # имена полей узнаем из исходного кода страницы
- form.fields['vb_login_password'] = password
- r = session.post("{}{}".format(url,form.action), data=form.form_values())
- return r
- # способ № 2 - тратить время на отправку первичного запроса, чтобы получить экземпляр формы не будем
- # мы просто 'подсмотрим', что отправляет браузер и сделаем точно также
- def auth_2():
- # а браузер отправляет post запросом именно это
- # как мы это узнали? это отдельный вопрос - так как вариантов масса, от встроенных средств разработчика в самих браузерах, до инструментов типа HTTP Analyzer
- data = {
- 'vb_login_username':login,
- 'vb_login_password':password,
- 'securitytoken':'guest',
- 'do': 'login'
- }
- r = session.post('{}{}'.format(url,'/login.php?do=login'), data=data)
- return r
- #r = auth_1()
- r = auth_2()
- # смотрим, что нам прислали в "печеньках"
- print(r.status_code)
- for k,v in r.cookies.items():
- print(k,v,sep="=")
- # а так мы проверяем, что залогинились
- # откуда мы узнали, что проверять нужно на строчку vbseo_loggedin в куках?
- # правильно. оттуда же, откуда и все и остальное
- if 'vbseo_loggedin' in r.cookies and r.cookies['vbseo_loggedin']=='yes':
- print('Мы вошли')
- else:
- print('Печалька')
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д