Невозможно войти в Amazon с помощью Python

Я использую Python 3, чтобы написать сценарий для входа в Amazon, чтобы получить доступ к моим основным моментам Kindle. Он основан на этой статье: https://blog.jverkamp.com/2015/07/02/scraping-kindle-highlights/

Я не могу успешно войти в систему и вместо этого получаю сообщение о том, что нужно включить файлы cookie для продолжения:

<RequestsCookieJar[<Cookie ubid-main=189-4768762-8531647 for .amazon.com/>]>
Failed to login: 

Please Enable Cookies to Continue

To continue shopping at Amazon.com, please enable cookies in your Web browser.
Learn more about cookies and how to enable them.

Я включил сеансы запросов для обработки файлов cookie, но, похоже, это не работает.

Вот код, который я использую, чтобы попытаться сделать это:

import bs4, requests

session = requests.Session()
session.headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
}

# Log in to Amazon, we have to get the real login page to bypass CSRF
print('Logging in...')
response = session.get('https://kindle.amazon.com/login')

soup = bs4.BeautifulSoup(response.text, "html.parser")

signin_data = {}
signin_form = soup.find('form', {'name': 'signIn'})
for field in signin_form.find_all('input'):
    try:
        signin_data[field['name']] = field['value']
    except:
        pass

signin_data[u'ap_email'] = 'myemail'
signin_data[u'ap_password'] = 'mypassword'


response = session.post('https://www.amazon.com/ap/signin', data = signin_data)

soup = bs4.BeautifulSoup(response.text, "html.parser")

warning = soup.find('div', {'id': 'message_warning'})
if warning:
    print('Failed to login: {0}'.format(warning.text))

Есть ли что-то, чего мне не хватает при использовании сеансов?


person tjm    schedule 07.04.2016    source источник


Ответы (2)


Данные вашей формы входа на самом деле неверны, это должны быть электронная почта и пароль:

signin_data[u'email'] = 'your_email'
signin_data[u'password'] = 'your_password'

Вы также можете избежать попытки с помощью css select и has_attr:

import bs4, requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
}

from bs4 import BeautifulSoup

with requests.Session() as s:
    s.headers = headers
    r = s.get('https://kindle.amazon.com/login')
    soup = BeautifulSoup(r.content, "html.parser")
    signin_data = {s["name"]: s["value"]
                   for s in soup.select("form[name=signIn]")[0].select("input[name]")
                   if s.has_attr("value")}

    signin_data[u'email'] = 'your_em'
    signin_data[u'password'] = 'pass'

    response = s.post('https://www.amazon.com/ap/signin', data=signin_data)
    soup = bs4.BeautifulSoup(response.text, "html.parser")
    warning = soup.find('div', {'id': 'message_warning'})
    if warning:
        print('Failed to login: {0}'.format(warning.text))
    print(response.content)

Первая строка вывода, вы можете увидеть <title>Amazon Kindle: Home</title> в конце:

b'<?xml version="1.0" encoding="utf-8"?>\n<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">\n  <head>\n    <title>Amazon Kindle: Home</title>\n  

Если он по-прежнему не работает, вам следует обновить версию requests и, возможно, попробовать другой пользовательский агент. Как только я изменил ap_email и ap_password, я вошел в систему нормально.

person Padraic Cunningham    schedule 07.04.2016
comment
Спасибо за ответ. Я обновил код в соответствии с вашим предложением, но все равно получил ту же ошибку. - person tjm; 08.04.2016
comment
@tjm, код работает нормально, какую версию запросов bs4 вы используете? - person Padraic Cunningham; 08.04.2016
comment
Я использую bs4 0.0.1. Я принял ваше предложение и удалил попытку. Кажется, это помогло, и теперь я получаю HTML-код ‹title›Amazon Kindle: Home‹/title›. Спасибо! - person tjm; 08.04.2016
comment
Я всегда получаю сообщение об ошибке: `TypeError: select() отсутствует 1 обязательный позиционный аргумент: 'селектор' - person BenjaminK; 05.05.2020

2020 - этот код больше не будет работать. Amazon добавила JavaScript на свои страницы входа, которые, если они не будут выполнены, приведут к сбою этой последовательности. На извлеченных страницах будет указано, что файлы cookie не включены, даже если они включены и работают. Совместная отправка имени пользователя и пароля приводит к ответу на странице подтверждения, содержащему капчу. Отправка имени пользователя, а затем отправка пароля во втором обмене приводит к ответу «что-то пошло не так» и снова запрашивает имя пользователя/пароль. Amazon распознает, что JavaScript не был выполнен.

person Jay Mosk    schedule 13.09.2020