#python #web-scraping
#питон #соскабливание паутины
Вопрос:
Я пытаюсь очистить этот веб-сайт обзора курсов для своего колледжа, но для этого мне нужно войти в систему. Я думаю, что я все делаю правильно в процессе входа в систему:
- Полезная нагрузка содержит всю необходимую информацию. Я использовал элемент проверки и сеть, чтобы убедиться, что я не пропустил ни одного поля ввода, и get_authenticity_token успешно удаляет соответствующую строку.
- Может быть, я делаю что-то не так в своем заголовке? Я просто скопировал для этого чужой код. Возможно, даже не понадобится заголовок.
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)