2017-02-18 8 views
4

Я пытаюсь войти на сайт с помощью Запросов и, кажется, наносит удар по стене. Любой совет будет принят во внимание.Вход в систему с использованием запросов Python

Я пытаюсь войти в систему economist.com (без причины, просто у меня есть имя пользователя и пароль), страница входа в систему которой находится в https://www.economist.com/user/login и чья форма входа имеет атрибут action="https://www.economist.com/user/login?destination=%2F".

Использование инструментов разработчика Chrome, данные формы для запроса входа в систему выглядит следующим образом:

name: ///////// 
pass: //////// 
form-build-id: form-483956e97a61f73fbc0ebf06b04dbe3f 
form_id: user_login 
securelogin_original_baseurl: https://www.economist.com 
op: Log in 

Мой код GETs страницу входа в систему, использует BeautifulSoup для определения form_id; попытки POST войти в систему с использованием моего имени пользователя и пароля, извлеченного form_id и других скрытых переменных; а затем использует BeautifulSoup проверить домашнюю страницу, чтобы увидеть, если баннер имеет ссылку для входа или выхода из системы, чтобы определить, есть ли я на самом деле вошли в

Код выглядит следующим образом:.

import requests 
from bs4 import BeautifulSoup 

# Setting user agent to a real browser instead of requests 
headers = requests.utils.default_headers() 
headers.update(
    { 
     'User-Agent': 'Mozilla/5.0', 
    } 
) 

# create a session and login 
s = requests.Session() 
login_page = s.get('https://www.economist.com/user/login', headers=headers) 
login = BeautifulSoup(login_page.text, 'lxml') 
form = login.select_one("form > div > input") 
payload = { 
      'name' : '////////////', 
      'pass' : '////////', 
      'form_build_id' : form['value'], 
      'form_id' : 'user_login', 
      'securelogin_original_baseurl' : 'https://www.economist.com', 
      'op' : 'Log in' 
      } 
response = s.post("https://www.economist.com/user/login?destination=%2F", 
data=payload, headers=headers) 

# check homepage banner to see if login or logout link is there 
url = "https://www.economist.com/" 
r = s.get(url, headers=headers) 
soup = BeautifulSoup(r.text, 'lxml') 
banner = soup.select("div > div > span > a") 
for table_row in banner: 
    print(table_row['href']) 

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

ответ

1

Я пробовал ваш код и только 1 вещь не работала со мной.

form = login.select_one("form > div > input") 

To:

form = login.find('input', attrs={'name': "form_build_id"}) 

Затем войдите нормально, и чтобы убедиться, что, если я войти в систему или нет, я получаю страницу, только авторизованные пользователи могут посетить. http://www.economist.com/subscriptions/activation

, если вы можете посетить эту страницу, то вы вошли в систему, или вы будете перенаправлены на https://www.economist.com/user/register?destination=subscriptions%2Factivation&rp=activating

import requests 
from bs4 import BeautifulSoup 

# Setting user agent to a real browser instead of requests 
headers = requests.utils.default_headers() 
headers.update(
    { 
     'User-Agent': 'Mozilla/5.0', 
    } 
) 

# create a session and login 
s = requests.Session() 
login_page = s.get('https://www.economist.com/user/login', headers=headers) 
login = BeautifulSoup(login_page.text, 'lxml') 
form = login.find('input', attrs={'name': "form_build_id"})#works 

payload = { 
      'name' : '*****', 
      'pass' : '*****', 
      'form_build_id' : form['value'], 
      'form_id' : 'user_login', 
      'securelogin_original_baseurl' : 'https://www.economist.com', 
      'op' : 'Log in' 
      } 
response = s.post("https://www.economist.com/user/login?destination=%2F", 
data=payload, headers=headers) 

activation_page = s.get('http://www.economist.com/subscriptions/activation', headers=headers) 
if activation_page.url == 'https://www.economist.com/user/register?destination=subscriptions%2Factivation&rp=activating': 
    print"Failed to login" 
elif activation_page.url == 'http://www.economist.com/subscriptions/activation': 
    print"Logged In Successfully!" 
+0

Спасибо. Это работает. Я думаю, что моя «форма» работала, хотя ваша гораздо менее прочная форма. Я думаю, что моя проблема все время была дрянной проверкой, чтобы увидеть, был ли я зарегистрирован. Ваш намного более изящный (хотя/активация перенаправляет меня на/thankyou, но предпосылка такая же). – argent656