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 import tenacity import time import csv from . import utils, validation from .notifications import 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() valid_symbols = _get_all_listed_symbols() # options = utils.get_module_config("cboe") try: form_data = _form_data() except requests.ConnectionError as ce: msg = "Connection error trying to reach {}".format(url) logger.error(msg) raise ce except Exception as e: msg = "Error parsing response" logger.error(msg, exc_info=True) 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: assert symbol in valid_symbols 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("