Авторизация на сайте и парсинг

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
Добрый день всем!

Есть код на Python, который должен выполнять авторизацию на сайте и парсинг нужного элемента в аккаунте пользователя:

Python:
import requests

from bs4 import BeautifulSoup

 

HEADERS = {'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)'}

        

s = requests.Session()

 

data = {"username":"orlov1", "password":"123456"}

 

url = "https://windscribe.com/login"

url1 = 'https://windscribe.com/myaccount'

 

r = s.post(url, data=data, headers=HEADERS)

r1 = s.get(url1, headers=HEADERS)

print(r1.status_code)

 

soup = BeautifulSoup(r1.text, "html.parser")

 

user = soup.find('h1', class_='account-box-h1')

print(user)

Вроде все верно, но авторизация не проходит.
Помогите решить проблему.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Вот какой запрос делается для входа на сайт:
1647797053693.png

как видишь тут не только логин и пароль
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
Вот какой запрос делается для входа на сайт:
Посмотреть вложение 1711

как видишь тут не только логин и пароль
Как правильно передать эти данные ? Они ведь генерятся для каждого запроса как я понял.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Да, надо разбираться откуда они берутся, тут я так сходу не помогу
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 672
478
83
Как правильно передать эти данные ? Они ведь генерятся для каждого запроса как я понял.
csrf токены - это защита формы, так просто не подобрать...
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
token и time находятся в коде страницы с формой:
HTML:
<div id="login_cont">
<form action="https://rus.windscribe.com/login" method="post" name="loginform" id="loginform">
<div class="login-box">
<div class="content_message error" style="display: none;"></div>
<input type="hidden" name="login" value="1">
<input type="hidden" name="upgrade" id="upgrade_redir" value="0">
<input type="hidden" name="csrf_time" id="csrf_time" value="1647814401">
<input type="hidden" name="csrf_token" id="csrf_token" value="8ed44f742aaff7ac22f1ccf810172a1967a1d1a9">
<input type="text" class="username" placeholder="Имя пользователя" name="username" id="username" value="">
<input type="password" class="password" placeholder="Пароль" name="password" id="pass">
<input type="text" class="code_2fa" placeholder="2FA Code" name="code" id="code">
</div>

Пытаюсь спарсить эти данные. Не выходит.

Python:
url = "https://windscribe.com/login"

r0 = s.get(url, headers=HEADERS)
soup0 = BeautifulSoup(r0.text, "html.parser")
data = soup0.find_all('div', class_='login-box')
for dat in data:
    print(dat)

Значение value = " " - не выводятся.

В чем проблема ?
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
Держи:

Python:
import requests
from bs4 import BeautifulSoup as bs

headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)'}
get_token_url = "https://res.windscribe.com/res/logintoken"
login_data = {"username": "bot123bot",
              "password": "bot123bot",
              "login": 1,
              "upgrade": 0}
login_url = "https://windscribe.com/login"
account_url = "https://windscribe.com/myaccount"

ses = requests.Session()

tokens = ses.post(get_token_url).json()
login = ses.post(login_url, data=login_data | tokens)

info = ses.get(account_url, headers=headers)
soup = bs(info.text, 'lxml')
user = soup.find('h1', class_='account-box-h1')
print(user)
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
У вас этот код работает ?

У меня выдает ошибку:
Код:
line 16, in <module>
    login = ses.post(login_url, data=login_data | tokens)
TypeError: unsupported operand type(s) for |: 'dict' and 'dict'

Я понял, что вы дозаписываете словарь login_data значениями csrf_token и csrf_data
 
Последнее редактирование:

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
У вас этот код работает ?

У меня выдает ошибку:
Код:
line 16, in <module>
    login = ses.post(login_url, data=login_data | tokens)
TypeError: unsupported operand type(s) for |: 'dict' and 'dict'

Я понял, что вы дозаписываете словарь login_data значениями csrf_token и csrf_data
А, у тебя python 3.8, используй login_data.update(tokens)
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
Да, уже сам понял в чем проблема.
В итоге вот такой код:
Python:
import requests
from bs4 import BeautifulSoup as bs

headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)'}
get_token_url = "https://res.windscribe.com/res/logintoken"
login_data = {"username": "bot123bot",
              "password": "bot123bot",
              "login": 1,
              "upgrade": 0}
login_url = "https://windscribe.com/login"
account_url = "https://windscribe.com/myaccount"

ses = requests.Session()

tokens = ses.post(get_token_url).json()

login = ses.post(login_url, data=login_data.update(tokens))

info = ses.get(account_url, headers=headers)

soup = bs(info.text, 'lxml')
user = soup.find('h1', class_='account-box-h1')
print(user)

Результат :

Код:
None
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
973
220
43
21
Москва
a.update(b) обновляет a, но ничего не возвращает
ты сначала обнови login_data, а потом уже подставь
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
Так вроде так и есть.

Если после 17 строки вставить
Python:
print(login_data)

Возвращает корректный словарь
Код:
{'username': 'bot123bot', 'password': 'bot123bot', 'login': 1, 'upgrade': 0, 'csrf_token': 'a7b79a91079957a869172c55527970821a491e2f', 'csrf_time': 1647888403}
 

orlov1

Новичок
Пользователь
Июн 23, 2021
52
2
8
Разобрался.
Рабочий код:
Python:
import requests
from bs4 import BeautifulSoup as bs

headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)'}
get_token_url = "https://res.windscribe.com/res/logintoken"
login_data = {"username": "bot123bot",
              "password": "bot123bot",
              "login": 1,
              "upgrade": 0}
login_url = "https://windscribe.com/login"
account_url = "https://windscribe.com/myaccount"

ses = requests.Session()

tokens = ses.post(get_token_url).json()

login_data.update(tokens)

login = ses.post(login_url, data=login_data)

print(login_data)

info = ses.get(account_url, headers=headers)
soup = bs(info.text, 'lxml')
user = soup.find_all('h1', class_='account-box-h1')
print(user)
 
  • Мне нравится
Реакции: Vershitel_sudeb

Форум IT Специалистов