Основная проблема с вашим кодом - это кодировка данных. Я заметил, что вы установили заголовок Content-Type на «multipart / form-data», но этого недостаточно для создания многочастных закодированных данных. Фактически это проблема, потому что фактическая кодировка отличается, так как вы используете параметр data
, который URL-кодирует данные POST. Для создания данных, состоящих из нескольких частей, вы должны использовать параметр files
.
Вы можете сделать это либо передав дополнительный фиктивный параметр в files
,
res = s.post(URL, data=payload, files={'file':''})
(это изменило бы кодировку для всех данных POST, а не только для поля 'file'
)
Или вы можете преобразовать значения в вашем словаре payload
в кортежи, что является ожидаемой структурой при публикации файлов с запросами.
payload = {k:(None, str(v)) for k,v in payload.items()}
Первое значение для имени файла; в этом случае он не нужен, поэтому я установил None
.
Затем ваши данные POST должны содержать значение __EVENTTARGET
, необходимое для получения правильного ответа. (При создании словаря данных POST важно предоставить все данные, которые ожидает сервер. Мы можем получить эти данные из браузера: либо путем проверки формы HTML, либо путем проверки сетевого трафика.) Полный код,
import requests
from bs4 import BeautifulSoup
URL = "https://www.icsi.in/student/Members/MemberSearch.aspx"
with requests.Session() as s:
r = s.get(URL)
soup = BeautifulSoup(r.text,"lxml")
payload = {i['name']: i.get('value', '') for i in soup.select('input[name]')}
payload['dnn$ctr410$MemberSearch$txtCpNumber'] = 16803
payload["__EVENTTARGET"] = 'dnn$ctr410$MemberSearch$btnSearch'
payload = {k:(None, str(v)) for k,v in payload.items()}
r = s.post(URL, files=payload)
soup_obj = BeautifulSoup(r.text,"lxml")
name = soup_obj.select_one(".name_head > span").text
print(name)
После еще нескольких тестов я обнаружил, что сервер также принимает данные в кодировке URL (вероятно, из-за отсутствия опубликованных файлов). Таким образом, вы можете получить действительный ответ либо с data
, либо с files
, при условии, что вы не измените заголовок Content-Type по умолчанию.
Нет необходимости добавлять дополнительные заголовки. При использовании объекта Session
файлы cookie сохраняются и отправляются по умолчанию. Заголовок Content-Type создается автоматически - «application / x-www-form-urlencoded» при использовании параметра data
, «multipart / form-data» с использованием files
. Изменение агента пользователя по умолчанию или добавление Referer не требуется.