Как залогиниться на сайте при помощи python requests?
День добрый
Есть задача спарсить сайт https://www.strava.com, для парсинга используем Python.
Парсить надо внутренние пользовательские данные сайта. Для этого надо залогинеца, а с этим проблема. Что бы мы не пробовали пока результат отрицательный. Нужна помощь специалиста в этом вопросе.
Заранее спасибо
from bs4 import BeautifulSoup import requests from fake_useragent import UserAgent from time import sleep def authorize(): headers = < 'User-Agent': UserAgent().chrome, ># utf8: ✓ # 'utf8': '✓', login_data = < 'utf8': '✓', 'plan': '', 'email': 'mail@ru', 'password': 'pass', >with requests.Session() as s: s.get('https://www.strava.com') s.verify = False url = 'https://www.strava.com/login/' r = s.get(url) soup = BeautifulSoup(r.text, 'html5lib') login_data['authenticity_token'] = str(soup.find('input', attrs=)['value']) headers['X-CSRF-Token'] = soup.select_one('meta[name="csrf-token"]')['content'] headers['cookie'] = '; '.join([x.name + '=' + x.value for x in s.cookies]) sleep(1) r2 = s.post(url, data=login_data, headers=headers) r3 = s.get('https://www.strava.com/clubs/225082/members') sleep(1) print(r3.text) def main(): authorize() if __name__ == '__main__': main()
- Вопрос задан более трёх лет назад
- 3477 просмотров
Комментировать
Решения вопроса 1

Сергей Карбивничий @hottabxp Куратор тега Python
Сначала мы жили бедно, а потом нас обокрали..
Да тут делов на 2минуты:
import requests from bs4 import BeautifulSoup import time headers = data = url = 'https://www.strava.com/session' session = requests.Session() # Сессия def get_token():# Метод, для получения токена response = session.post(url,headers=headers) soup = BeautifulSoup(response.text,"html.parser") token = soup.find('input',).get('value') return token # Возвращает токен def auth(): # Метод, для авторизации response = session.post(url,headers=headers,data=data) return response.text data['authenticity_token'] = get_token() # Вызывает метод для получения токена, и результат заносим в словарь time.sleep(2) # Пауза 2 сек :) html = auth() # Авторизируемся. В html будет наш ответ после авторизации if 'Log Out' in html: # Если строка 'Log Out' есть в html, значит авторизация прошла успешно print('Login OK!') else: print('Login Error!')
Если что не понятно, пишите.
Ответ написан более трёх лет назад
Нравится 4 1 комментарий
Павел Иванов @Ivanov_pv Автор вопроса
Спасибо большое за помощь, все работает
Ответы на вопрос 1

Назар Тропанец @nazartropanets
изучаю deep learning и ML(Python)
Попробуйте промониторить через Network вход в аккаунт(нажимаете f12 и выбираете Network), логинитесь и отсылаете форму. Во вкладке Network должны были отослатся данные входа на сервер, посмотрите что передается, вероятнее всего вместе с паролем и именем передается какой-то токен, и из-за этого не получается выполнить авторизацию. Для авторизации нужно передавать все данные которые должны передаватся, а не только юзернейм и пароль.
Ответ написан более трёх лет назад
Павел Иванов @Ivanov_pv Автор вопроса
Да токен тоже предается в коде он он добавляется тут
. login_data['authenticity_token'] = str(soup.find('input', attrs=)['value']) .
Промониторить через Network в гуглхроме, вот вся выдача что была с post запросом
В коде формируется первые шесть строчек с реализацией токена, а что еще добавлять?
Подскажите если не сложно?
utf8: ✓ authenticity_token: YW0S8lRJ/EqPqkS/wTUj5qCRExIgpzIn9Ryd/A3xuJQQVSKaoozomMDW2LDnDkdrD0UShE8S3FGKWv8199ws3w== plan: email: mail@.ru password: pass event: pageview metadata: initial_referrer: https://www.strava.com/login is_iframe: false user_language: ru open_app: false has_app_websdk: false feature: journeys callback_string: branch_view_callback__1 data: source: web-sdk branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm session_id: 792280983689258684 identity_id: 791901031512693012 sdk: web2.53.1 browser_fingerprint_id: 707829489312081104 event: web-login metadata: initial_referrer: https://www.strava.com/login browser_fingerprint_id: 707829489312081104 identity_id: 791901031512693012 sdk: web2.53.1 session_id: 792353521164926825 branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm identity_id: 792353521173559587 identity: 58983723 browser_fingerprint_id: 707829489312081104 sdk: web2.53.1 session_id: 792353521164926825 branch_key: key_live_lmpPsfj2DP8CflI4rmzfiemerte7sgwm

Назар Тропанец @nazartropanets
Павел Иванов, да, вы передаете все параметры, но я не могу понять в чем проблема
Попробуйте выввести все параметры, которые вы передаете, и проверьте в чем может быть проблема
Возможно в plan нужно передовать — » «, вместо — «»
Как авторизоваться на сайте с помощью python requests?
Я наверное упускаю что-то фундаментальное. Я уже пробовал на разных сайтах — результат один и тот же — код страницы без авторизации.
Хочу авторизоваться, получить куки и работать с сайтом передавая куки.
- Вопрос задан более трёх лет назад
- 59454 просмотра
Комментировать
Решения вопроса 2

