запросы, возвращающие HTTP 404 при входе в систему после публикации

#python #web-scraping

#питон #соскабливание паутины

Вопрос:

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

  1. Полезная нагрузка содержит всю необходимую информацию. Я использовал элемент проверки и сеть, чтобы убедиться, что я не пропустил ни одного поля ввода, и get_authenticity_token успешно удаляет соответствующую строку.
  2. Может быть, я делаю что-то не так в своем заголовке? Я просто скопировал для этого чужой код. Возможно, даже не понадобится заголовок.
 import requests from bs4 import BeautifulSoup  session = requests.Session() session.headers = {'User-Agent': ('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) '  'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36')}  payload = {'email':'person@email.com',   'password':'secret',  'utf8':'✓',  'commit': 'Sign In'  }  def get_authenticity_token(html):  soup = BeautifulSoup(html, "html.parser")  token = soup.find('input', attrs={'name': 'authenticity_token'})  if not token:  print('could not find `authenticity_token` on login form')  return token.get('value').strip()    s = session.get("https://pomonastudents.org/login") payload.update({  'authenticity_token': get_authenticity_token(s.text)  })  s = session.post("https://pomonastudents.org/login", data=payload)  print(s.text) print(payload)  

Почему это может не сработать? Какие шаги я могу предпринять для расследования возможных причин? правка: исправлена неловкая формулировка и добавлено последнее предложение.

Комментарии:

1. «По каким возможным причинам это может не сработать? » Существует бесчисленное множество причин, по которым это может не работать; чаще всего здесь мы видим сайты с другими мерами безопасности как на стороне клиента, так и на стороне сервера, которые намеренно препятствуют этому типу автоматической очистки. Учитывая только детали, которые вы указали в своем вопросе, очень трудно сказать.

2. Кнопка входа на странице , похоже, собирается /login/credentials , но нет /login . И что это за особый символ в 'utf8' поле?

3. Не знаю, что там с utf8 полем. Я просто заметил, что он там был, поэтому добавил его. Когда я изменил URL на /login/credentials , я получаю ошибку 422. Прогресс?

4. Включить X-CSRF-Token в заголовки. Более того, вы отправляете запросы на публикацию по неправильному URL-адресу. Правильным должно быть https://pomonastudents.org/login/credentials

5. Я включил X-CSRF-Token в заголовки и исправил URL-адрес. Сейчас я получаю ответ HTTP 422.

Ответ №1:

Вот что я имел в виду. Попробуйте это:

 import requests from bs4 import BeautifulSoup  payload = {  'utf8': '✓',  'authenticity_token': '',  'email': 'person@email.com',  'password': 'secret',  'commit': 'Sign In' }  with requests.Session() as s:  s.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'  s.headers['X-Requested-With'] = 'XMLHttpRequest'  res = s.get("https://pomonastudents.org/login")  soup = BeautifulSoup(res.text, "html.parser")  payload['authenticity_token'] = soup.select_one("[name='authenticity_token']")["value"]  s.headers['X-CSRF-Token'] = soup.select_one("[name='csrf-token']")["content"]  resp = s.post('https://pomonastudents.org/login/credentials',data=payload)  print(resp.status_code)