diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..98a0d6b --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.ipynbcheckpoint +.ipynb_checkpoints +__pychache__ +envs diff --git a/0204-Web_Scraping.ipynb b/0204-Web_Scraping.ipynb deleted file mode 100644 index 4c071eb..0000000 --- a/0204-Web_Scraping.ipynb +++ /dev/null @@ -1,604 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Link to this jupyter notebook](./Files/0204-Web_Scraping.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# In-Class Assignment: Web Scraping\n", - "\n", - "Today we will be exploring some of the extensive datasets available at the National Oceanic and Atmospheric Administration (NOAA). Work as a team to try to get as many of todays activities done. We will meet as a class again around 3:30pm to discuss what you learned. \n", - "\n", - "\n", - "\n", - "Image From: https://www.ncdc.noaa.gov/data-access/land-based-station-data/land-based-datasets/us-climate-reference-network-uscrn" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Agenda for today's class (80 minutes)\n", - "\n", - "\n", - "1. [(10 minutes) NOAA Example](#NOAA_Example)\n", - "1. [(5 minutes) Installing Beautiful Soup](#Installing_Beautiful_Soup)\n", - "2. [(20 minutes) Presidential data example](#Presidential_data_example)\n", - "4. [(20 minutes) Dynamic Website example](#DynamicWebsites)\n", - "5. [(25 minutes) wrap-up Discussion](#Wrapup)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----\n", - "\n", - "\n", - "# 1. NOAA Example and Coding Standards.\n", - "\n", - "We are going to start today's activity by doing a code review of a **_web spider_** program. \n", - "\n", - "✅ **DO THIS:** Download the [noaa_scrapper.py](./Files/noaa_scrapper.py) and [this jupyter notebook](./Files/0204-Web_Scraping.ipynb') annd put them in the same directory. Run the file via the following command:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "running as noaa_scraper\n" - ] - } - ], - "source": [ - "%matplotlib inline \n", - "import matplotlib.pyplot as plt\n", - "\n", - "from noaa_scraper import get_noaa_temperatures" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "✅ **DO THIS:** Run the ```get_noaa_temperatures``` function as follows:" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "691ca32a38264410b08bf84dcfc82a97", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2007/CRNS0101-05-2007-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2007-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2008/CRNS0101-05-2008-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2008-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2009/CRNS0101-05-2009-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2009-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2010/CRNS0101-05-2010-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2010-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2011/CRNS0101-05-2011-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2011-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2012/CRNS0101-05-2012-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2012-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2013/CRNS0101-05-2013-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2013-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2014/CRNS0101-05-2014-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2014-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2015/CRNS0101-05-2015-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2015-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2016/CRNS0101-05-2016-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2016-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2017/CRNS0101-05-2017-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2017-MI_Gaylord_9_SSW.txt\n", - "FOUND http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/2018/CRNS0101-05-2018-MI_Gaylord_9_SSW.txt\n", - "downloading... ./data/CRNS0101-05-2018-MI_Gaylord_9_SSW.txt\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "04e5ba406f9145a4ac3b3c790f63d37a", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FloatProgress(value=0.0, max=12.0)" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "reading... ./data/CRNS0101-05-2007-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2008-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2009-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2010-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2011-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2012-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2013-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2014-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2015-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2016-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2017-MI_Gaylord_9_SSW.txt\n", - "reading... ./data/CRNS0101-05-2018-MI_Gaylord_9_SSW.txt\n" - ] - }, - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "air_temperatures = get_noaa_temperatures('http://www1.ncdc.noaa.gov/pub/data/uscrn/products/subhourly01/', 'Gaylord', 100)\n", - "plt.plot(air_temperatures)\n", - "# plt.axis([0,1000,-20,80])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "✅ **DO THIS:** With your group, do a code review of the contents of the **noaa_scraper.py** file and figure out what it does. What are the main part of this module and what do they do? Be prepared to discuss this with the class. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Put your notes here" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----\n", - "\n", - "\n", - "# 2. Installing Beautiful Soup\n", - "\n", - "For this class we will be trying out [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/), a Python web parsing module. \n", - "\n", - "✅ **DO THIS:** Install the ```beautifulsoup4``` library on your computer (the following will work on jupyterhub but should work anywhere). When you are done, help your neighbor and raise your hand if you need help." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "#!mkdir packages" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "#!pip install -t ./packages/ beautifulsoup4" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "sys.path.append('./packages/')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----\n", - "\n", - "# 3. Presidential data example\n", - "This second example is a **_web scraper_** program. Found this idea by reading the following blog post: https://blog.exploratory.io/scraping-us-presidents-list-from-web-and-transforming-it-to-be-useful-fff534470bb6\n", - "\n", - "✅ **DO THIS:** Click on the following link and review the page source with your teams. Discuss which tags you need to look for to try and isolate the table data only. Ideally we want to create a ```pandas table``` of this data:\n", - "https://www.loc.gov/rr/print/list/057_chron.html\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Put notes on what you find here." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Download and view html\n", - "\n", - "The following code should download the above website and parse read it into a ```beautifulsoup``` object:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "#The following library downloads the data and stores it in a page variable\n", - "import requests\n", - "page = requests.get(\"https://www.loc.gov/rr/print/list/057_chron.html\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "#Import and run beautifule should html.parser\n", - "from bs4 import BeautifulSoup\n", - "soup = BeautifulSoup(page.content, 'html.parser')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "✅ **DO THIS:** explore the ```soup``` variable using python functions such as; ```type```, ```dir``` and ```help```.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Put your answer to the above here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##ANSWER##\n", - "type(soup)\n", - "##ANSWER##" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##ANSWER##\n", - "dir(soup)\n", - "##ANSWER##" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##ANSWER##\n", - "help(soup)\n", - "##ANSWER##" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#Print out the raw html using \"pretty print\" \n", - "print(soup.prettify())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Find the Tables\n", - "\n", - "Next, the following code finds all of the ```table``` sections in the website:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tables = soup.find_all('table')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "type(tables)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(tables)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "According to the above the results show that there are 9 ```table``` objects in the document. We are just looking for the one that has our data in it. \n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "✅ **DO THIS:** Find the table from the nine tables that has only the data we want. Make a variable ```table``` that only includes the information we want. Hint, it is not the first table which we can see by using the following code. " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "table = tables[0]\n", - "print(table.prettify())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##ANSWER##\n", - "table = tables[3]\n", - "print(table.prettify())\n", - "##ANSWER##" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parse out all the rows\n", - "\n", - "The rows of a table are determined by the ```tr``` (table row) tag and the columns are determined by the ```td```. The following code can find all of the rows in the table:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rows = table.find_all('tr')\n", - "rows" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Get the column labels\n", - "\n", - "The first row is the column header row as can be seen by running the following code:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "rows[0]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "labels = []\n", - "for c in rows[0].find_all('th'):\n", - " labels.append(c.get_text())\n", - "labels" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Parse Rows\n", - "\n", - "✅ **DO THIS:** The next step is to loop though the remaining rows and save the data as a list of lists" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "#put your code here" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "##ANSWER##\n", - "\n", - "data = [] \n", - "for row in rows[1:]:\n", - " myrow = []\n", - " for c in row.find_all('td'):\n", - " myrow.append(c.get_text())\n", - " data.append(myrow)\n", - "\n", - "##ANSWER##" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Convert list of list to Pandas Dataframe\n", - "\n", - "Assuming the above works, we can convert the list of lists and labels to a Pandas Dataframe" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd \n", - " \n", - "# Create the pandas DataFrame \n", - "df = pd.DataFrame(data, columns=labels) " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----\n", - "\n", - "\n", - "\n", - "# 4. Dynamic Website example\n", - "\n", - "The two above examples were fairly simple. However, sometimes websites get a lot more complex. This is especially true when the website includes \"client side\" code. This code (typically javascript) runs on the web browser in your local computer and not the web server. It makes the problem difficult because to pull the data out you often need to either figure out what the code is doing and mimic it in your python program or \"render\" the program using a javascript client and then figure out the output. \n", - "\n", - "\n", - "Fortunatly there are tools that can help. Have your team do a google search and see if you can find some python tools specifically designed to help render dynamic websites. See if you can download/install and test the code.\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "---\n", - "\n", - "\n", - "\n", - "\n", - "# 5. Wrap-up Discussion" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Written by Dr. Dirk Colbry, Michigan State University\n", - "\"Creative
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "----" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.8" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/CMSEtech_Webscraper.ipynb b/CMSEtech_Webscraper.ipynb index 647fc70..422e051 100644 --- a/CMSEtech_Webscraper.ipynb +++ b/CMSEtech_Webscraper.ipynb @@ -10,24 +10,1476 @@ }, { "cell_type": "markdown", - "id": "7e00a4f3", + "id": "2dd54fbc", "metadata": {}, "source": [ - "#### Designed to scrape MSU class information and be stored in a Google Spreadsheet" + "### Extract CMSE classes information Using Beautiful Soup" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "1dd513b2", "metadata": {}, "outputs": [], + "source": [ + "from bs4 import BeautifulSoup\n", + "import pandas as pd\n", + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cb4986a3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'tables = soup.findAll(\"table\", {\"class\": \"ps_grid-flex\"})\\ntab = tables[0]\\ntrs = tab.findAll(\\'tr\\')'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "with open('./SS23_CMSE201.html') as f:\n", + " html_doc = f.read()\n", + "\n", + "soup = BeautifulSoup(html_doc, 'html.parser')\n", + "\"\"\"tables = soup.findAll(\"table\", {\"class\": \"ps_grid-flex\"})\n", + "tab = tables[0]\n", + "trs = tab.findAll('tr')\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a768d919", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['CMSE 180:Introduction to Data ScienceCross-Listed',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 001 / Class Nbr 36448 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Caballero',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 002 / Class Nbr 11842 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Silvia',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 003 / Class Nbr 11843 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:30 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'H Lei',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 004 / Class Nbr 11844 / Regular Academic Session',\n", + " 'Mon Wed : 3:00 PM-4:50 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'P Hamerski',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 005 / Class Nbr 11845 / Regular Academic Session',\n", + " 'Tue Thu : 8:00 AM-9:50 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'L Silvestri',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 006 / Class Nbr 11846 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'S Ravishankar',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 007 / Class Nbr 11847 / Regular Academic Session',\n", + " 'Tue Thu : 12:40 PM-2:30 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'Y Cheng',\n", + " 'CMSE 201:Computational Modeling and Data Analysis I',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 008 / Class Nbr 11848 / Regular Academic Session',\n", + " 'Tue Thu : 3:00 PM-4:50 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'L Silvestri',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11850 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'H Yu',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11850 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'H Yu',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 002 / Class Nbr 11851 / Regular Academic Session',\n", + " 'Mon Wed : 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'T Finzell',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 002 / Class Nbr 11851 / Regular Academic Session',\n", + " 'Mon Wed : 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'T Finzell',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 003 / Class Nbr 11852 / Regular Academic Session',\n", + " 'Tue Thu : 3:00 PM-4:50 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Frisbie',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 004 / Class Nbr 11853 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'W Kerzendorf',\n", + " 'CMSE 202:Computational Modeling and Data Analysis II',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 004 / Class Nbr 11853 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM',\n", + " '01/09/2023 - 04/30/202301/09/2023 - 04/30/2023',\n", + " 'W Kerzendorf',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 32293 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Chen',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 32293 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Chen',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 002 / Class Nbr 32294 / Regular Academic Session',\n", + " 'Tue Thu : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'S Karnik, L Korreshi',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 002 / Class Nbr 32294 / Regular Academic Session',\n", + " 'Tue Thu : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'S Karnik, L Korreshi',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 003 / Class Nbr 32295 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'G Bhusal, E Rapinchuk',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 003 / Class Nbr 32295 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'G Bhusal, E Rapinchuk',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 004 / Class Nbr 32296 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'M Paparizos',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 004 / Class Nbr 32296 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'M Paparizos',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 005 / Class Nbr 35472 / Regular Academic Session',\n", + " 'Mon Fri : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Sareen, S Tu',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 005 / Class Nbr 35472 / Regular Academic Session',\n", + " 'Mon Fri : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Sareen, S Tu',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 006 / Class Nbr 35473 / Regular Academic Session',\n", + " 'Mon Fri : 2:40 PM-4:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Sareen, S Tu',\n", + " 'CMSE 314:Matrix Algebra with Computational ApplicationsCross-Listed',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 006 / Class Nbr 35473 / Regular Academic Session',\n", + " 'Mon Fri : 2:40 PM-4:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Sareen, S Tu',\n", + " 'CMSE 381:Fundamentals of Data Science MethodsCross-Listed',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11854 / Regular Academic Session',\n", + " 'Mon Wed Fri : 2:40 PM-4:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'Y Xie',\n", + " 'CMSE 401:Methods for Parallel Computing',\n", + " 'Lecture(4.00 units)Open',\n", + " 'Section 001 / Class Nbr 32549 / Regular Academic Session',\n", + " 'Mon Wed Fri : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Appelo',\n", + " 'CMSE 404:Introduction to Machine LearningCross-Listed',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 11856 / Regular Academic Session',\n", + " 'Tue Thu : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'P Kordjamshidi',\n", + " 'CMSE 492:Selected Topics in Data ScienceCross-Listed',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11858 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'M Murillo',\n", + " 'CMSE 495:Experiential Learning in Data Science (W)',\n", + " 'Lecture(4.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11859 / Regular Academic Session',\n", + " 'Mon Wed Fri : 2:40 PM-4:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'D Colbry',\n", + " 'CMSE 499:Independent Study in Computational Mathematics, Science, and EngineeringApproval Required',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 001 / Class Nbr 11860 / Regular Academic Session',\n", + " 'To Be Announced',\n", + " '01/09/2023 - 04/30/2023Approval Required',\n", + " 'To Be Announced',\n", + " 'CMSE 801:Introduction to Computational Modeling and Data Analysis',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 11861 / Regular Academic Session',\n", + " 'Mon Wed : 8:30 AM-9:50 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'A Bazavov',\n", + " 'CMSE 802:Methods in Computational Modeling',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 11862 / Regular Academic Session',\n", + " 'Tue Thu : 8:30 AM-9:50 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'R Wang',\n", + " 'CMSE 820:Mathematical Foundations of Data Science',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 32543 / Regular Academic Session',\n", + " 'Mon Wed : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'Y Yang',\n", + " 'CMSE 822:Parallel ComputingCross-Listed',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 32544 / Regular Academic Session',\n", + " 'Tue Thu : 10:20 AM-11:40 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'S Couch',\n", + " 'CMSE 831:Computational Optimization',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 11865 / Regular Academic Session',\n", + " 'Mon Wed Fri : 1:50 PM-2:40 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'L Huang',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and EngineeringCross-Listed',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 001 / Class Nbr 11866 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'M Murillo',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 002 / Class Nbr 11867 / Regular Academic Session',\n", + " 'Tue Thu : 8:30 AM-9:50 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'M Iwen',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(3.00 units)Open',\n", + " 'Section 003 / Class Nbr 11868 / Regular Academic Session',\n", + " 'Tue Thu : 8:30 AM-9:50 AM',\n", + " '01/09/2023 - 04/30/2023',\n", + " 'A Christlieb',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 301 / Class Nbr 11869 / Dynamic Dated',\n", + " 'Mon Wed : 3:00 PM-4:50 PM',\n", + " '01/11/2023 - 02/08/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 302 / Class Nbr 11870 / Dynamic Dated',\n", + " 'Mon Wed : 3:00 PM-4:50 PM',\n", + " '02/20/2023 - 03/22/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 303 / Class Nbr 11871 / Dynamic Dated',\n", + " 'Tue Thu : 3:00 PM-4:50 PM',\n", + " '01/17/2023 - 02/09/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 304 / Class Nbr 11872 / Dynamic Dated',\n", + " 'Tue Thu : 3:00 PM-4:50 PM',\n", + " '02/21/2023 - 03/23/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 305 / Class Nbr 11873 / Dynamic Dated',\n", + " 'Tue Thu : 3:00 PM-4:50 PM',\n", + " '04/04/2023 - 04/27/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and Engineering',\n", + " 'Lecture(1.00 units)Open',\n", + " 'Section 309 / Class Nbr 11874 / Dynamic Dated',\n", + " 'Mon Wed : 3:00 PM-4:50 PM',\n", + " '04/03/2023 - 04/26/2023',\n", + " 'A Black Pyrkosz',\n", + " 'CMSE 890:Selected Topics in Computational Mathematics, Science, and EngineeringApproval Required',\n", + " 'Lecture(3.00 units)Closed',\n", + " 'Section 730 / Class Nbr 36338 / Regular Academic Session',\n", + " 'Mon Wed : 12:40 PM-2:00 PM',\n", + " '01/09/2023 - 04/30/2023Approval Required',\n", + " 'M Murillo',\n", + " 'CMSE 891:Independent Study in Computational Mathematics, Science, and EngineeringApproval Required',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11875 / Regular Academic Session',\n", + " 'To Be Announced',\n", + " '01/09/2023 - 04/30/2023Approval Required',\n", + " 'A Christlieb, D Colbry',\n", + " 'CMSE 891:Independent Study in Computational Mathematics, Science, and EngineeringApproval Required',\n", + " 'Lecture(3.00 units)Wait List',\n", + " 'Section 001 / Class Nbr 11875 / Regular Academic Session',\n", + " 'To Be Announced',\n", + " '01/09/2023 - 04/30/2023Approval Required',\n", + " 'A Christlieb, D Colbry']" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "values = []\n", + "divs = soup.find_all(\"div\", class_=\"ps-htmlarea\")\n", + "for div in divs:\n", + " val = (div.get_text(strip=True))\n", + " values.append(val)\n", + "values = list(filter(lambda x: x != \"\", values))\n", + "values.pop(0)\n", + "values" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3e0b5063", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SubjectCourse NumberCourse NameTypeUnitsStatusSectionClass NbrAcademic SessionDaysTimeDatesInstructor
0CMSE180Introduction to Data ScienceCross-ListedLecture4.00Open00136448Regular Academic SessionMon Wed10:20 AM-12:10 PM01/09/2023 - 04/30/2023D Caballero
1CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00211842Regular Academic SessionMon Wed10:20 AM-12:10 PM01/09/2023 - 04/30/2023D Silvia
2CMSE201Computational Modeling and Data Analysis ILecture4.00Open00311843Regular Academic SessionMon Wed12:40 PM-2:30 PM01/09/2023 - 04/30/2023H Lei
3CMSE201Computational Modeling and Data Analysis ILecture4.00Open00411844Regular Academic SessionMon Wed3:00 PM-4:50 PM01/09/2023 - 04/30/2023P Hamerski
4CMSE201Computational Modeling and Data Analysis ILecture4.00Open00511845Regular Academic SessionTue Thu8:00 AM-9:50 AM01/09/2023 - 04/30/2023L Silvestri
5CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00611846Regular Academic SessionTue Thu10:20 AM-12:10 PM01/09/2023 - 04/30/2023S Ravishankar
6CMSE201Computational Modeling and Data Analysis ILecture4.00Open00711847Regular Academic SessionTue Thu12:40 PM-2:30 PM01/09/2023 - 04/30/2023Y Cheng
7CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00811848Regular Academic SessionTue Thu3:00 PM-4:50 PM01/09/2023 - 04/30/2023L Silvestri
8CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00111850Regular Academic SessionMon Wed10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023H Yu
9CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00111850Regular Academic SessionMon Wed10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023H Yu
10CMSE202Computational Modeling and Data Analysis IILecture4.00Open00211851Regular Academic SessionMon Wed3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023T Finzell
11CMSE202Computational Modeling and Data Analysis IILecture4.00Open00211851Regular Academic SessionMon Wed3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023T Finzell
12CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00311852Regular Academic SessionTue Thu3:00 PM-4:50 PM01/09/2023 - 04/30/2023R Frisbie
13CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00411853Regular Academic SessionTue Thu10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023W Kerzendorf
14CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00411853Regular Academic SessionTue Thu10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023W Kerzendorf
15CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00132293Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Chen
16CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00132293Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Chen
17CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00232294Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023S Karnik, L Korreshi
18CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00232294Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023S Karnik, L Korreshi
19CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00332295Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023G Bhusal, E Rapinchuk
20CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00332295Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023G Bhusal, E Rapinchuk
21CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00432296Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Paparizos
22CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00432296Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Paparizos
23CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00535472Regular Academic SessionMon Fri12:40 PM-2:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
24CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00535472Regular Academic SessionMon Fri12:40 PM-2:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
25CMSE314Matrix Algebra with Computational Applications...Lecture3.00Open00635473Regular Academic SessionMon Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
26CMSE314Matrix Algebra with Computational Applications...Lecture3.00Open00635473Regular Academic SessionMon Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
27CMSE381Fundamentals of Data Science MethodsCross-ListedLecture4.00Wait List00111854Regular Academic SessionMon Wed Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023Y Xie
28CMSE401Methods for Parallel ComputingLecture4.00Open00132549Regular Academic SessionMon Wed Fri10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Appelo
29CMSE404Introduction to Machine LearningCross-ListedLecture3.00Open00111856Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023P Kordjamshidi
30CMSE492Selected Topics in Data ScienceCross-ListedLecture3.00Wait List00111858Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Murillo
31CMSE495Experiential Learning in Data Science (W)Lecture4.00Wait List00111859Regular Academic SessionMon Wed Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023D Colbry
32CMSE499Independent Study in Computational Mathematics...Lecture1.00Open00111860Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredTo Be Announced
33CMSE801Introduction to Computational Modeling and Dat...Lecture3.00Open00111861Regular Academic SessionMon Wed8:30 AM-9:50 AM01/09/2023 - 04/30/2023A Bazavov
34CMSE802Methods in Computational ModelingLecture3.00Open00111862Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023R Wang
35CMSE820Mathematical Foundations of Data ScienceLecture3.00Open00132543Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023Y Yang
36CMSE822Parallel ComputingCross-ListedLecture3.00Open00132544Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023S Couch
37CMSE831Computational OptimizationLecture3.00Open00111865Regular Academic SessionMon Wed Fri1:50 PM-2:40 PM01/09/2023 - 04/30/2023L Huang
38CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00111866Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Murillo
39CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00211867Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023M Iwen
40CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00311868Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023A Christlieb
41CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30111869Dynamic DatedMon Wed3:00 PM-4:50 PM01/11/2023 - 02/08/2023A Black Pyrkosz
42CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30211870Dynamic DatedMon Wed3:00 PM-4:50 PM02/20/2023 - 03/22/2023A Black Pyrkosz
43CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30311871Dynamic DatedTue Thu3:00 PM-4:50 PM01/17/2023 - 02/09/2023A Black Pyrkosz
44CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30411872Dynamic DatedTue Thu3:00 PM-4:50 PM02/21/2023 - 03/23/2023A Black Pyrkosz
45CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30511873Dynamic DatedTue Thu3:00 PM-4:50 PM04/04/2023 - 04/27/2023A Black Pyrkosz
46CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30911874Dynamic DatedMon Wed3:00 PM-4:50 PM04/03/2023 - 04/26/2023A Black Pyrkosz
47CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Closed73036338Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023Approval RequiredM Murillo
48CMSE891Independent Study in Computational Mathematics...Lecture3.00Wait List00111875Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredA Christlieb, D Colbry
49CMSE891Independent Study in Computational Mathematics...Lecture3.00Wait List00111875Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredA Christlieb, D Colbry
\n", + "
" + ], + "text/plain": [ + " Subject Course Number Course Name \\\n", + "0 CMSE 180 Introduction to Data ScienceCross-Listed \n", + "1 CMSE 201 Computational Modeling and Data Analysis I \n", + "2 CMSE 201 Computational Modeling and Data Analysis I \n", + "3 CMSE 201 Computational Modeling and Data Analysis I \n", + "4 CMSE 201 Computational Modeling and Data Analysis I \n", + "5 CMSE 201 Computational Modeling and Data Analysis I \n", + "6 CMSE 201 Computational Modeling and Data Analysis I \n", + "7 CMSE 201 Computational Modeling and Data Analysis I \n", + "8 CMSE 202 Computational Modeling and Data Analysis II \n", + "9 CMSE 202 Computational Modeling and Data Analysis II \n", + "10 CMSE 202 Computational Modeling and Data Analysis II \n", + "11 CMSE 202 Computational Modeling and Data Analysis II \n", + "12 CMSE 202 Computational Modeling and Data Analysis II \n", + "13 CMSE 202 Computational Modeling and Data Analysis II \n", + "14 CMSE 202 Computational Modeling and Data Analysis II \n", + "15 CMSE 314 Matrix Algebra with Computational Applications... \n", + "16 CMSE 314 Matrix Algebra with Computational Applications... \n", + "17 CMSE 314 Matrix Algebra with Computational Applications... \n", + "18 CMSE 314 Matrix Algebra with Computational Applications... \n", + "19 CMSE 314 Matrix Algebra with Computational Applications... \n", + "20 CMSE 314 Matrix Algebra with Computational Applications... \n", + "21 CMSE 314 Matrix Algebra with Computational Applications... \n", + "22 CMSE 314 Matrix Algebra with Computational Applications... \n", + "23 CMSE 314 Matrix Algebra with Computational Applications... \n", + "24 CMSE 314 Matrix Algebra with Computational Applications... \n", + "25 CMSE 314 Matrix Algebra with Computational Applications... \n", + "26 CMSE 314 Matrix Algebra with Computational Applications... \n", + "27 CMSE 381 Fundamentals of Data Science MethodsCross-Listed \n", + "28 CMSE 401 Methods for Parallel Computing \n", + "29 CMSE 404 Introduction to Machine LearningCross-Listed \n", + "30 CMSE 492 Selected Topics in Data ScienceCross-Listed \n", + "31 CMSE 495 Experiential Learning in Data Science (W) \n", + "32 CMSE 499 Independent Study in Computational Mathematics... \n", + "33 CMSE 801 Introduction to Computational Modeling and Dat... \n", + "34 CMSE 802 Methods in Computational Modeling \n", + "35 CMSE 820 Mathematical Foundations of Data Science \n", + "36 CMSE 822 Parallel ComputingCross-Listed \n", + "37 CMSE 831 Computational Optimization \n", + "38 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "39 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "40 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "41 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "42 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "43 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "44 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "45 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "46 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "47 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "48 CMSE 891 Independent Study in Computational Mathematics... \n", + "49 CMSE 891 Independent Study in Computational Mathematics... \n", + "\n", + " Type Units Status Section Class Nbr Academic Session \\\n", + "0 Lecture 4.00 Open 001 36448 Regular Academic Session \n", + "1 Lecture 4.00 Wait List 002 11842 Regular Academic Session \n", + "2 Lecture 4.00 Open 003 11843 Regular Academic Session \n", + "3 Lecture 4.00 Open 004 11844 Regular Academic Session \n", + "4 Lecture 4.00 Open 005 11845 Regular Academic Session \n", + "5 Lecture 4.00 Wait List 006 11846 Regular Academic Session \n", + "6 Lecture 4.00 Open 007 11847 Regular Academic Session \n", + "7 Lecture 4.00 Wait List 008 11848 Regular Academic Session \n", + "8 Lecture 4.00 Wait List 001 11850 Regular Academic Session \n", + "9 Lecture 4.00 Wait List 001 11850 Regular Academic Session \n", + "10 Lecture 4.00 Open 002 11851 Regular Academic Session \n", + "11 Lecture 4.00 Open 002 11851 Regular Academic Session \n", + "12 Lecture 4.00 Wait List 003 11852 Regular Academic Session \n", + "13 Lecture 4.00 Wait List 004 11853 Regular Academic Session \n", + "14 Lecture 4.00 Wait List 004 11853 Regular Academic Session \n", + "15 Lecture 3.00 Wait List 001 32293 Regular Academic Session \n", + "16 Lecture 3.00 Wait List 001 32293 Regular Academic Session \n", + "17 Lecture 3.00 Wait List 002 32294 Regular Academic Session \n", + "18 Lecture 3.00 Wait List 002 32294 Regular Academic Session \n", + "19 Lecture 3.00 Wait List 003 32295 Regular Academic Session \n", + "20 Lecture 3.00 Wait List 003 32295 Regular Academic Session \n", + "21 Lecture 3.00 Wait List 004 32296 Regular Academic Session \n", + "22 Lecture 3.00 Wait List 004 32296 Regular Academic Session \n", + "23 Lecture 3.00 Wait List 005 35472 Regular Academic Session \n", + "24 Lecture 3.00 Wait List 005 35472 Regular Academic Session \n", + "25 Lecture 3.00 Open 006 35473 Regular Academic Session \n", + "26 Lecture 3.00 Open 006 35473 Regular Academic Session \n", + "27 Lecture 4.00 Wait List 001 11854 Regular Academic Session \n", + "28 Lecture 4.00 Open 001 32549 Regular Academic Session \n", + "29 Lecture 3.00 Open 001 11856 Regular Academic Session \n", + "30 Lecture 3.00 Wait List 001 11858 Regular Academic Session \n", + "31 Lecture 4.00 Wait List 001 11859 Regular Academic Session \n", + "32 Lecture 1.00 Open 001 11860 Regular Academic Session \n", + "33 Lecture 3.00 Open 001 11861 Regular Academic Session \n", + "34 Lecture 3.00 Open 001 11862 Regular Academic Session \n", + "35 Lecture 3.00 Open 001 32543 Regular Academic Session \n", + "36 Lecture 3.00 Open 001 32544 Regular Academic Session \n", + "37 Lecture 3.00 Open 001 11865 Regular Academic Session \n", + "38 Lecture 3.00 Open 001 11866 Regular Academic Session \n", + "39 Lecture 3.00 Open 002 11867 Regular Academic Session \n", + "40 Lecture 3.00 Open 003 11868 Regular Academic Session \n", + "41 Lecture 1.00 Open 301 11869 Dynamic Dated \n", + "42 Lecture 1.00 Open 302 11870 Dynamic Dated \n", + "43 Lecture 1.00 Open 303 11871 Dynamic Dated \n", + "44 Lecture 1.00 Open 304 11872 Dynamic Dated \n", + "45 Lecture 1.00 Open 305 11873 Dynamic Dated \n", + "46 Lecture 1.00 Open 309 11874 Dynamic Dated \n", + "47 Lecture 3.00 Closed 730 36338 Regular Academic Session \n", + "48 Lecture 3.00 Wait List 001 11875 Regular Academic Session \n", + "49 Lecture 3.00 Wait List 001 11875 Regular Academic Session \n", + "\n", + " Days Time \\\n", + "0 Mon Wed 10:20 AM-12:10 PM \n", + "1 Mon Wed 10:20 AM-12:10 PM \n", + "2 Mon Wed 12:40 PM-2:30 PM \n", + "3 Mon Wed 3:00 PM-4:50 PM \n", + "4 Tue Thu 8:00 AM-9:50 AM \n", + "5 Tue Thu 10:20 AM-12:10 PM \n", + "6 Tue Thu 12:40 PM-2:30 PM \n", + "7 Tue Thu 3:00 PM-4:50 PM \n", + "8 Mon Wed 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM \n", + "9 Mon Wed 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM \n", + "10 Mon Wed 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM \n", + "11 Mon Wed 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM \n", + "12 Tue Thu 3:00 PM-4:50 PM \n", + "13 Tue Thu 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM \n", + "14 Tue Thu 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM \n", + "15 Tue Thu 10:20 AM-11:40 AM \n", + "16 Tue Thu 10:20 AM-11:40 AM \n", + "17 Tue Thu 12:40 PM-2:00 PM \n", + "18 Tue Thu 12:40 PM-2:00 PM \n", + "19 Mon Wed 10:20 AM-11:40 AM \n", + "20 Mon Wed 10:20 AM-11:40 AM \n", + "21 Mon Wed 12:40 PM-2:00 PM \n", + "22 Mon Wed 12:40 PM-2:00 PM \n", + "23 Mon Fri 12:40 PM-2:00 PM \n", + "24 Mon Fri 12:40 PM-2:00 PM \n", + "25 Mon Fri 2:40 PM-4:00 PM \n", + "26 Mon Fri 2:40 PM-4:00 PM \n", + "27 Mon Wed Fri 2:40 PM-4:00 PM \n", + "28 Mon Wed Fri 10:20 AM-11:40 AM \n", + "29 Tue Thu 12:40 PM-2:00 PM \n", + "30 Mon Wed 12:40 PM-2:00 PM \n", + "31 Mon Wed Fri 2:40 PM-4:00 PM \n", + "32 To Be Announced None \n", + "33 Mon Wed 8:30 AM-9:50 AM \n", + "34 Tue Thu 8:30 AM-9:50 AM \n", + "35 Mon Wed 10:20 AM-11:40 AM \n", + "36 Tue Thu 10:20 AM-11:40 AM \n", + "37 Mon Wed Fri 1:50 PM-2:40 PM \n", + "38 Mon Wed 12:40 PM-2:00 PM \n", + "39 Tue Thu 8:30 AM-9:50 AM \n", + "40 Tue Thu 8:30 AM-9:50 AM \n", + "41 Mon Wed 3:00 PM-4:50 PM \n", + "42 Mon Wed 3:00 PM-4:50 PM \n", + "43 Tue Thu 3:00 PM-4:50 PM \n", + "44 Tue Thu 3:00 PM-4:50 PM \n", + "45 Tue Thu 3:00 PM-4:50 PM \n", + "46 Mon Wed 3:00 PM-4:50 PM \n", + "47 Mon Wed 12:40 PM-2:00 PM \n", + "48 To Be Announced None \n", + "49 To Be Announced None \n", + "\n", + " Dates Instructor \n", + "0 01/09/2023 - 04/30/2023 D Caballero \n", + "1 01/09/2023 - 04/30/2023 D Silvia \n", + "2 01/09/2023 - 04/30/2023 H Lei \n", + "3 01/09/2023 - 04/30/2023 P Hamerski \n", + "4 01/09/2023 - 04/30/2023 L Silvestri \n", + "5 01/09/2023 - 04/30/2023 S Ravishankar \n", + "6 01/09/2023 - 04/30/2023 Y Cheng \n", + "7 01/09/2023 - 04/30/2023 L Silvestri \n", + "8 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 H Yu \n", + "9 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 H Yu \n", + "10 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 T Finzell \n", + "11 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 T Finzell \n", + "12 01/09/2023 - 04/30/2023 R Frisbie \n", + "13 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 W Kerzendorf \n", + "14 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 W Kerzendorf \n", + "15 01/09/2023 - 04/30/2023 D Chen \n", + "16 01/09/2023 - 04/30/2023 D Chen \n", + "17 01/09/2023 - 04/30/2023 S Karnik, L Korreshi \n", + "18 01/09/2023 - 04/30/2023 S Karnik, L Korreshi \n", + "19 01/09/2023 - 04/30/2023 G Bhusal, E Rapinchuk \n", + "20 01/09/2023 - 04/30/2023 G Bhusal, E Rapinchuk \n", + "21 01/09/2023 - 04/30/2023 M Paparizos \n", + "22 01/09/2023 - 04/30/2023 M Paparizos \n", + "23 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "24 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "25 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "26 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "27 01/09/2023 - 04/30/2023 Y Xie \n", + "28 01/09/2023 - 04/30/2023 D Appelo \n", + "29 01/09/2023 - 04/30/2023 P Kordjamshidi \n", + "30 01/09/2023 - 04/30/2023 M Murillo \n", + "31 01/09/2023 - 04/30/2023 D Colbry \n", + "32 01/09/2023 - 04/30/2023Approval Required To Be Announced \n", + "33 01/09/2023 - 04/30/2023 A Bazavov \n", + "34 01/09/2023 - 04/30/2023 R Wang \n", + "35 01/09/2023 - 04/30/2023 Y Yang \n", + "36 01/09/2023 - 04/30/2023 S Couch \n", + "37 01/09/2023 - 04/30/2023 L Huang \n", + "38 01/09/2023 - 04/30/2023 M Murillo \n", + "39 01/09/2023 - 04/30/2023 M Iwen \n", + "40 01/09/2023 - 04/30/2023 A Christlieb \n", + "41 01/11/2023 - 02/08/2023 A Black Pyrkosz \n", + "42 02/20/2023 - 03/22/2023 A Black Pyrkosz \n", + "43 01/17/2023 - 02/09/2023 A Black Pyrkosz \n", + "44 02/21/2023 - 03/23/2023 A Black Pyrkosz \n", + "45 04/04/2023 - 04/27/2023 A Black Pyrkosz \n", + "46 04/03/2023 - 04/26/2023 A Black Pyrkosz \n", + "47 01/09/2023 - 04/30/2023Approval Required M Murillo \n", + "48 01/09/2023 - 04/30/2023Approval Required A Christlieb, D Colbry \n", + "49 01/09/2023 - 04/30/2023Approval Required A Christlieb, D Colbry " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def get_class_info(values):\n", + " reshaped_list = [values[i:i+6] for i in range(0, len(values), 6)]\n", + "\n", + " # Create a DataFrame from the reshaped list\n", + " col_names = ['Course', 'Type', 'Section', 'Schedule', 'Dates', 'Instructor']\n", + " df = pd.DataFrame(reshaped_list, columns=col_names)\n", + " df[['Course Code', 'Course Name']] = df['Course'].str.split(':', 1, expand=True)\n", + " df[['Type', 'Units']] = df['Type'].str.split('(', 1, expand=True)\n", + " df[['Section', 'Class Nbr', 'Academic Session']] = df['Section'].str.split('/', 2, expand=True)\n", + " df[['Days', 'Time']] = df['Schedule'].str.split(':', 1, expand=True)\n", + " df[['Units','Status']] = df['Units'].str.split(')',1,expand=True)\n", + " df[['Subject','Course Number']] = df['Course Code'].str.split(' ',1,expand=True)\n", + "\n", + " df = df.drop(['Course', 'Schedule','Course Code'], axis=1)\n", + " df = df[['Subject','Course Number','Course Name','Type','Units','Status','Section','Class Nbr','Academic Session','Days','Time','Dates','Instructor']]\n", + " df['Units'] = df['Units'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Section'] = df['Section'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Class Nbr'] = df['Class Nbr'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " return df\n", + "df = get_class_info(values)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d0943ebe", + "metadata": {}, + "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -41,7 +1493,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.8" + "version": "3.11.3" } }, "nbformat": 4, diff --git a/Dynamic_Scraper.ipynb b/Dynamic_Scraper.ipynb new file mode 100644 index 0000000..434bde2 --- /dev/null +++ b/Dynamic_Scraper.ipynb @@ -0,0 +1,486 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "91802f7b-2f5c-47b8-b9ce-bebd2e3e78b5", + "metadata": {}, + "source": [ + "# Dynamic Web scraper\n", + "\n", + "This notebook scrapes the MSU courses website. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3446b42", + "metadata": {}, + "outputs": [], + "source": [ + "#Load selinimum and automatically install the Chrome Driver\n", + "from selenium import webdriver\n", + "from selenium.webdriver.chrome.options import Options\n", + "from webdriver_manager.chrome import ChromeDriverManager\n", + "import time\n", + "import pandas as pd\n", + "import re\n", + "from selenium.webdriver.chrome.service import Service" + ] + }, + { + "cell_type": "markdown", + "id": "47465a6b", + "metadata": {}, + "source": [ + "For versions of Chrome beyond 114, the WebDriver no longer has the capability to automatically retrieve a compatible version. In response, I manually acquired the WebDriver version 116 from the following website: https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/116.0.5845.96/win64/chromedriver-win64.zip. You can find additional information regarding this download on this page: https://support.google.com/chrome/thread/230521170/requires-version-116-of-the-google-chrome-driver%EF%BC%8Cplease?hl=en." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6db2164d-feef-4acd-9efa-687cb506c16a", + "metadata": {}, + "outputs": [], + "source": [ + "#Setup Chrome driver \n", + "#options = Options()\n", + "#options.add_argument('--headless')\n", + "driver = webdriver.Firefox()\n", + "time.sleep(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0751c3af", + "metadata": {}, + "outputs": [], + "source": [ + "#hrome_driver_path = r'D:\\classScraper\\chromedriver-win64/chromedriver.exe'\n", + "\n", + "#service = Service(executable_path='D:\\classScraper\\chromedriver-win64/chromedriver.exe')\n", + "#service = Service(executable_path='./geckodriver.exe')\n", + "#options = webdriver.ChromeOptions()\n", + "# running in optional headless mode\n", + "#options.add_argument('--headless')\n", + "# options = Options()\n", + "# driver = webdriver.Firefox(options=options)\n", + "# time.sleep(10)" + ] + }, + { + "cell_type": "markdown", + "id": "c6c015eb", + "metadata": {}, + "source": [ + "If you have chrome version older than 115, you can use this to automatically find the compatible webdriver." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8229775e", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"#Setup Chrome driver \n", + "options = Options()\n", + "options.add_argument('--headless')\n", + "driver = webdriver.Chrome(options=options)\n", + "time.sleep(10)\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "50494a50", + "metadata": {}, + "outputs": [], + "source": [ + "from bs4 import BeautifulSoup\n", + "\n", + "url = \"https://student.msu.edu/psc/public/EMPLOYEE/SA/c/NUI_FRAMEWORK.PT_AGSTARTPAGE_NUI.GBL?CONTEXTIDPARAMS=TEMPLATE_ID%3aPTPPNAVCOL&scname=MSU_AA_SCHEDULE_NEW0&PanelCollapsible=Y\"\n", + "driver.get(url)\n", + "time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "id": "5e7004bf", + "metadata": {}, + "source": [ + "The ids might change. I am using this currently." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "565f3889", + "metadata": {}, + "outputs": [], + "source": [ + "Semester = {'Summer 2020': \"'SSR_CSTRMPRV_VW_DESCR$8'\",\n", + " 'Fall 2020': \"'SSR_CSTRMPRV_VW_DESCR$span$7'\",\n", + " 'Spring 21': \"'SSR_CSTRMPRV_VW_DESCR$span$6'\",\n", + " 'Summer 21': \"'SSR_CSTRMPRV_VW_DESCR$5'\",\n", + " 'Fall 21': \"'SSR_CSTRMPRV_VW_DESCR$4'\",\n", + " 'Spring 22': \"'SSR_CSTRMPRV_VW_DESCR$span$3'\",\n", + " 'Summer 22': \"'SSR_CSTRMPRV_VW_DESCR$2'\",\n", + " 'Fall 22': \"'SSR_CSTRMPRV_VW_DESCR$1'\",\n", + " 'Spring 23': \"'SSR_CSTRMPRV_VW_DESCR$0'\",\n", + " 'Summer 23': \"'SSR_CSTRMCUR_VW_DESCR$0'\", \n", + " 'Fall 23': \"'SSR_CSTRMCUR_VW_DESCR$1'\",\n", + " 'Spring 24': \"'SSR_CSTRMCUR_VW_DESCR$2'\",\n", + " 'Summer 24': \"'SSR_CSTRMCUR_VW_DESCR$3'\"}\n", + "Semester = {\n", + " 'Current': \"'SSR_CSTRMCUR_VW_DESCR$0'\",\n", + " 'next': \"'SSR_CSTRMCUR_VW_DESCR$1'\"\n", + "}\n", + "\n", + " \n", + "url = f\"javascript:submitAction_win0(document.win0,{Semester['Current']});\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dee77f65", + "metadata": {}, + "outputs": [], + "source": [ + "driver.execute_script(url);\n", + "time.sleep(5)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f2741da", + "metadata": {}, + "outputs": [], + "source": [ + "from selenium.webdriver.common.by import By\n", + "element = driver.find_element(By.ID, 'MSU_CLSRCH_WRK2_SUBJECT') \n", + "element.send_keys(\"CMSE\") #pick cmse for example" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc4c4c8a", + "metadata": {}, + "outputs": [], + "source": [ + "url = f\"javascript:submitAction_win0(document.win0,'MSU_CLSRCH_WRK_SSR_PB_SEARCH');\"\n", + "driver.execute_script(url);\n", + "time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "id": "86be9395", + "metadata": {}, + "source": [ + "Function to get basic classes' info" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "58e64286", + "metadata": {}, + "outputs": [], + "source": [ + "def get_class_info(soup):\n", + " '''Scrape entire page for all of the class boxes'''\n", + " values = []\n", + " divs = soup.find_all(\"div\", class_=\"ps-htmlarea\")\n", + " for div in divs:\n", + " val = (div.get_text(strip=True))\n", + " values.append(val)\n", + " values.pop(0)\n", + " del values[0]\n", + " #TODO: Fix this hard coded deletions\n", + " for i in range(5,len(values),10):\n", + " values[i] = 'delete'\n", + " values[i+1] = 'delete'\n", + " values[i+2] = 'delete'\n", + " values[i+3] = 'delete'\n", + " values = list(filter(lambda x: x != \"delete\", values)) \n", + " reshaped_list = [values[i:i+6] for i in range(0, len(values), 6)]\n", + " # Create a DataFrame from the reshaped list\n", + " col_names = ['Instructor', 'Course', 'Type', 'Section', 'Schedule', 'Dates']\n", + " df = pd.DataFrame(reshaped_list, columns=col_names)\n", + " df[['Course Code', 'Course Name']] = df['Course'].str.split(':', n=1, expand=True)\n", + " #df[['Type', 'Units']] = df['Type'].str.split('(', 1, expand=True)\n", + " split_result = df['Type'].str.split('(', n=1, expand=True)\n", + "\n", + " # Check if the split operation resulted in two columns\n", + " if len(split_result.columns) == 2:\n", + " df[['Type', 'Units']] = split_result\n", + " else:\n", + " # Handle the case where the split didn't result in two columns\n", + " df['Type'] = split_result[0] # Assign the first part to 'Type'\n", + " df['Units'] = '' \n", + " df[['Section', 'Class Nbr', 'Academic Session']] = df['Section'].str.split('/', n=2, expand=True)\n", + " df[['Days', 'Time']] = df['Schedule'].str.split(':', n=1, expand=True)\n", + " df[['Units','Status']] = df['Units'].str.split(')',n=1,expand=True)\n", + " df[['Subject','Course Number']] = df['Course Code'].str.split(' ',n=1,expand=True)\n", + "\n", + " df = df.drop(['Course', 'Schedule','Course Code','Instructor'], axis=1)\n", + " df = df[['Subject','Course Number','Course Name','Type','Units','Status','Section','Class Nbr','Academic Session','Days','Time','Dates']]\n", + " df['Units'] = df['Units'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Section'] = df['Section'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Class Nbr'] = df['Class Nbr'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "751620d0", + "metadata": {}, + "outputs": [], + "source": [ + "body = driver.page_source\n", + "soup = BeautifulSoup(body, 'html.parser')\n", + "df = get_class_info(soup) # getting info on the first page" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b2af2770-3a68-4173-94f9-ad605b38c6f6", + "metadata": {}, + "outputs": [], + "source": [ + "#Remove none\n", + "df = df[df['Course Name'].notna()]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64a52630-19df-4ae9-9349-cd1d8a50c52f", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7f68905", + "metadata": {}, + "outputs": [], + "source": [ + "# get the number of results\n", + "result_element = soup.find('span', id='MSU_RSLT_NAV_WK_PTPG_ROWS_GRID')\n", + "# Extract the text content\n", + "result_text = result_element.get_text(strip=True)\n", + "result = int(result_text.split()[0])\n", + "pages = (result + 49) // 50# get the number of aggregated pages\n", + "pages" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2560190f", + "metadata": {}, + "outputs": [], + "source": [ + "def get_advanced_info(soup):\n", + " loc = None\n", + " email = None\n", + " name = None\n", + " values = []\n", + " divs = soup.find_all(\"div\", class_=\"ps-htmlarea\")\n", + " for div in divs:\n", + " val = (div.get_text(strip=True))\n", + " values.append(val)\n", + " values = list(filter(lambda x: x != \"\", values))\n", + " if len(values) > 5 and values[5] != \"\":\n", + " string = values[5].split('Instructor:')\n", + " else:\n", + " return None, None, None\n", + " loc = string[0]\n", + " a_elements = soup.find_all('a')\n", + " for a_element in a_elements:\n", + " # Check if the 'href' attribute exists\n", + " if 'href' in a_element.attrs:\n", + " # Check if the href attribute contains \"mailto:\"\n", + " if 'mailto:' in a_element['href']:\n", + " # Extract the email address from the href attribute\n", + " email = a_element['href'].split(':')[1]\n", + " name = a_element.text\n", + " break\n", + " return loc, email, name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "314505a3", + "metadata": {}, + "outputs": [], + "source": [ + "def add_info(df):\n", + " '''Function to add info from the breakout windows for each course\n", + " '''\n", + " location = []\n", + " emails = []\n", + " names = []\n", + " for i in range(len(df)):\n", + " rowname = f\"DESCR100$0_row_{i}\"\n", + " print(rowname)\n", + " element = driver.find_element(By.ID, rowname) \n", + " element.click()\n", + " time.sleep(2)\n", + " driver.switch_to.frame(0)\n", + " body = driver.page_source\n", + " soup = BeautifulSoup(body, 'html.parser')\n", + " loc, email, name = get_advanced_info(soup)\n", + " location.append(loc)\n", + " emails.append(email)\n", + " names.append(name)\n", + " cancel_cmd=\"javascript:doUpdateParent(document.win0,'#ICCancel');\"\n", + " driver.execute_script(cancel_cmd);\n", + " driver.switch_to.default_content();\n", + " time.sleep(2)\n", + " df['Location'] = location\n", + " df['email'] = emails\n", + " df['Instructor'] = names\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27da63f0", + "metadata": {}, + "outputs": [], + "source": [ + "df = add_info(df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "616a44f3", + "metadata": {}, + "outputs": [], + "source": [ + "for i in range(1,pages):\n", + " button = driver.find_element(By.ID, 'MSU_RSLT_NAV_WK_SEARCH_CONDITION2')\n", + " button.click()\n", + " time.sleep(2)\n", + " body = driver.page_source\n", + " soup = BeautifulSoup(body, 'html.parser')\n", + " df_new = get_class_info(soup)\n", + " df_new = add_info(df_new)\n", + " df = df.append(df_new, ignore_index=True)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89239a66", + "metadata": {}, + "outputs": [], + "source": [ + "def replace_empty_with_none(value):\n", + " return None if pd.isna(value) or (isinstance(value, str) and value == '') else value" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7bf8307", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "df['Approval Required'] = df['Dates'].apply(lambda x: 'Yes' if 'Approval Required' in x else 'No')\n", + "df['Dates'] = df['Dates'].str.replace('Approval Required', '').str.strip()\n", + "# Create a new column \"Approval Required\" with \"Yes\" for rows where \"Dates\" originally contained \"Approval Required,\" and \"No\" otherwise\n", + "\n", + "df[['first_name','last_name']] = df['Instructor'].str.split(' ',n=1,expand=True)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4996f859", + "metadata": {}, + "outputs": [], + "source": [ + "df['net_id'] = df['email'].str.split('@').str[0]\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91075c05", + "metadata": {}, + "outputs": [], + "source": [ + "df = df.applymap(replace_empty_with_none)" + ] + }, + { + "cell_type": "markdown", + "id": "a09181d0", + "metadata": {}, + "source": [ + "Convert to CSV if needed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c7464ac", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(\"Spring2024.csv\",index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "508a9055", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Manage Classes-SS23.html b/Manage Classes-SS23.html new file mode 100644 index 0000000..039d0dd --- /dev/null +++ b/Manage Classes-SS23.html @@ -0,0 +1,3561 @@ + + + + + + + + + + + + + +Manage Classes + + + + + + + + + + + + + + + + + + + +
+
+
 
 
 
+
+
Press Control+M to start dragging object
+ + + +
+ +
+
+
+
 
ptnbsid=KjhKwqqD%2b4PNLr83D%2fvaWP1IMdw%3d +

Class Search & Enroll

Close
+ +
+ +
+ + +
+
+ +
+ + + \ No newline at end of file diff --git a/Manage Classes.html b/Manage Classes.html new file mode 100644 index 0000000..69b3589 --- /dev/null +++ b/Manage Classes.html @@ -0,0 +1,2998 @@ + + + + + + + + + + + + + +Manage Classes + + + + + + + + + + + + + + + + + + + +
+
+
 
 
+
+
Press Control+M to start dragging object
+ + + +
+ +
+
+
+
 
ptnbsid=wRJ4WFFfsNPMTy%2bp%2bCT3ScJQH5Y%3d +

Class Search & Enroll

Close
+ +
+ +
+ + +
+
+ +
+ + + \ No newline at end of file diff --git a/README.md b/README.md index 5bbd7b8..9b2016c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,11 @@ -# CMSEtech_ClassScraper -Scraper to collect MSU class and course information to update spreadsheet with +# CMSEtech_ClassScraper +Scraper to collect MSU class and course information and save to a spreadsheet. This project was started by [smit1920](https://github.com/smit1920/CMSEtech_ClassScraper) and then updated by [sunxian1217](https://github.com/sunxian1217), both members of the CMSETech Team. + +## Status +This code is working but a little unstable. As of January 1st 2024 the best version was in . + +This version requires the installation of the gekodriver.exe file (in windows) to work. Just put the file in the main git +directory. + +## Next +See the [Issues List](https://github.com/colbrydi/CMSEtech_ClassScraper/issues) for items that need to be fixed. \ No newline at end of file diff --git a/SQL_guide.ipynb b/SQL_guide.ipynb new file mode 100644 index 0000000..79d6354 --- /dev/null +++ b/SQL_guide.ipynb @@ -0,0 +1,290 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "ed946777", + "metadata": {}, + "outputs": [], + "source": [ + "import sqlite3\n", + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "5e5ef784", + "metadata": {}, + "source": [ + "Download the sql file before execute this cell." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "b853ec77", + "metadata": {}, + "outputs": [], + "source": [ + "conn = sqlite3.connect(r'D:\\CMSEtech\\cmse.db') # change to your own path\n", + "cursor = conn.cursor()" + ] + }, + { + "cell_type": "markdown", + "id": "d3e60036", + "metadata": {}, + "source": [ + "The database file containing columns below:\n", + "\n", + "CMSE: Containing faculty and staff information\n", + "\n", + "Faculty: cmse faculty informaion\n", + "\n", + "Fall2023_classes: class information\n", + "\n", + "Publications\n", + "\n", + "Staff\n", + "\n", + "YearlyFacPublications" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bd90c075", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SubjectCourse NumberCourse NameTypeUnitsStatusSectionClass NbrAcademic SessionDaysTimeDatesLocationemailInstructorApproval Requiredfirst_namelast_namenet_id
0CMSE201Computational Modeling and Data Analysis ILecture4.0Open114272Regular Academic SessionMon Wed8:00 AM-9:50 AM8/28/2023 - 12/10/2023STEM 3201wangj164@msu.eduJianrong WangNoJianrongWangwangj164
1CMSE201Computational Modeling and Data Analysis ILecture4.0Open214273Regular Academic SessionMon Wed10:20 AM-12:10 PM8/28/2023 - 12/10/2023STEM 3201mengsen@msu.eduMengsen ZhangNoMengsenZhangmengsen
2CMSE201Computational Modeling and Data Analysis ILecture4.0Wait List314274Regular Academic SessionMon Wed12:40 PM-2:30 PM8/28/2023 - 12/10/2023STEM 3201baolianz@msu.eduLianzhang BaoNoLianzhangBaobaolianz
3CMSE201Computational Modeling and Data Analysis ILecture4.0Wait List414275Regular Academic SessionMon Wed3:00 PM-4:50 PM8/28/2023 - 12/10/2023STEM 3201chitwoo9@msu.eduDaniel ChitwoodNoDanielChitwoodchitwoo9
4CMSE201Computational Modeling and Data Analysis ILecture4.0Open514276Regular Academic SessionTue Thu8:00 AM-9:50 AM8/28/2023 - 12/10/2023STEM 3201baolianz@msu.eduLianzhang BaoNoLianzhangBaobaolianz
\n", + "
" + ], + "text/plain": [ + " Subject Course Number Course Name Type \\\n", + "0 CMSE 201 Computational Modeling and Data Analysis I Lecture \n", + "1 CMSE 201 Computational Modeling and Data Analysis I Lecture \n", + "2 CMSE 201 Computational Modeling and Data Analysis I Lecture \n", + "3 CMSE 201 Computational Modeling and Data Analysis I Lecture \n", + "4 CMSE 201 Computational Modeling and Data Analysis I Lecture \n", + "\n", + " Units Status Section Class Nbr Academic Session Days \\\n", + "0 4.0 Open 1 14272 Regular Academic Session Mon Wed \n", + "1 4.0 Open 2 14273 Regular Academic Session Mon Wed \n", + "2 4.0 Wait List 3 14274 Regular Academic Session Mon Wed \n", + "3 4.0 Wait List 4 14275 Regular Academic Session Mon Wed \n", + "4 4.0 Open 5 14276 Regular Academic Session Tue Thu \n", + "\n", + " Time Dates Location email \\\n", + "0 8:00 AM-9:50 AM 8/28/2023 - 12/10/2023 STEM 3201 wangj164@msu.edu \n", + "1 10:20 AM-12:10 PM 8/28/2023 - 12/10/2023 STEM 3201 mengsen@msu.edu \n", + "2 12:40 PM-2:30 PM 8/28/2023 - 12/10/2023 STEM 3201 baolianz@msu.edu \n", + "3 3:00 PM-4:50 PM 8/28/2023 - 12/10/2023 STEM 3201 chitwoo9@msu.edu \n", + "4 8:00 AM-9:50 AM 8/28/2023 - 12/10/2023 STEM 3201 baolianz@msu.edu \n", + "\n", + " Instructor Approval Required first_name last_name net_id \n", + "0 Jianrong Wang No Jianrong Wang wangj164 \n", + "1 Mengsen Zhang No Mengsen Zhang mengsen \n", + "2 Lianzhang Bao No Lianzhang Bao baolianz \n", + "3 Daniel Chitwood No Daniel Chitwood chitwoo9 \n", + "4 Lianzhang Bao No Lianzhang Bao baolianz " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.read_sql_query(\"SELECT * FROM Fall2023_classes\", conn)\n", + "\n", + "# Display the first few rows of the DataFrame\n", + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6d7c2db0", + "metadata": {}, + "outputs": [], + "source": [ + "conn.close()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/SS23_CMSE201.html b/SS23_CMSE201.html new file mode 100644 index 0000000..a3856da --- /dev/null +++ b/SS23_CMSE201.html @@ -0,0 +1,3561 @@ + + + + + + + + + + + + + +Manage Classes + + + + + + + + + + + + + + + + + + + +
+
+
 
 
 
+
+
Press Control+M to start dragging object
+ + + +
+ +
+
+
+
 
ptnbsid=DkcQMTtc8fQDcb6UebZOx0uDcKc%3d +

Class Search & Enroll

Close
+ +
+ +
+ + +
+
+ +
+ + + \ No newline at end of file diff --git a/Selenium_Example_V2.ipynb b/Selenium_Example_V2.ipynb new file mode 100644 index 0000000..cc72b86 --- /dev/null +++ b/Selenium_Example_V2.ipynb @@ -0,0 +1,1401 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "33c77785-63c6-443f-9f37-4b1c02765a4f", + "metadata": {}, + "source": [ + "# Selenium Example Notebook\n", + "\n", + "\n", + "### Step 1: Set up Selium Driver" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "5972cdc5-9516-4e0c-8cf5-4e38e9ecedd8", + "metadata": { + "tags": [] + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'C:\\\\Users\\\\24731\\\\.wdm\\\\drivers\\\\chromedriver\\\\win32\\\\114.0.5735.90\\\\chromedriver.exe'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Load selinimum and automatically install the Chrome Driver\n", + "from selenium import webdriver\n", + "from selenium.webdriver.chrome.options import Options\n", + "from webdriver_manager.chrome import ChromeDriverManager\n", + "import time\n", + "\n", + "install = ChromeDriverManager().install()\n", + "install" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c0fc1922", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "a81692c1-feb5-472b-9759-4a8834608e99", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#Setup Chrome driver \n", + "options = Options()\n", + "#options.add_argument('--headless')\n", + "driver = webdriver.Chrome(options=options)\n", + "time.sleep(10)" + ] + }, + { + "cell_type": "markdown", + "id": "966bd63f-3db7-49f6-885e-8c30a1cc97b2", + "metadata": {}, + "source": [ + "### Step 2: Call the main Course website for MSU " + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "427ea647-548e-4fb5-8769-99b3814fe2d5", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from bs4 import BeautifulSoup\n", + "\n", + "url = \"https://student.msu.edu/psc/public/EMPLOYEE/SA/c/NUI_FRAMEWORK.PT_AGSTARTPAGE_NUI.GBL?CONTEXTIDPARAMS=TEMPLATE_ID%3aPTPPNAVCOL&scname=MSU_AA_SCHEDULE_NEW0&PanelCollapsible=Y\"\n", + "driver.get(url)\n", + "time.sleep(20)" + ] + }, + { + "cell_type": "markdown", + "id": "6b29053e-14a0-42bc-b175-34c183d52875", + "metadata": { + "tags": [] + }, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "8bd428be-fa9d-4388-94bc-4bbd98c5ccfa", + "metadata": {}, + "source": [ + "###Step 3: Pick a semester\n", + "\n", + "In this example you can try the previous, current or next" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a03c2bfe-6447-49f7-9249-10d0e27f6150", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "Semester = {'Summer 2020': \"'SSR_CSTRMPRV_VW_DESCR$8'\",\n", + " 'Fall 2020': \"'SSR_CSTRMPRV_VW_DESCR$span$7'\",\n", + " 'Spring 21': \"'SSR_CSTRMPRV_VW_DESCR$span$6'\",\n", + " 'Summer 21': \"'SSR_CSTRMPRV_VW_DESCR$5'\",\n", + " 'Fall 21': \"'SSR_CSTRMPRV_VW_DESCR$4'\",\n", + " 'Spring 22': \"'SSR_CSTRMPRV_VW_DESCR$span$3'\",\n", + " 'Summer 22': \"'SSR_CSTRMPRV_VW_DESCR$2'\",\n", + " 'Fall 22': \"'SSR_CSTRMPRV_VW_DESCR$1'\",\n", + " 'Spring 23': \"'SSR_CSTRMPRV_VW_DESCR$0'\",\n", + " 'Summer 23': \"'SSR_CSTRMCUR_VW_DESCR$0'\", \n", + " 'Fall 23': \"'SSR_CSTRMCUR_VW_DESCR$1'\",\n", + " 'Spring 24': \"'SSR_CSTRMCUR_VW_DESCR$2'\",\n", + " 'Summer 24': \"'SSR_CSTRMCUR_VW_DESCR$3'\"}\n", + "\n", + " \n", + "url = f\"javascript:submitAction_win0(document.win0,{Semester['Spring 23']});\"" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "b2a3e45c-8c52-44c3-b7d3-dd8e9168a595", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#url = \"javascript:submitAction_win0(document.win0,'SSR_CSTRMPRV_VW_DESCR$3');\"\n", + "driver.execute_script(url);\n", + "time.sleep(30)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "c2a99d35", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"body = driver.page_source\\nsoup = BeautifulSoup(body, 'html.parser')\\nsoup\"" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\"\"\"body = driver.page_source\n", + "soup = BeautifulSoup(body, 'html.parser')\n", + "soup\"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "569e0560-b273-4c63-bcfa-7dc94991477a", + "metadata": {}, + "source": [ + "#### Step 4: Type in a form value to the Subject element (I had to find the name) and then hit submit!" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "410d2fed-b698-45a5-95b4-09c2f04f591b", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "from selenium.webdriver.common.by import By\n", + "element = driver.find_element(By.ID, 'MSU_CLSRCH_WRK2_SUBJECT') \n", + "element.send_keys(\"CMSE\")\n", + "# element.get_property('value')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3ba1d082-9016-4ea2-b23e-3150b68a5341", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "url = f\"javascript:submitAction_win0(document.win0,'MSU_CLSRCH_WRK_SSR_PB_SEARCH');\"\n", + "driver.execute_script(url);\n", + "time.sleep(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "dbc503e0-61ba-45a5-a038-2612d88825b5", + "metadata": {}, + "outputs": [], + "source": [ + "#body = driver.page_source\n", + "#soup = BeautifulSoup(body, 'html.parser')\n", + "#soup" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "8777c1c3", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\"element = driver.find_element(By.XPATH, \"//div[contains(@class, 'ps_box-htmlarea psc_label-suppressed psc_label-none psc_label-halignleft')]\")\n", + "\n", + "# Click on the element\n", + "element.click()\n", + "time.sleep(30\"\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "012b806a", + "metadata": {}, + "outputs": [], + "source": [ + "def get_class_info(soup):\n", + " values = []\n", + " divs = soup.find_all(\"div\", class_=\"ps-htmlarea\")\n", + " for div in divs:\n", + " val = (div.get_text(strip=True))\n", + " values.append(val)\n", + " values = list(filter(lambda x: x != \"\", values))\n", + " values.pop(0)\n", + " reshaped_list = [values[i:i+6] for i in range(0, len(values), 6)]\n", + "\n", + " # Create a DataFrame from the reshaped list\n", + " col_names = ['Course', 'Type', 'Section', 'Schedule', 'Dates', 'Instructor']\n", + " df = pd.DataFrame(reshaped_list, columns=col_names)\n", + " df[['Course Code', 'Course Name']] = df['Course'].str.split(':', 1, expand=True)\n", + " df[['Type', 'Units']] = df['Type'].str.split('(', 1, expand=True)\n", + " df[['Section', 'Class Nbr', 'Academic Session']] = df['Section'].str.split('/', 2, expand=True)\n", + " df[['Days', 'Time']] = df['Schedule'].str.split(':', 1, expand=True)\n", + " df[['Units','Status']] = df['Units'].str.split(')',1,expand=True)\n", + " df[['Subject','Course Number']] = df['Course Code'].str.split(' ',1,expand=True)\n", + "\n", + " df = df.drop(['Course', 'Schedule','Course Code'], axis=1)\n", + " df = df[['Subject','Course Number','Course Name','Type','Units','Status','Section','Class Nbr','Academic Session','Days','Time','Dates','Instructor']]\n", + " df['Units'] = df['Units'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Section'] = df['Section'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " df['Class Nbr'] = df['Class Nbr'].str.extract(r'(\\d+(?:\\.\\d+)?)')\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "c336cb89", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
SubjectCourse NumberCourse NameTypeUnitsStatusSectionClass NbrAcademic SessionDaysTimeDatesInstructor
0CMSE180Introduction to Data ScienceCross-ListedLecture4.00Open00136448Regular Academic SessionMon Wed10:20 AM-12:10 PM01/09/2023 - 04/30/2023D Caballero
1CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00211842Regular Academic SessionMon Wed10:20 AM-12:10 PM01/09/2023 - 04/30/2023D Silvia
2CMSE201Computational Modeling and Data Analysis ILecture4.00Open00311843Regular Academic SessionMon Wed12:40 PM-2:30 PM01/09/2023 - 04/30/2023H Lei
3CMSE201Computational Modeling and Data Analysis ILecture4.00Open00411844Regular Academic SessionMon Wed3:00 PM-4:50 PM01/09/2023 - 04/30/2023P Hamerski
4CMSE201Computational Modeling and Data Analysis ILecture4.00Open00511845Regular Academic SessionTue Thu8:00 AM-9:50 AM01/09/2023 - 04/30/2023L Silvestri
5CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00611846Regular Academic SessionTue Thu10:20 AM-12:10 PM01/09/2023 - 04/30/2023S Ravishankar
6CMSE201Computational Modeling and Data Analysis ILecture4.00Open00711847Regular Academic SessionTue Thu12:40 PM-2:30 PM01/09/2023 - 04/30/2023Y Cheng
7CMSE201Computational Modeling and Data Analysis ILecture4.00Wait List00811848Regular Academic SessionTue Thu3:00 PM-4:50 PM01/09/2023 - 04/30/2023L Silvestri
8CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00111850Regular Academic SessionMon Wed10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023H Yu
9CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00111850Regular Academic SessionMon Wed10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023H Yu
10CMSE202Computational Modeling and Data Analysis IILecture4.00Open00211851Regular Academic SessionMon Wed3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023T Finzell
11CMSE202Computational Modeling and Data Analysis IILecture4.00Open00211851Regular Academic SessionMon Wed3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023T Finzell
12CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00311852Regular Academic SessionTue Thu3:00 PM-4:50 PM01/09/2023 - 04/30/2023R Frisbie
13CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00411853Regular Academic SessionTue Thu10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023W Kerzendorf
14CMSE202Computational Modeling and Data Analysis IILecture4.00Wait List00411853Regular Academic SessionTue Thu10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM01/09/2023 - 04/30/202301/09/2023 - 04/30/2023W Kerzendorf
15CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00132293Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Chen
16CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00132293Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Chen
17CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00232294Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023S Karnik, L Korreshi
18CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00232294Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023S Karnik, L Korreshi
19CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00332295Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023G Bhusal, E Rapinchuk
20CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00332295Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023G Bhusal, E Rapinchuk
21CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00432296Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Paparizos
22CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00432296Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Paparizos
23CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00535472Regular Academic SessionMon Fri12:40 PM-2:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
24CMSE314Matrix Algebra with Computational Applications...Lecture3.00Wait List00535472Regular Academic SessionMon Fri12:40 PM-2:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
25CMSE314Matrix Algebra with Computational Applications...Lecture3.00Open00635473Regular Academic SessionMon Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
26CMSE314Matrix Algebra with Computational Applications...Lecture3.00Open00635473Regular Academic SessionMon Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023R Sareen, S Tu
27CMSE381Fundamentals of Data Science MethodsCross-ListedLecture4.00Wait List00111854Regular Academic SessionMon Wed Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023Y Xie
28CMSE401Methods for Parallel ComputingLecture4.00Open00132549Regular Academic SessionMon Wed Fri10:20 AM-11:40 AM01/09/2023 - 04/30/2023D Appelo
29CMSE404Introduction to Machine LearningCross-ListedLecture3.00Open00111856Regular Academic SessionTue Thu12:40 PM-2:00 PM01/09/2023 - 04/30/2023P Kordjamshidi
30CMSE492Selected Topics in Data ScienceCross-ListedLecture3.00Wait List00111858Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Murillo
31CMSE495Experiential Learning in Data Science (W)Lecture4.00Wait List00111859Regular Academic SessionMon Wed Fri2:40 PM-4:00 PM01/09/2023 - 04/30/2023D Colbry
32CMSE499Independent Study in Computational Mathematics...Lecture1.00Open00111860Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredTo Be Announced
33CMSE801Introduction to Computational Modeling and Dat...Lecture3.00Open00111861Regular Academic SessionMon Wed8:30 AM-9:50 AM01/09/2023 - 04/30/2023A Bazavov
34CMSE802Methods in Computational ModelingLecture3.00Open00111862Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023R Wang
35CMSE820Mathematical Foundations of Data ScienceLecture3.00Open00132543Regular Academic SessionMon Wed10:20 AM-11:40 AM01/09/2023 - 04/30/2023Y Yang
36CMSE822Parallel ComputingCross-ListedLecture3.00Open00132544Regular Academic SessionTue Thu10:20 AM-11:40 AM01/09/2023 - 04/30/2023S Couch
37CMSE831Computational OptimizationLecture3.00Open00111865Regular Academic SessionMon Wed Fri1:50 PM-2:40 PM01/09/2023 - 04/30/2023L Huang
38CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00111866Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023M Murillo
39CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00211867Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023M Iwen
40CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Open00311868Regular Academic SessionTue Thu8:30 AM-9:50 AM01/09/2023 - 04/30/2023A Christlieb
41CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30111869Dynamic DatedMon Wed3:00 PM-4:50 PM01/11/2023 - 02/08/2023A Black Pyrkosz
42CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30211870Dynamic DatedMon Wed3:00 PM-4:50 PM02/20/2023 - 03/22/2023A Black Pyrkosz
43CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30311871Dynamic DatedTue Thu3:00 PM-4:50 PM01/17/2023 - 02/09/2023A Black Pyrkosz
44CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30411872Dynamic DatedTue Thu3:00 PM-4:50 PM02/21/2023 - 03/23/2023A Black Pyrkosz
45CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30511873Dynamic DatedTue Thu3:00 PM-4:50 PM04/04/2023 - 04/27/2023A Black Pyrkosz
46CMSE890Selected Topics in Computational Mathematics, ...Lecture1.00Open30911874Dynamic DatedMon Wed3:00 PM-4:50 PM04/03/2023 - 04/26/2023A Black Pyrkosz
47CMSE890Selected Topics in Computational Mathematics, ...Lecture3.00Closed73036338Regular Academic SessionMon Wed12:40 PM-2:00 PM01/09/2023 - 04/30/2023Approval RequiredM Murillo
48CMSE891Independent Study in Computational Mathematics...Lecture3.00Wait List00111875Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredA Christlieb, D Colbry
49CMSE891Independent Study in Computational Mathematics...Lecture3.00Wait List00111875Regular Academic SessionTo Be AnnouncedNone01/09/2023 - 04/30/2023Approval RequiredA Christlieb, D Colbry
\n", + "
" + ], + "text/plain": [ + " Subject Course Number Course Name \\\n", + "0 CMSE 180 Introduction to Data ScienceCross-Listed \n", + "1 CMSE 201 Computational Modeling and Data Analysis I \n", + "2 CMSE 201 Computational Modeling and Data Analysis I \n", + "3 CMSE 201 Computational Modeling and Data Analysis I \n", + "4 CMSE 201 Computational Modeling and Data Analysis I \n", + "5 CMSE 201 Computational Modeling and Data Analysis I \n", + "6 CMSE 201 Computational Modeling and Data Analysis I \n", + "7 CMSE 201 Computational Modeling and Data Analysis I \n", + "8 CMSE 202 Computational Modeling and Data Analysis II \n", + "9 CMSE 202 Computational Modeling and Data Analysis II \n", + "10 CMSE 202 Computational Modeling and Data Analysis II \n", + "11 CMSE 202 Computational Modeling and Data Analysis II \n", + "12 CMSE 202 Computational Modeling and Data Analysis II \n", + "13 CMSE 202 Computational Modeling and Data Analysis II \n", + "14 CMSE 202 Computational Modeling and Data Analysis II \n", + "15 CMSE 314 Matrix Algebra with Computational Applications... \n", + "16 CMSE 314 Matrix Algebra with Computational Applications... \n", + "17 CMSE 314 Matrix Algebra with Computational Applications... \n", + "18 CMSE 314 Matrix Algebra with Computational Applications... \n", + "19 CMSE 314 Matrix Algebra with Computational Applications... \n", + "20 CMSE 314 Matrix Algebra with Computational Applications... \n", + "21 CMSE 314 Matrix Algebra with Computational Applications... \n", + "22 CMSE 314 Matrix Algebra with Computational Applications... \n", + "23 CMSE 314 Matrix Algebra with Computational Applications... \n", + "24 CMSE 314 Matrix Algebra with Computational Applications... \n", + "25 CMSE 314 Matrix Algebra with Computational Applications... \n", + "26 CMSE 314 Matrix Algebra with Computational Applications... \n", + "27 CMSE 381 Fundamentals of Data Science MethodsCross-Listed \n", + "28 CMSE 401 Methods for Parallel Computing \n", + "29 CMSE 404 Introduction to Machine LearningCross-Listed \n", + "30 CMSE 492 Selected Topics in Data ScienceCross-Listed \n", + "31 CMSE 495 Experiential Learning in Data Science (W) \n", + "32 CMSE 499 Independent Study in Computational Mathematics... \n", + "33 CMSE 801 Introduction to Computational Modeling and Dat... \n", + "34 CMSE 802 Methods in Computational Modeling \n", + "35 CMSE 820 Mathematical Foundations of Data Science \n", + "36 CMSE 822 Parallel ComputingCross-Listed \n", + "37 CMSE 831 Computational Optimization \n", + "38 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "39 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "40 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "41 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "42 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "43 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "44 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "45 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "46 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "47 CMSE 890 Selected Topics in Computational Mathematics, ... \n", + "48 CMSE 891 Independent Study in Computational Mathematics... \n", + "49 CMSE 891 Independent Study in Computational Mathematics... \n", + "\n", + " Type Units Status Section Class Nbr Academic Session \\\n", + "0 Lecture 4.00 Open 001 36448 Regular Academic Session \n", + "1 Lecture 4.00 Wait List 002 11842 Regular Academic Session \n", + "2 Lecture 4.00 Open 003 11843 Regular Academic Session \n", + "3 Lecture 4.00 Open 004 11844 Regular Academic Session \n", + "4 Lecture 4.00 Open 005 11845 Regular Academic Session \n", + "5 Lecture 4.00 Wait List 006 11846 Regular Academic Session \n", + "6 Lecture 4.00 Open 007 11847 Regular Academic Session \n", + "7 Lecture 4.00 Wait List 008 11848 Regular Academic Session \n", + "8 Lecture 4.00 Wait List 001 11850 Regular Academic Session \n", + "9 Lecture 4.00 Wait List 001 11850 Regular Academic Session \n", + "10 Lecture 4.00 Open 002 11851 Regular Academic Session \n", + "11 Lecture 4.00 Open 002 11851 Regular Academic Session \n", + "12 Lecture 4.00 Wait List 003 11852 Regular Academic Session \n", + "13 Lecture 4.00 Wait List 004 11853 Regular Academic Session \n", + "14 Lecture 4.00 Wait List 004 11853 Regular Academic Session \n", + "15 Lecture 3.00 Wait List 001 32293 Regular Academic Session \n", + "16 Lecture 3.00 Wait List 001 32293 Regular Academic Session \n", + "17 Lecture 3.00 Wait List 002 32294 Regular Academic Session \n", + "18 Lecture 3.00 Wait List 002 32294 Regular Academic Session \n", + "19 Lecture 3.00 Wait List 003 32295 Regular Academic Session \n", + "20 Lecture 3.00 Wait List 003 32295 Regular Academic Session \n", + "21 Lecture 3.00 Wait List 004 32296 Regular Academic Session \n", + "22 Lecture 3.00 Wait List 004 32296 Regular Academic Session \n", + "23 Lecture 3.00 Wait List 005 35472 Regular Academic Session \n", + "24 Lecture 3.00 Wait List 005 35472 Regular Academic Session \n", + "25 Lecture 3.00 Open 006 35473 Regular Academic Session \n", + "26 Lecture 3.00 Open 006 35473 Regular Academic Session \n", + "27 Lecture 4.00 Wait List 001 11854 Regular Academic Session \n", + "28 Lecture 4.00 Open 001 32549 Regular Academic Session \n", + "29 Lecture 3.00 Open 001 11856 Regular Academic Session \n", + "30 Lecture 3.00 Wait List 001 11858 Regular Academic Session \n", + "31 Lecture 4.00 Wait List 001 11859 Regular Academic Session \n", + "32 Lecture 1.00 Open 001 11860 Regular Academic Session \n", + "33 Lecture 3.00 Open 001 11861 Regular Academic Session \n", + "34 Lecture 3.00 Open 001 11862 Regular Academic Session \n", + "35 Lecture 3.00 Open 001 32543 Regular Academic Session \n", + "36 Lecture 3.00 Open 001 32544 Regular Academic Session \n", + "37 Lecture 3.00 Open 001 11865 Regular Academic Session \n", + "38 Lecture 3.00 Open 001 11866 Regular Academic Session \n", + "39 Lecture 3.00 Open 002 11867 Regular Academic Session \n", + "40 Lecture 3.00 Open 003 11868 Regular Academic Session \n", + "41 Lecture 1.00 Open 301 11869 Dynamic Dated \n", + "42 Lecture 1.00 Open 302 11870 Dynamic Dated \n", + "43 Lecture 1.00 Open 303 11871 Dynamic Dated \n", + "44 Lecture 1.00 Open 304 11872 Dynamic Dated \n", + "45 Lecture 1.00 Open 305 11873 Dynamic Dated \n", + "46 Lecture 1.00 Open 309 11874 Dynamic Dated \n", + "47 Lecture 3.00 Closed 730 36338 Regular Academic Session \n", + "48 Lecture 3.00 Wait List 001 11875 Regular Academic Session \n", + "49 Lecture 3.00 Wait List 001 11875 Regular Academic Session \n", + "\n", + " Days Time \\\n", + "0 Mon Wed 10:20 AM-12:10 PM \n", + "1 Mon Wed 10:20 AM-12:10 PM \n", + "2 Mon Wed 12:40 PM-2:30 PM \n", + "3 Mon Wed 3:00 PM-4:50 PM \n", + "4 Tue Thu 8:00 AM-9:50 AM \n", + "5 Tue Thu 10:20 AM-12:10 PM \n", + "6 Tue Thu 12:40 PM-2:30 PM \n", + "7 Tue Thu 3:00 PM-4:50 PM \n", + "8 Mon Wed 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM \n", + "9 Mon Wed 10:20 AM-12:10 PMMon Wed : 10:20 AM-12:10 PM \n", + "10 Mon Wed 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM \n", + "11 Mon Wed 3:00 PM-4:50 PMMon Wed : 3:00 PM-4:50 PM \n", + "12 Tue Thu 3:00 PM-4:50 PM \n", + "13 Tue Thu 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM \n", + "14 Tue Thu 10:20 AM-12:10 PMTue Thu : 10:20 AM-12:10 PM \n", + "15 Tue Thu 10:20 AM-11:40 AM \n", + "16 Tue Thu 10:20 AM-11:40 AM \n", + "17 Tue Thu 12:40 PM-2:00 PM \n", + "18 Tue Thu 12:40 PM-2:00 PM \n", + "19 Mon Wed 10:20 AM-11:40 AM \n", + "20 Mon Wed 10:20 AM-11:40 AM \n", + "21 Mon Wed 12:40 PM-2:00 PM \n", + "22 Mon Wed 12:40 PM-2:00 PM \n", + "23 Mon Fri 12:40 PM-2:00 PM \n", + "24 Mon Fri 12:40 PM-2:00 PM \n", + "25 Mon Fri 2:40 PM-4:00 PM \n", + "26 Mon Fri 2:40 PM-4:00 PM \n", + "27 Mon Wed Fri 2:40 PM-4:00 PM \n", + "28 Mon Wed Fri 10:20 AM-11:40 AM \n", + "29 Tue Thu 12:40 PM-2:00 PM \n", + "30 Mon Wed 12:40 PM-2:00 PM \n", + "31 Mon Wed Fri 2:40 PM-4:00 PM \n", + "32 To Be Announced None \n", + "33 Mon Wed 8:30 AM-9:50 AM \n", + "34 Tue Thu 8:30 AM-9:50 AM \n", + "35 Mon Wed 10:20 AM-11:40 AM \n", + "36 Tue Thu 10:20 AM-11:40 AM \n", + "37 Mon Wed Fri 1:50 PM-2:40 PM \n", + "38 Mon Wed 12:40 PM-2:00 PM \n", + "39 Tue Thu 8:30 AM-9:50 AM \n", + "40 Tue Thu 8:30 AM-9:50 AM \n", + "41 Mon Wed 3:00 PM-4:50 PM \n", + "42 Mon Wed 3:00 PM-4:50 PM \n", + "43 Tue Thu 3:00 PM-4:50 PM \n", + "44 Tue Thu 3:00 PM-4:50 PM \n", + "45 Tue Thu 3:00 PM-4:50 PM \n", + "46 Mon Wed 3:00 PM-4:50 PM \n", + "47 Mon Wed 12:40 PM-2:00 PM \n", + "48 To Be Announced None \n", + "49 To Be Announced None \n", + "\n", + " Dates Instructor \n", + "0 01/09/2023 - 04/30/2023 D Caballero \n", + "1 01/09/2023 - 04/30/2023 D Silvia \n", + "2 01/09/2023 - 04/30/2023 H Lei \n", + "3 01/09/2023 - 04/30/2023 P Hamerski \n", + "4 01/09/2023 - 04/30/2023 L Silvestri \n", + "5 01/09/2023 - 04/30/2023 S Ravishankar \n", + "6 01/09/2023 - 04/30/2023 Y Cheng \n", + "7 01/09/2023 - 04/30/2023 L Silvestri \n", + "8 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 H Yu \n", + "9 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 H Yu \n", + "10 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 T Finzell \n", + "11 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 T Finzell \n", + "12 01/09/2023 - 04/30/2023 R Frisbie \n", + "13 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 W Kerzendorf \n", + "14 01/09/2023 - 04/30/202301/09/2023 - 04/30/2023 W Kerzendorf \n", + "15 01/09/2023 - 04/30/2023 D Chen \n", + "16 01/09/2023 - 04/30/2023 D Chen \n", + "17 01/09/2023 - 04/30/2023 S Karnik, L Korreshi \n", + "18 01/09/2023 - 04/30/2023 S Karnik, L Korreshi \n", + "19 01/09/2023 - 04/30/2023 G Bhusal, E Rapinchuk \n", + "20 01/09/2023 - 04/30/2023 G Bhusal, E Rapinchuk \n", + "21 01/09/2023 - 04/30/2023 M Paparizos \n", + "22 01/09/2023 - 04/30/2023 M Paparizos \n", + "23 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "24 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "25 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "26 01/09/2023 - 04/30/2023 R Sareen, S Tu \n", + "27 01/09/2023 - 04/30/2023 Y Xie \n", + "28 01/09/2023 - 04/30/2023 D Appelo \n", + "29 01/09/2023 - 04/30/2023 P Kordjamshidi \n", + "30 01/09/2023 - 04/30/2023 M Murillo \n", + "31 01/09/2023 - 04/30/2023 D Colbry \n", + "32 01/09/2023 - 04/30/2023Approval Required To Be Announced \n", + "33 01/09/2023 - 04/30/2023 A Bazavov \n", + "34 01/09/2023 - 04/30/2023 R Wang \n", + "35 01/09/2023 - 04/30/2023 Y Yang \n", + "36 01/09/2023 - 04/30/2023 S Couch \n", + "37 01/09/2023 - 04/30/2023 L Huang \n", + "38 01/09/2023 - 04/30/2023 M Murillo \n", + "39 01/09/2023 - 04/30/2023 M Iwen \n", + "40 01/09/2023 - 04/30/2023 A Christlieb \n", + "41 01/11/2023 - 02/08/2023 A Black Pyrkosz \n", + "42 02/20/2023 - 03/22/2023 A Black Pyrkosz \n", + "43 01/17/2023 - 02/09/2023 A Black Pyrkosz \n", + "44 02/21/2023 - 03/23/2023 A Black Pyrkosz \n", + "45 04/04/2023 - 04/27/2023 A Black Pyrkosz \n", + "46 04/03/2023 - 04/26/2023 A Black Pyrkosz \n", + "47 01/09/2023 - 04/30/2023Approval Required M Murillo \n", + "48 01/09/2023 - 04/30/2023Approval Required A Christlieb, D Colbry \n", + "49 01/09/2023 - 04/30/2023Approval Required A Christlieb, D Colbry " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "element = driver.find_element(By.ID, \"DESCR100$0_row_1\") #testing on a single class\n", + "element.click()\n", + "time.sleep(20)\n", + "#cancel_cmd=\"javascript:doUpdateParent(document.win0,'#ICCancel');\"\n", + "#driver.execute_script(cancel_cmd);\n", + "#body = driver.page_source\n", + "soup = BeautifulSoup(body, 'html.parser')\n", + "df = get_class_info(soup)\n", + "df" + ] + }, + { + "cell_type": "markdown", + "id": "c0e8323d-3275-4bc9-a60c-a0f4d2c5664f", + "metadata": {}, + "source": [ + "# Other Userful Commands" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "f019b58d-4f96-47ac-81d2-ed32f4976ac9", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "#departments = element.text.split('\\n')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03f4a3c9-cfb3-48da-af6e-ec029aec0054", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..3852f42 Binary files /dev/null and b/environment.yml differ diff --git a/noaa_scraper.py b/noaa_scraper.py deleted file mode 100644 index 146bf5f..0000000 --- a/noaa_scraper.py +++ /dev/null @@ -1,162 +0,0 @@ -#link to libraries neede by this notebook -import os -import numpy as np - -from html.parser import HTMLParser -from urllib import parse -from urllib.request import urlopen -from urllib.request import urlretrieve - -#following are needed for the progress bar -from ipywidgets import FloatProgress -from IPython.display import display - -#use glob to download filenames from a directoery -from glob import glob - -# We are going to create a class called LinkParser that inherits some -# methods from HTMLParser which is why it is passed into the definition -class LinkParser(HTMLParser): - - # This is a function that HTMLParser normally has - # but we are adding some functionality to it - def handle_starttag(self, tag, attrs): - # We are looking for the begining of a link. Links normally look - # like
- if tag == 'a': - for (key, value) in attrs: - if key == 'href': - # We are grabbing the new URL. We are also adding the - # base URL to it. For example: - # www.netinstructions.com is the base and - # somepage.html is the new URL (a relative URL) - # - # We combine a relative URL with the base URL to create - # an absolute URL like: - # www.netinstructions.com/somepage.html - newUrl = parse.urljoin(self.baseUrl, value) - # And add it to our colection of links: - self.links = self.links + [newUrl] - - # This is a new function that we are creating to get links - # that our spider() function will call - def getLinks(self, url): - self.links = [] - # Remember the base URL which will be important when creating - # absolute URLs - self.baseUrl = url - # Use the urlopen function from the standard Python 3 library - response = urlopen(url) - # Make sure that we are looking at HTML and not other things that - # are floating around on the internet (such as - # JavaScript files, CSS, or .PDFs for example) - if 'text/html' in response.getheader('Content-Type'): - htmlBytes = response.read() - # Note that feed() handles Strings well, but not bytes - # (A change from Python 2.x to Python 3.x) - htmlString = htmlBytes.decode("utf-8") - self.feed(htmlString) - return '',self.links #htmlString, self.links - if 'text/plain' in response.getheader('Content-Type'): - return url,[] - else: - return "",[] - -# And finally here is our spider. It takes in an URL, a word to find, -# and the number of pages to search through before giving up -def noaa_spider(url, word, maxPages): - if not os.path.isdir('data'): - os.mkdir('data') - - pagesToVisit = [url] - textfiles = []; - numberVisited = 0 - foundWord = False - urlsVisited = set() - foundFiles = set() - - progressBar = FloatProgress(min=0, max=maxPages) - display(progressBar) - progressBar.value = 0 - - # The main loop. Create a LinkParser and get all the links on the page. - # Also search the page for the word or string - # In our getLinks function we return the web page - # (this is useful for searching for the word) - # and we return a set of links from that web page - # (this is useful for where to go next) - while numberVisited < maxPages and pagesToVisit != [] and not foundWord: - - # Start from the beginning of our collection of pages to visit: - url = pagesToVisit[0] - - pagesToVisit = pagesToVisit[1:] - #try: - #print(numberVisited, "Visiting:", url) - parser = LinkParser() - - if url not in urlsVisited: - urlsVisited.add(url) - if '.txt' in url: - if word in url: - textfiles = textfiles + [url] - foundFiles.add(url) - print("FOUND ", url) - name='./data/'+url.split('/')[-1] - - if not os.path.isfile(name): - print('downloading...',name) - urlretrieve(url,name) - else: - print('file exists...',name) - else: - numberVisited = numberVisited +1 - progressBar.value = numberVisited - data, links = parser.getLinks(url) - # Add the pages that we visited to the end of our collection - # of pages to visit: - pagesToVisit = pagesToVisit + links - return foundFiles - -def read_data_column(filename, col=8): - f = open(filename, 'r') - filename - air_temperature = [] - for row in f: - data = row.split() - temp = float(data[col]) - if(temp < -9000): # Check for valid data - #print('IsNan') - if(air_temperature == []): # First point in serise - temp = 0 - else: - temp=air_temperature[-1] #Repeat previous data point - else: - temp = temp*9.0/5.0+32 - if(temp != []): - air_temperature.append(temp) - f.close() - return air_temperature - -def get_airtemperature_from_files(): - #Read all Tif images in current directory - - files = glob('./data/*.txt'); - files.sort(); - progressBar = FloatProgress(min=0, max=len(files)) - display(progressBar) - progressBar.value = 0 - air_temperature = [] - for filename in files: - progressBar.value = progressBar.value + 1 - print('reading...',filename) - air_temperature = air_temperature + read_data_column(filename) - - return air_temperature - -def get_noaa_temperatures(url, name, maxdepth=100): - #Now call the main noaa_spider function and search for the word hpc - files = noaa_spider(url, name, 100) - return get_airtemperature_from_files() - -print(f"running as {__name__}")