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 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() 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("