POST запросы - Python

Узнай цену своей работы

Формулировка задачи:

Всем привет, не могу понять нюанс работы с POST запросами. Например, я хочу авторизоваться на Хабре при помощи POST запроса (возьмем библиотеку Grab для примера, хотя можно и requests). При POST запросе, как я понимаю, используются словари для передачи данных (в формате ключ:значение). В "значение", выходит, надо писать, что я хочу передать (в случае авторизации на Хабре - пароль и логин для авторизации), а вот в "ключ" надо передать данные, какому элементу я их адресую (формам для ввода логина и пароля). Так вот вопрос - как правильно указывать элемент, куда я хочу передать данные? По атрибуту name, id, class, XPath или как? P. S. Поправьте, если я где-то глупость написал, только разбираюсь)

Решение задачи: «POST запросы»

textual
Листинг программы
  1. import lxml.html
  2. import requests
  3.  
  4. login = 'login'
  5. password = 'password'
  6. url = 'http://www.cyberforum.ru/'
  7.  
  8. headers = {
  9.     'User-Agent':'Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1',
  10.     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  11.     'Accept-Language':'ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3',
  12.     'Accept-Encoding':'gzip, deflate',
  13.     'Connection':'keep-alive',
  14.     'DNT':'1'
  15. }
  16. session = requests.Session()
  17.  
  18. # способ №1 - используем поля форм
  19. def auth_1():
  20.     # отправляем первичный запрос главной страницы
  21.     data = session.get(url, headers=headers).content
  22.     page = lxml.html.fromstring(data) #  получаем разобранное дерево элементов
  23.     form = page.forms[0]  # берем самую первую форму - то, что брать нужно именно ее - нужно убеждаться эмпирическим путем, заглянув в исходный код страницы, так как нужная форма может и не быть первой
  24.     form.fields['vb_login_username'] = login      # имена полей узнаем из исходного кода страницы
  25.     form.fields['vb_login_password'] = password
  26.  
  27.     r = session.post("{}{}".format(url,form.action), data=form.form_values())
  28.     return r
  29.  
  30. # способ № 2 - тратить время на отправку первичного запроса, чтобы получить экземпляр формы не будем
  31. # мы просто 'подсмотрим', что отправляет браузер и сделаем точно также
  32.  
  33. def auth_2():
  34.     # а браузер отправляет post запросом именно это
  35.     # как мы это узнали? это отдельный вопрос - так как вариантов масса, от встроенных средств разработчика в самих браузерах, до инструментов типа HTTP Analyzer
  36.     data = {
  37.     'vb_login_username':login,
  38.     'vb_login_password':password,
  39.     'securitytoken':'guest',            
  40.     'do': 'login'
  41.     }
  42.    
  43.     r = session.post('{}{}'.format(url,'/login.php?do=login'), data=data)
  44.     return r
  45.  
  46.    
  47. #r = auth_1()
  48. r = auth_2()
  49.  
  50. # смотрим, что нам прислали в "печеньках"
  51. print(r.status_code)
  52. for k,v in r.cookies.items():
  53.     print(k,v,sep="=")
  54.  
  55. # а так мы проверяем, что залогинились    
  56. # откуда мы узнали, что проверять нужно на строчку vbseo_loggedin в куках?
  57. # правильно. оттуда же, откуда и все и остальное
  58.  
  59. if 'vbseo_loggedin' in r.cookies and r.cookies['vbseo_loggedin']=='yes':
  60.     print('Мы вошли')    
  61. else:
  62.     print('Печалька')

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.467 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут