@Romeo558
Продолжающий программист на python.

Почему не получается авторизироваться через requests?

Я пишу парсер домашнего задания для моего финального проекта. По задумке - он должен просто логиниться на сайте, в той же сессии переходить на страницу с заданием и наконец парсить дз. Казалось бы нет нчиего проще, но ничего и нигде не получается.

Вот что я пробовал:
import requests
from bs4 import BeautifulSoup

# Define the login URL and the user credentials
login_url = "https://edu.tatar.ru/login"
login_payload = {
    "main_login2": "",
    "main_password2": ""
}

# Define the diary URL with a specific date
diary_url = "https://edu.tatar.ru/user/diary/week"

# Create a new session and log in using the user credentials
session = requests.Session()
session.post(login_url, data=login_payload)


# Send a GET request to the diary URL and parse the response using BeautifulSoup
response = session.get(diary_url)
soup = BeautifulSoup(response.content, "lxml")

print(soup)


Все заголовки и данные от аккаунта верны, но в конце программы я получаю просто html-страницу для логина.

У меня получилось это сделать с помощью Selenium, но время выполнения отбило у меня всё желание. (14 секунд!!!)

from selenium import webdriver
import time
import config

start_time = time.time()  # время начала выполнения

op = webdriver.EdgeOptions()
op.add_argument('--headless')
driver = webdriver.Edge(options=op)
credentials = config.credentials

driver.get("https://edu.tatar.ru/login")
# find username/email field and send the username itself to the input field
driver.find_element("name", "main_login2").send_keys(credentials['login'])
# find password input field and insert password as well
driver.find_element("name", "main_password2").send_keys(credentials['password'])
# click login button
driver.find_element("xpath", "//button[contains(text(),'Войти')]").click()

driver.get("https://edu.tatar.ru/user/diary/week")

html_page = driver.page_source

driver.quit()

print(html_page)

end_time = time.time()  # время окончания выполнения
total_time = end_time - start_time  # время выполнения в секундах
print("Время выполнения:", total_time, "секунд")


Я перепробовал все User-Agent, все варианты заголовков, но ничего не выходит. Можете посмотреть, что я делаю не так в первом случае? Я ни в коем случае не прошу всё сделать за меня - я хочу понять где моя ошибка, поэтому буду признателен, если ответ всё таки найдётся. Спасибо
  • Вопрос задан
  • 83 просмотра
Решения вопроса 1
@Romeo558 Автор вопроса
Продолжающий программист на python.
Я разобрался.
В общем, совет всем кто пишет такие парсеры: Добавляйте больше заголовков!
Этот сайт меня не пропускал, считая меня роботом только потому что какой-то заголовок не был указан. Я взял вот это за основу:

headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': '_ym_uid=1676574290233522544; _ym_d=1676574290; DNSID=a058e0e7b3a7d65874158d1d0eac55f5da0061bf; HLP=4855814%7C%242y%2410%24ghilzoCbi4w1A04ImC1yh.Llg85UEDw2JdtsPIyEeCzpYNN%2Fa3eky; _ym_isad=2; _ym_visorc=b',
        'Origin': 'https://edu.tatar.ru',
        'Referer': 'https://edu.tatar.ru/login/',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58',
        'sec-ch-ua': '"Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"'
    }


И всё заработало прекрасно.
Вот код, который я по итогу использовал:

Код
import requests
from bs4 import BeautifulSoup
import fake_useragent
import time

url = "https://edu.tatar.ru/login"
url2 = "https://edu.tatar.ru/user/diary/week"
login_data = {"main_login2": "", "main_password2": ""}
ua = fake_useragent.UserAgent()

# start_time = time.time()

with requests.Session() as s:
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
        'Accept-Language': 'ru,en;q=0.9,en-GB;q=0.8,en-US;q=0.7',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Cookie': '_ym_uid=1676574290233522544; _ym_d=1676574290; DNSID=a058e0e7b3a7d65874158d1d0eac55f5da0061bf; HLP=4855814%7C%242y%2410%24ghilzoCbi4w1A04ImC1yh.Llg85UEDw2JdtsPIyEeCzpYNN%2Fa3eky; _ym_isad=2; _ym_visorc=b',
        'Origin': 'https://edu.tatar.ru',
        'Referer': 'https://edu.tatar.ru/login/',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.58',
        'sec-ch-ua': '"Chromium";v="112", "Microsoft Edge";v="112", "Not:A-Brand";v="99"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"'
    }
    s.post(url, data=login_data, headers=headers)
    diary_page = s.get(url2, headers=headers)
    soup = BeautifulSoup(diary_page.content, "lxml")

# end_time = time.time()
# result = end_time-start_time
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Потому что надо исходный код целевой страницы почитать, ну и разобраться, как пользоваться инструментами разработчика в браузере, чтобы понять, какие запросы выполняются.
https://edu.tatar.ru/login - это URL для получения страницы с формой входа. А вот сама форма отправляет данные на URL https://edu.tatar.ru/logon. Именно по этому адресу я бы и делал запрос.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы