TypeError: требуется байтоподобный объект, а не 'str' при отправке учетных данных на веб-сайт https - PullRequest
0 голосов
/ 14 января 2019

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

В двух словах

  1. Я подписался на их обслуживание. =)
  2. Я использую агент fake_user и выбираю один случайный заголовок для использования при входе в систему.
  3. Я пытаюсь передать учетные данные в следующей строке: payload = {'redirect_url': base64.b64encode ('https://website.com'),' site ':' US ',' login_username ': login_username, 'login_password': login_password}
  4. Получить печенье.
  5. Загрузите данные и обработайте исключения как требуется.

Теоретически это должно работать, но я получаю следующую ошибку: TypeError: требуется байтоподобный объект, а не 'str'

Я попытался преобразовать str в байт как:

login_username = b'username '

или

login_username = username.encode ('utf-8')

import base64
import time

import requests
from fake_useragent import UserAgent

tickers = ['AAPL', 'AMZN', 'FB']

#Credentials to login
login_username = b'username'
login_password = b'password'


def get_magic_cookies():
    __urls__ = {'url_login': 'https://secure.website.com/login/secure'}

    payload = {'redirect_url': base64.b64encode('https://website.com'), 'site': 'MX', 'login_username': login_username,
           'login_password': login_password}
    headers = {UserAgent().random}

    _req = requests.post(__urls__['url_login'], data=payload, headers=headers)

    account_login = _req.history[0].headers['location']
    req_gsv = requests.get(account_login)  # Request for get SID values in content
    cookies_l = req_gsv.history[0].cookies

    if req_gsv.history:
        SID_USER = req_gsv.history[0].cookies['SID']
        USER_COOKIES = [_ for _ in req_gsv.history[0].cookies]
        USER_REQUEST = payload['login_username']

    return cookies_l

#get_magic_cookies()


def main():
    stocks_failed = []
    stocks_timeout = []

    for ticker in tickers:
        try:
            req  = requests.get('https://website.com/p.php?pid=data&daily=1&symbol={0}%5E{1}%2A'.format(ex, ticker)
            with open('path\\to\file\\{}.csv'.format(ticker), 'wb') as itd:
                itd.write(req.content)
                itd.close()


        except 'There were no results for your query' in req.content:
            print('[ {0} ] Stock Failed\n'.format(ticker))
            stocks_failed.append(ticker)

        except 'You have made too many requests. Please wait before trying to download again.' in req.content:
            print('{} Stock timeout'.format(ticker))
            stocks_timeout.append(ticker)
            time.sleep(80)  # Time of 80 secounds
            pass


if __name__ == '__main__':
    main()

Пара вопросов,

  1. Почему он жалуется даже после того, как я преобразовал str в байты?
  2. Как правильно отправить учетные данные на веб-сайт https?
  3. Есть ли другой способ отправки учетных данных без их жесткого кодирования в коде, что делает его более безопасным?

Спасибо заранее.

...