TransWikia.com

Как парсить закрытые страницы после авторизации Python

Stack Overflow на русском Asked by oneren37 on November 10, 2021

Пытаюсь спарсить контент доступный только авторизованному пользователю. реализовать авторизацию у меня получилось. Post запрос возвращает страничку "вы успешно авторизовались бла бла … " и в session.cookies появляются кукисы. Я так понимаю, что эти куки нужны чтобы сервер понимал, что мы авторизовались. так вот вопрос заключается в том как эти куки передавать серверу при дальнейших запросах? потому что когда я пытаюсь получить страницу session.get(some_url, cookies = session.cookies) возвращается страница авторизации

import requests
from bs4 import BeautifulSoup as bs

session = requests.Session()

#get CSRF

r = session.get('https://cas.spbstu.ru/login?service=https%3A%2F%2Fcas.spbstu.ru%2Foauth2.0%2FcallbackAuthorize%3Fclient_id%3D5cae4f19-00ac-4910-b731-8e44065ad93d%26redirect_uri%3Dhttps%253A%252F%252Fdl.spbstu.ru%252Fauth%252Fspbstu%252Fredirect.php%253Fauth_service%253Dspbstu_oauth2%26response_type%3Dcode%26client_name%3DCasOAuthClient')
page = bs(r.content, 'html.parser')
csrf = page.select('input[name="execution"]')[0]['value']

#login

url = 'https://cas.spbstu.ru/login?service=https%3A%2F%2Fcas.spbstu.ru%2Foauth2.0%2FcallbackAuthorize%3Fclient_id%3D5cae4f19-00ac-4910-b731-8e44065ad93d%26redirect_uri%3Dhttps%253A%252F%252Fdl.spbstu.ru%252Fauth%252Fspbstu%252Fredirect.php%253Fauth_service%253Dspbstu_oauth2%26response_type%3Dcode%26client_name%3DCasOAuthClient'

params = {
    'username'   :'*******',
    'password'   :'*******',
    'execution'  : csrf,
    '_eventId'   :'submit',
    'geolocation':''
}
headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)  Safari/537.36',
    'Referer': 'https://dl.spbstu.ru/my/',
    'Connection': 'keep-alive',
}

answer = session.post(url, data = params, headers = headers)
answ_bs = bs(answer.content, 'html.parser')
# print(answ_bs)

content_page = session.get('https://dl.spbstu.ru/my/')
content = bs(content_page.content, 'html.parser')
print(content)
print(session.cookies)

One Answer

Если попытаться залогинится введя рандомные логин и пароль, можно заметить что серверу отправляется введите сюда описание изображения

username: Alex12345
password: 321312312
execution: 49848f0b-e9d5-481c-aa86-b0cb09e170b3_ZXlKaGJHY2lPaUpJVXpVeE1pSjkuaDlqNklyRmN0NUxiOVk4ejNFSkw1MEw3akp2ak9tVUlhbjV1ZE5XbFVKVVNiYVhoV<...>zBuQ1JLU0hB
_eventId: submit
geolocation: 

Принцип генерации первых и последних двух понятен, а вот третий вызывает вопросы. Первичный осмотр загружаемы JS (в разделе Sources) не привел к этому пониманию. К сожалению я не могу провести полный реверс инжиниринг, т.к. не знаю логин пароль (на сайте не предусмотрена регистрация), однако я бы мог посоветовать вам использовать Selenium + Firefox web driver:

Запусукаем браузер и получаем доступ к старнице. Желательно все урлы поместить в отдельный фалйл config а конфиденциальные данные (лог пароль) в переменные среды.

import config

from selenium import webdriver
driver = webdriver.Firefox()
driver.get("config.URL")

Дале находим поля ввода лог и пароля:

fields = find_elements_by_class_name("form_input")
login_area = field[0]
pass_area = fields[1]

Далле пишем в них текст при помощи методов

.switchTo().activeElement().sendKeys("some text data _ 123 !@#%^&*()_+");

Первый переключит виртуальный "КУРСОР" на это поле второй сделает его активным а 3-ий введёт текст

Далее находим кнопку (!!! Она становится активна только поссле заполнения верхних полей, попытка сделать этот блок кода раньше приведет к ошибке, хотя из архитектурных соображений лучше его поместить к login и pass area!!!)

button_login = find_element_by_id("btn btn-rounded submit")
button_login.click()

P.S. Для использования селениума вам так же потребуется скачать webdriver.Firefox или webdriver.Chrome

Answered by BlueScreen on November 10, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP