Yahoo Finance окончательно устареет в этом году, и я нахожусь в процессе поиска альтернативного надежного поставщика данных. Я занимаюсь веб-очисткой для загрузки исторических данных о запасах.
В двух словах
- Я подписался на их обслуживание. =)
- Я использую агент fake_user и выбираю один случайный заголовок для использования при входе в систему.
- Я пытаюсь передать учетные данные в следующей строке: payload = {'redirect_url': base64.b64encode ('https://website.com'),' site ':' US ',' login_username ': login_username, 'login_password': login_password}
- Получить печенье.
- Загрузите данные и обработайте исключения как требуется.
Теоретически это должно работать, но я получаю следующую ошибку: 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()
Пара вопросов,
- Почему он жалуется даже после того, как я преобразовал str в байты?
- Как правильно отправить учетные данные на веб-сайт https?
- Есть ли другой способ отправки учетных данных без их жесткого кодирования в коде, что делает его более безопасным?
Спасибо заранее.