Как сделать несколько запросов через requests без обновления страницы
Я пытаюсь написать программку на Python версии 3.9 для вытягивания данных из html кода страницы, чтобы дальше вставить их в нужное мне поле в этой же странице. Сначала я обращаюсь к странице, чтобы взять код через requests.get, делаю нужную операцию, находя значение value, но когда я снова обращаюсь к сайту через requests.post, чтобы вставить это значение в нужное поле, у меня открывается уже другая сессия и соответственно значение value уже другое, не то, которое было до этого. Как мне действовать в рамках одной сессии, чтобы после проделанных действий я вставил своё значение value в ту сессию, которая и была открыта изначально? Всё работает исправно, кроме этого момента с обновлением сессии. Спасибо!
import requests
from bs4 import BeautifulSoup
r = requests.get("http://idil24.space/login")
print(r.text)
soup = BeautifulSoup(r.content, "html.parser")
def auto():
if soup.find(id="One") and soup.find_all(class_="form-control col-2 mr-2"):
c = soup.find(id='One_hidden')
return c['value']
elif soup.find(id="Two") and soup.find_all(class_="form-control col-2 mr-3"):
c = soup.find(id='Two_hidden')
return c['value']
elif soup.find(id="Answer") and soup.find_all(class_="form-control col-2 mr-2"):
c = soup.find(id='Answer_hidden')
return c['value']
j = requests.post("http://idil24.space/login", data={'One': auto(),
'Two:': auto(),
'Answer': auto()})
print(j.text)
Ответы (1 шт):
Да, requests.Session() действительно нужен (вернее, с ним удобнее), т.к. сайт устанавливает кукиз и позже проверяет их, поэтому
url = 'http://idil24.space/login'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41',
'Content-Type': 'application/json',
'Referer': 'http://idil24.space/login'
}
session = requests.Session()
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
и тут обнаруживается, что все составляющие для капчи есть в коде... внезапно:
one = soup.find('input', id='One_hidden')['value']
two = soup.find('input', id='Two_hidden')['value']
symbol = soup.find('input', id='Symbol_hidden')['value']
answer = soup.find('input', id='Answer_hidden')['value']
hash_value = soup.find('input', id='hash_hidden')['value']
type_value = soup.find('input', id='Type_hidden')['value']
print(f'one: {one}, two: {two}, symbol: {symbol}, answer: {answer}')
print(f'type: {type_value}, hash: {hash_value}')
выведет что-то наподобие:
one: 8, two: 6, symbol: 2, answer: 2
type: 1, hash: jktTCDIFK2m1l9MbGc4QvGMTAqk1L8dWiXGDGp5rJWoAFESMuKN9R085CljSvlM0
hash тоже запрашивается в качестве параметра, поэтому забирайте и его, а дальше сделайте запрос на тот же адрес, но уже post, и передайте:
payload = {
'login': login,
'password': password,
'one': one,
'two': two,
'symbol': symbol,
'answer': answer,
'type': type_value,
'hash': hash_value,
}
Все вместе:
import requests
from bs4 import BeautifulSoup
def login(login, password):
url = 'http://idil24.space/login'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41',
'Content-Type': 'application/json',
'Referer': 'http://idil24.space/login'
}
session = requests.Session()
r = session.get(url, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
one = soup.find('input', id='One_hidden')['value']
two = soup.find('input', id='Two_hidden')['value']
symbol = soup.find('input', id='Symbol_hidden')['value']
answer = soup.find('input', id='Answer_hidden')['value']
hash_value = soup.find('input', id='hash_hidden')['value']
type_value = soup.find('input', id='Type_hidden')['value']
print(f'one: {one}, two: {two}, symbol: {symbol}, answer: {answer}')
print(f'type: {type_value}, hash: {hash_value}')
payload = {
'login': login,
'password': password,
'one': one,
'two': two,
'symbol': symbol,
'answer': answer,
'type': type_value,
'hash': hash_value,
}
r = session.post(url, headers=headers, json=payload)
print(r)
print(r.text)
PS у меня выполнение login('admin', 'qwerty'), ожидаемо, возвращает
<Response [200]>
Не верный пароль.
но у вас-то есть доступ к сайту? ;)
PPS Удачного парсинга!