import logging import os from datetime import date from io import StringIO from itertools import groupby from bs4 import BeautifulSoup import requests import pandas as pd from . import utils, validation from .notifications import slack_notification, send_report logger = logging.getLogger(__name__) url = "http://www.cboe.com/delayedquote/quote-table-download" def fetch_data(symbols=None): """Fetches options data for a given list of symbols""" symbols = symbols or _get_all_listed_symbols() options = utils.get_module_config("cboe") mute_notifications = options.get("mute_notifications", []) try: form_data = _form_data() except requests.ConnectionError as ce: msg = "Connection error trying to reach {}".format(url) logger.error(msg) slack_notification(msg, __name__) raise ce except Exception as e: msg = "Error parsing response" logger.error(msg, exc_info=True) slack_notification(msg, __name__) raise e headers = {"Referer": url} file_url = "http://www.cboe.com/delayedquote/quotedata.dat" symbols = [symbol.upper() for symbol in symbols] done = 0 failed = [] for symbol in symbols: form_data["ctl00$ContentTop$C005$txtTicker"] = symbol try: response = requests.post(url, data=form_data, headers=headers, allow_redirects=False) symbol_req = requests.get(file_url, cookies=response.cookies, headers=headers) symbol_data = symbol_req.text if symbol_data == "" or symbol_data.startswith("