Lorem Ipsum @nobodynoone
requests.auth это компонент, который используется для авторизации по методу `Basic\Digital access authentication`, если у вас на сайте форма с авторизацией, то надо отправлять форму. Короче, учите матчасть.
session = requests.Session() session.post('http://example.com/auth/login', < 'username': 'admin', 'password': 'password', 'remember': 1, >)
Python requests. Авторизация на сайте
Иногда при парсинге страниц нужно получить данные , которые недоступны незарегистрированным пользователям. Для этого нужно авторизоваться на сайте. И в этой статье я покажу как с помощью замечательной библиотеки requests это реализовать.
В качестве примера попробуем залогиниться на сайте hh.ru.

Как видим нам нужно ввести Email или Телефонный номер в качестве ЛОГИНА и ПАРОЛЬ и нажать кнопку Войти в личный кабинет.
Установка библиотеки Requests
pip install requests
Указываем User-Agent
Казалось бы , нам нужно просто реализовать метод post этой библиотеки , передав все необходимые данные. Но не так просто , так как нам нужно указать правильный User-Agent и вытащить из кукис файлов значение _xsrf.
User-agent ? И что за значение _xsrf ? Что ты несешь , чувак? Наверно, такие вопросы у вас возникли читая предыдущие строки.Попробую объяснить о чем речь
Попытаемся просто сделать GET запрос на сайт hh.ru и посмотреть какой ответ он возвращает.

Как мы видим сервер нам возвращает ОТВЕТ 404 , который говорит , что нет такой страницы. Но если мы выполним запрос через браузер , то все нормально.
Такая ошибка происходит из-за того , что сервер думает , что мы робот , так по умолчанию User-Agent отправляемого запроса равен python-requests/2.22.0. Чтобы сервер нам возвращал нормальный ответ , нужно указать правильный User-Agent, который эмулирует действия пользователя.
import requests headers = < 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' >r = requests.get("https://hh.ru", headers=headers) print(r)
Объект Session
Теперь разберемся для чего нужен _xsrf . Когда мы логинимся на сайте hh.ru , то мы просто вводим логин и пароль и все. Но при этом при POST запросе на сервер кроме введенных нами значений передается и параметр _xsrf, который нужен для защиты от CSRF-атак. Так вот значение этого параметра сервер hh.ru генерирует автоматически и хранит его в кукис файлах в браузере и чтобы получить это значение , нам нужно использовать объект Session библиотеки requests.
Объект Session позволяет сохранять определенные параметры в запросах.Он также сохраняет файлы COOKIE во всех запросах.
Здесь я привожу полный текст скрипта с подробными комментариями, который осуществляет авторизаицю на сайте hh.ru.
import requests url = 'https://moscow.hh.ru/account/login' # Важно. По умолчанию requests отправляет вот такой # заголовок 'User-Agent': 'python-requests/2.22.0 , а это приводит к тому , что Nginx # отправляет 404 ответ. Поэтому нам нужно сообщить серверу, что запрос идет от браузера user_agent_val = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36' # Создаем сессию и указываем ему наш user-agent session = requests.Session() r = session.get(url, headers = < 'User-Agent': user_agent_val >) # Указываем referer. Иногда , если не указать , то приводит к ошибкам. session.headers.update() #Хотя , мы ранее указывали наш user-agent и запрос удачно прошел и вернул # нам нужный ответ, но user-agent изменился на тот , который был # по умолчанию. И поэтому мы обновляем его. session.headers.update() # Получаем значение _xsrf из cookies _xsrf = session.cookies.get('_xsrf', domain=".hh.ru") # Осуществляем вход с помощью метода POST с указанием необходимых данных post_request = session.post(url, < 'backUrl': 'https://moscow.hh.ru/', 'username': 'yourlogin', 'password': 'yourpassword', '_xsrf':_xsrf, 'remember':'yes', >) #Вход успешно воспроизведен и мы сохраняем страницу в html файл with open("hh_success.html","w",encoding="utf-8") as f: f.write(post_request.text)
Заключение
В этой статье реализована практическая задача , которая осуществляет авторизацию на сайте hh.ru. Эта задача прекрасна иллюстрирует то , с чем мы можем столкнуться на практике
Обновлено(1 декабря 2020 года)
Когда писалась данная статья , то капчи(CAPTCHA) не было на сайте hh.ru и авторизация происходила успешно. Для обхода капчи нужны более сложные решения. А для авторизации на страницах , где нет капчи можно использовать вышеописанный метод. Также у меня есть статья , где рассмотрена авторизация на сайте вконтакте с помощью логина и пароля , c использованием библиотеки vk_api
#1. Авторизация на сайте с Python requests
![]()
Хэй, привет, сегодня я расскажу про то, как войти или залогиниться на любом сайте с помощью python а именно с применением модуля requests. Это моё первое видео на ютубе, и думаю меня пока можно простить за некоторые ошибки в ролике) Установка requests : pip install requests Так же может понадобиться pip install lxml Исходняк программы: import requests datas = < 'email':'def', 'password':'def' >login = input(‘Enter email: ‘) passwd = input(‘Password: ‘) datas[’email’] = login datas[‘password’] = passwd url = ‘ https://vktarget.ru ‘ s = requests.Session() loging = s.post(url, data = datas) f = open(‘result.txt’,’w+’) f.write(loging.text) f.close() —————————— Крутой терминал на Windows: https://youtu.be/Nc1qfPCtsmc Спасибо за просмотр) Бот для обрезки видео: https://t.me/mp4cut_bot #requests #python #парсер #парсинг
Показать больше
Войдите , чтобы оставлять комментарии