2014-02-02 1 views
0

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

import requests 
URL = "https://login.ull.es/cas-1/login?service=https%3A%2F%2Fcampusvirtual.ull.es%2Flogin%2Findex.php%3FauthCAS%3DCAS" 
USER = "myuser" 
PASS = "mypassword" 

payload = { 
    "username": USER, 
    "password": PASS, 
    "warn": "false", 
    "lt": "LT-2455188-fQ7b5JcHghCg1cLYvIMzpjpSEd0rlu", 
    "execution": "e1s1", 
    "_eventId": "submit", 
    "submit": "submit" 
} 

with requests.Session() as s: 
    r = s.post(URL, data=payload) 
    #r = s.get(r"http://campusvirtual.ull.es/my/index.php") 

    with open("test.html","w") as f: 
     f.write(r.text) 

Этот код, очевидно, не работает, и я не знаю, где это ошибка, я пытался ставить только имя пользователя и пароль в полезной нагрузке (остальные значения в исходном коде в Интернете, которые отмечены как скрытый), но это также не удается.

Может ли кто-нибудь указать мне правильное направление? Благодарю. (извините за мой английский)

+0

Есть ли ошибка брошена питона? Что такое контент в 'r.text'? –

+0

Укажите, что вы ожидаете, и что на самом деле происходит. Если вы говорите «нехорошо не работая», трудно понять, что пошло не так. Также вы должны сообщить нам, какие сообщения об ошибках вы получите. – Behe

+0

Предлагаю вам использовать https://wiki.jasig.org/display/CASC/Pycas, чтобы облегчить жизнь. –

ответ

6

"lt": "LT-2455188-fQ7b5JcHghCg1cLYvIMzpjpSEd0rlu" - это идентификатор сеанса или какой-либо анти-CSRF-защиты или аналогичный (дикий гамм: номер случайного номера hmac-ed). Важно то, что это не постоянное значение, вам нужно будет прочитать его с того же URL-адреса, выпустив запрос GET.

В GET ответ у вас есть что-то вроде:

<input type="hidden" name="lt" value="LT-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 

Кроме того, есть JSESSIONID печенье, которые могут быть важны.

Это должен быть ваш поток:

  1. Получить URL
  2. извлечь параметр lt и JSESSIONID печенье из ответа
  3. Наполните payload['lt'] полю
  4. заголовок печенье набор
  5. POST то же самое URL.

Извлечение печенья очень просто, см. Документацию requests.

Извлечение параметра lt немного сложнее, но вы можете сделать это с помощью пакета BeautifulSoup. Если предположить, что у вас есть ответ в переменную с именем text, вы можете использовать:

from BeautifulSoup import BeautifulSoup as soup 

payload['lt'] = soup(text).find('input', {'name': 'lt', 'type': 'hidden'}).get('value') 
+0

Спасибо! Это сработало, теперь я чувствую себя глупым. –

+0

Добро пожаловать. Пожалуйста, рассмотрите [прием ответа] (https://meta.stackexchange.com/questions/16721/how-does-accept-rate-work/65088#65088) –