{ "cells": [ { "cell_type": "markdown", "id": "8eb35a9b", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "
\n", "

Geospatial Data Science Applications: GEOG 4/590

\n", "

Feb 14, 2022

\n", "

Lecture 7: Data access

\n", " \n", "

Johnny Ryan: jryan4@uoregon.edu

\n", "
" ] }, { "cell_type": "markdown", "id": "2dcf3075", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Content of this lecture\n", "\n", "* Web2.0\n", "
\n", "
\n", "* Standard data access using APIs\n", "
\n", "
\n", "* What to do when an API is unavailable or insufficient?\n", "
\n", "
\n", "* Background for this week's lab" ] }, { "cell_type": "code", "execution_count": 1, "id": "fc353821", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/envs/clouds/lib/python3.8/site-packages/IPython/core/display.py:724: UserWarning: Consider using IPython.display.IFrame instead\n", " warnings.warn(\"Consider using IPython.display.IFrame instead\")\n" ] }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import HTML\n", "HTML('')" ] }, { "cell_type": "markdown", "id": "342f1c02", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## APIs\n", "\n", "\n", "* Application programming interface\n", "\n", "\n", "* A type of **software** that provides a **standard set of protocols/functions** so that our computer can **communicate** with other computers\n", "\n", "\n", "* In contrast, a **user interface** is a type of software that connects a **computer** to a **person**" ] }, { "cell_type": "markdown", "id": "c1f6a26e", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## APIs\n", "\n", "* Many organizations have great APIs because they want people to use their data\n", "\n", "\n", "* We have used one..." ] }, { "cell_type": "markdown", "id": "93aa0c27", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* `cenpy`" ] }, { "cell_type": "markdown", "id": "313a8899", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "code", "execution_count": 2, "id": "a651a3b1", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting dataretrieval\n", " Downloading dataretrieval-0.7-py3-none-any.whl (16 kB)\n", "Requirement already satisfied: requests in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from dataretrieval) (2.27.1)\n", "Requirement already satisfied: pandas in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from dataretrieval) (1.4.0)\n", "Requirement already satisfied: python-dateutil>=2.8.1 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from pandas->dataretrieval) (2.8.2)\n", "Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from pandas->dataretrieval) (2021.3)\n", "Requirement already satisfied: numpy>=1.21.0 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from pandas->dataretrieval) (1.22.1)\n", "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->dataretrieval) (3.3)\n", "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->dataretrieval) (2.0.11)\n", "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->dataretrieval) (2021.10.8)\n", "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->dataretrieval) (1.26.8)\n", "Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from python-dateutil>=2.8.1->pandas->dataretrieval) (1.16.0)\n", "Installing collected packages: dataretrieval\n", "Successfully installed dataretrieval-0.7\n" ] } ], "source": [ "# Install package\n", "!pip install -U dataretrieval" ] }, { "cell_type": "markdown", "id": "7c1e3398", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "code", "execution_count": 3, "id": "763f3c4e", "metadata": { "slideshow": { "slide_type": "subslide" } }, "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", "
00010_Mean00010_Mean_cdsite_no00060_Mean00060_Mean_cd00065_Mean00065_Mean_cd00095_Mean00095_Mean_cd00300_Minimum...63680_ysi_Mean63680_ysi_Mean_cd91049_Mean91049_Mean_cd99133_Maximum99133_Maximum_cd99133_Minimum99133_Minimum_cd99133_Mean99133_Mean_cd
datetime
2020-10-01 00:00:00+00:0014.9A0333900075.7A2.04A672.0A8.9...3.7A1510.0P4.1A3.3A3.7A
2020-10-02 00:00:00+00:0014.5A0333900066.0A1.99A678.0A9.2...3.6A1450.0P4.2A3.8A4.1A
2020-10-03 00:00:00+00:0014.2A0333900060.2A1.96A678.0A9.4...3.2A1110.0P3.8A3.0A3.4A
2020-10-04 00:00:00+00:0014.4A0333900068.8A2.01A705.0A9.1...3.3A1030.0P3.0A2.6A2.8A
2020-10-05 00:00:00+00:0013.4A0333900066.8A1.99A718.0A9.6...3.1A1080.0P3.4A2.7A3.0A
..................................................................
2021-09-26 00:00:00+00:0018.7A03339000174.0A2.52A571.0ANaN...12.6A2080.0P2.5A2.1A2.2A
2021-09-27 00:00:00+00:0020.2A03339000155.0A2.46A578.0ANaN...11.7A2050.0P2.6A2.2A2.4A
2021-09-28 00:00:00+00:0021.6A03339000132.0P2.37P587.0ANaN...10.7A1600.0P2.4A2.1A2.2A
2021-09-29 00:00:00+00:0022.3A03339000117.0P2.31P614.0ANaN...9.8A1430.0P2.4A2.2A2.3A
2021-09-30 00:00:00+00:0022.6A03339000111.0P2.28P628.0ANaN...8.6A1290.0P2.2A2.1A2.2A
\n", "

365 rows × 41 columns

\n", "
" ], "text/plain": [ " 00010_Mean 00010_Mean_cd site_no 00060_Mean \\\n", "datetime \n", "2020-10-01 00:00:00+00:00 14.9 A 03339000 75.7 \n", "2020-10-02 00:00:00+00:00 14.5 A 03339000 66.0 \n", "2020-10-03 00:00:00+00:00 14.2 A 03339000 60.2 \n", "2020-10-04 00:00:00+00:00 14.4 A 03339000 68.8 \n", "2020-10-05 00:00:00+00:00 13.4 A 03339000 66.8 \n", "... ... ... ... ... \n", "2021-09-26 00:00:00+00:00 18.7 A 03339000 174.0 \n", "2021-09-27 00:00:00+00:00 20.2 A 03339000 155.0 \n", "2021-09-28 00:00:00+00:00 21.6 A 03339000 132.0 \n", "2021-09-29 00:00:00+00:00 22.3 A 03339000 117.0 \n", "2021-09-30 00:00:00+00:00 22.6 A 03339000 111.0 \n", "\n", " 00060_Mean_cd 00065_Mean 00065_Mean_cd 00095_Mean \\\n", "datetime \n", "2020-10-01 00:00:00+00:00 A 2.04 A 672.0 \n", "2020-10-02 00:00:00+00:00 A 1.99 A 678.0 \n", "2020-10-03 00:00:00+00:00 A 1.96 A 678.0 \n", "2020-10-04 00:00:00+00:00 A 2.01 A 705.0 \n", "2020-10-05 00:00:00+00:00 A 1.99 A 718.0 \n", "... ... ... ... ... \n", "2021-09-26 00:00:00+00:00 A 2.52 A 571.0 \n", "2021-09-27 00:00:00+00:00 A 2.46 A 578.0 \n", "2021-09-28 00:00:00+00:00 P 2.37 P 587.0 \n", "2021-09-29 00:00:00+00:00 P 2.31 P 614.0 \n", "2021-09-30 00:00:00+00:00 P 2.28 P 628.0 \n", "\n", " 00095_Mean_cd 00300_Minimum ... 63680_ysi_Mean \\\n", "datetime ... \n", "2020-10-01 00:00:00+00:00 A 8.9 ... 3.7 \n", "2020-10-02 00:00:00+00:00 A 9.2 ... 3.6 \n", "2020-10-03 00:00:00+00:00 A 9.4 ... 3.2 \n", "2020-10-04 00:00:00+00:00 A 9.1 ... 3.3 \n", "2020-10-05 00:00:00+00:00 A 9.6 ... 3.1 \n", "... ... ... ... ... \n", "2021-09-26 00:00:00+00:00 A NaN ... 12.6 \n", "2021-09-27 00:00:00+00:00 A NaN ... 11.7 \n", "2021-09-28 00:00:00+00:00 A NaN ... 10.7 \n", "2021-09-29 00:00:00+00:00 A NaN ... 9.8 \n", "2021-09-30 00:00:00+00:00 A NaN ... 8.6 \n", "\n", " 63680_ysi_Mean_cd 91049_Mean 91049_Mean_cd \\\n", "datetime \n", "2020-10-01 00:00:00+00:00 A 1510.0 P \n", "2020-10-02 00:00:00+00:00 A 1450.0 P \n", "2020-10-03 00:00:00+00:00 A 1110.0 P \n", "2020-10-04 00:00:00+00:00 A 1030.0 P \n", "2020-10-05 00:00:00+00:00 A 1080.0 P \n", "... ... ... ... \n", "2021-09-26 00:00:00+00:00 A 2080.0 P \n", "2021-09-27 00:00:00+00:00 A 2050.0 P \n", "2021-09-28 00:00:00+00:00 A 1600.0 P \n", "2021-09-29 00:00:00+00:00 A 1430.0 P \n", "2021-09-30 00:00:00+00:00 A 1290.0 P \n", "\n", " 99133_Maximum 99133_Maximum_cd 99133_Minimum \\\n", "datetime \n", "2020-10-01 00:00:00+00:00 4.1 A 3.3 \n", "2020-10-02 00:00:00+00:00 4.2 A 3.8 \n", "2020-10-03 00:00:00+00:00 3.8 A 3.0 \n", "2020-10-04 00:00:00+00:00 3.0 A 2.6 \n", "2020-10-05 00:00:00+00:00 3.4 A 2.7 \n", "... ... ... ... \n", "2021-09-26 00:00:00+00:00 2.5 A 2.1 \n", "2021-09-27 00:00:00+00:00 2.6 A 2.2 \n", "2021-09-28 00:00:00+00:00 2.4 A 2.1 \n", "2021-09-29 00:00:00+00:00 2.4 A 2.2 \n", "2021-09-30 00:00:00+00:00 2.2 A 2.1 \n", "\n", " 99133_Minimum_cd 99133_Mean 99133_Mean_cd \n", "datetime \n", "2020-10-01 00:00:00+00:00 A 3.7 A \n", "2020-10-02 00:00:00+00:00 A 4.1 A \n", "2020-10-03 00:00:00+00:00 A 3.4 A \n", "2020-10-04 00:00:00+00:00 A 2.8 A \n", "2020-10-05 00:00:00+00:00 A 3.0 A \n", "... ... ... ... \n", "2021-09-26 00:00:00+00:00 A 2.2 A \n", "2021-09-27 00:00:00+00:00 A 2.4 A \n", "2021-09-28 00:00:00+00:00 A 2.2 A \n", "2021-09-29 00:00:00+00:00 A 2.3 A \n", "2021-09-30 00:00:00+00:00 A 2.2 A \n", "\n", "[365 rows x 41 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Import the functions for downloading data from NWIS\n", "import dataretrieval.nwis as nwis\n", "\n", "# Specify the USGS site code\n", "site = '03339000'\n", "\n", "# Get instantaneous values (iv)\n", "df = nwis.get_record(sites=site, service='dv', start='2020-10-01', end='2021-09-30')\n", "df" ] }, { "cell_type": "code", "execution_count": 4, "id": "403bc607", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Simple plot\n", "df['00060_Mean'].plot()" ] }, { "cell_type": "markdown", "id": "76fd0a76", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Tips for APIs\n", "\n", "* Take a minute to make sure that package is used (e.g. lots of forks, stars) and up-to-date (e.g. last commit)\n", "\n", "\n", "* Read the `docs`, `demos`, `examples` and hope we find what we're looking for (sometimes they are not that comprehensive)\n", "\n", "\n", "* If you can't find what you're looking for, inspect the source code (`.py` files)" ] }, { "cell_type": "markdown", "id": "82cfcbcb", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## APIs are sometimes not available or have limitations" ] }, { "cell_type": "markdown", "id": "fcc43b60", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "e901f5e7", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "168a96f9", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "28aa4bc1", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "* These companies hoard data to secure market dominance\n", "\n", "\n", "* Without access to their data it is difficult to tell whether they are in compliance\n", "\n", "\n", "* By guarding data, they are also preventing it being used for good (maybe bad) causes " ] }, { "cell_type": "markdown", "id": "43c30376", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "cda5036a", "metadata": { "slideshow": { "slide_type": "notes" } }, "source": [ "Facebook loophole that allowed third-party apps to access not only user profile data but profile data of all friends. Kogan copied someone else's idea and made \"thisisyourdigitallife\". Only 270K used it but collected data from all friends of users (50+ million FB profiles)." ] }, { "cell_type": "markdown", "id": "f3a52f03", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Web scraping\n", "\n", "* Also known as crawling or harvesting is the practice of **automatically** gathering data from the internet without the use of an **API**\n", "\n", "\n", "* Most commonly accomplished by writing a program that **queries** a web server, **requests** data (usually in the form of HTML), and **parses** that data to extract information" ] }, { "cell_type": "markdown", "id": "1e73bfce", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "febe8c0a", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "6df2f7a2", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Suppose a friend wanted to do this?\n" ] }, { "cell_type": "markdown", "id": "6448f379", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "* Some HTML basics\n", "\n", "\n", "* `requests`: standard Python library for requesting data from the web\n", "\n", "\n", "* `BeautifulSoup`: a library for pulling data out of HTML and XML files\n", "\n", "\n", "* `selenium`: is a library for performing **web browser automation**" ] }, { "cell_type": "markdown", "id": "456b34ee", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "c1695f1e", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "\n", "

Geospatial Data Science Applications: GEOG 4/590

\n", "

Feb 14, 2022

\n", "

Lecture 7: Data access

\n", " \n", "

Johnny Ryan: jryan4@uoregon.edu

\n", "" ] }, { "cell_type": "markdown", "id": "07ea8eee", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### `requests`" ] }, { "cell_type": "code", "execution_count": 2, "id": "4bab7f39", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Import packages\n", "import requests " ] }, { "cell_type": "code", "execution_count": 7, "id": "0e473efe", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Open a webpage\n", "html = requests.get('https://en.wikipedia.org/wiki/Climate_of_Oregon')\n", "\n", "# HTML\n", "html" ] }, { "cell_type": "markdown", "id": "69a823b5", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "e8f8f911", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "3927ea93", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## BeautifulSoup4\n", "\n", "* Now we could write a program to **parse** this HTML code (i.e. split into useful blocks)... \n", "\n", "\n", "* ...or we could use another package called `BeautifulSoup` (also known as `bs4`) a Python library for parsing data out of HTML and XML files\n", "\n", "" ] }, { "cell_type": "markdown", "id": "aa1f76f0", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Import packages" ] }, { "cell_type": "code", "execution_count": 9, "id": "f5ba032c", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Import package\n", "from bs4 import BeautifulSoup, SoupStrainer" ] }, { "cell_type": "code", "execution_count": 20, "id": "85c4967c", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "source": [ "# Read HTML content as \"soup object\" and define default parser\n", "soup = BeautifulSoup(html.text, 'html.parser')" ] }, { "cell_type": "markdown", "id": "bf376a8c", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Parse HTML using \n", "\n", "The `.find` and `.find_all` are the most common methods we will use. They can be used to filter HTML code to find a list of tags or tags with specific attributes. " ] }, { "cell_type": "code", "execution_count": 24, "id": "ee77656d", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "h1 -> Climate of Oregon\n", "h2 -> Contents\n", "h2 -> Precipitation[edit]\n", "h2 -> Temperature[edit]\n", "h2 -> Selected climate charts[edit]\n", "h2 -> See also[edit]\n", "h2 -> References[edit]\n", "h2 -> Navigation menu\n" ] } ], "source": [ "# Define heading tags\n", "heading_tags = [\"h1\", \"h2\"]\n", "\n", "# Find heading tags in HTML code\n", "headings = soup.find_all(heading_tags)\n", "\n", "# Loop over every heading and print text\n", "for tags in headings:\n", " print(tags.name + ' -> ' + tags.text.strip())" ] }, { "cell_type": "code", "execution_count": 31, "id": "3ba9c6d8", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "#mw-head\n", "#searchInput\n", "/wiki/File:Oregon_K%C3%B6ppen.svg\n", "/wiki/File:Oregon_K%C3%B6ppen.svg\n", "/wiki/K%C3%B6ppen_climate_classification\n", "/wiki/Oregon\n", "/wiki/File:OR_trewartha.svg\n", "/wiki/File:OR_trewartha.svg\n", "/wiki/Trewartha_climate_classification\n", "/wiki/K%C3%B6ppen_climate_classification\n", "/wiki/Western_Oregon\n", "/wiki/Warm-summer_mediterranean_climate\n", "/wiki/Eastern_Oregon\n", "/wiki/Cold_semi-arid_climate\n", "/wiki/Cascade_Range\n", "/wiki/Arctic\n", "/wiki/Cold_waves\n", "#cite_note-1\n", "#Precipitation\n", "#Snow\n", "#Temperature\n", "#Selected_climate_charts\n", "#See_also\n", "#References\n", "#Works_cited\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=1\n", "/wiki/File:Oregon_Average_Annual_Precipitation_(1961-1990)_Map.png\n", "/wiki/File:Oregon_Average_Annual_Precipitation_(1961-1990)_Map.png\n", "/wiki/Precipitation_(meteorology)\n", "/wiki/Alvord_Desert\n", "/wiki/Rain_shadow\n", "/wiki/Steens_Mountain\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001154–55-2\n", "#cite_note-WRCC-3\n", "/wiki/Oregon_Coast_Range\n", "/wiki/Condensation\n", "/wiki/Orographic_precipitation\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001154–55-2\n", "/wiki/Willamette_Valley\n", "/wiki/Cascade_Range\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001154–55-2\n", "/wiki/Mount_Hood\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001130–31-4\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001154–55-2\n", "/wiki/Semi-arid_climate\n", "/wiki/Blue_Mountains_(Pacific_Northwest)\n", "/wiki/Wallowa_Mountains\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001154–55-2\n", "/wiki/Jet_stream\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001156–57-5\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=2\n", "/wiki/File:Wintersports_terrain_park_P1391.jpeg\n", "/wiki/File:Wintersports_terrain_park_P1391.jpeg\n", "/wiki/Cascade_Range\n", "/wiki/Snowfall\n", "#cite_note-WRCC-3\n", "/wiki/Crater_Lake\n", "#cite_note-FOOTNOTETaylorHannan1999xii-6\n", "#cite_note-WRCC-3\n", "/wiki/Glacier\n", "#cite_note-WRCC-3\n", "/wiki/Snake_River\n", "#cite_note-WRCC-3\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=3\n", "/wiki/File:Oregon_High_Desert.jpg\n", "/wiki/File:Oregon_High_Desert.jpg\n", "/wiki/High_Desert_(Oregon)\n", "/wiki/Columbia_Gorge\n", "#cite_note-FOOTNOTEAllanBuckleyMeacham2001158–59-7\n", "#cite_note-WRCC-3\n", "/wiki/Hermiston,_Oregon\n", "/wiki/Redmond,_Oregon\n", "#cite_note-FOOTNOTETaylorHannan1999xii-6\n", "/wiki/Ukiah,_Oregon\n", "/wiki/Seneca,_Oregon\n", "#cite_note-FOOTNOTETaylorHannan1999xii-6\n", "/wiki/Willamette_Valley\n", "#cite_note-8\n", "/wiki/Jackson_County,_Oregon\n", "#cite_note-9\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=4\n", "/wiki/File:USA_Oregon_relief_location_map.svg\n", "/wiki/Astoria,_Oregon\n", "/wiki/Bend,_Oregon\n", "/wiki/Brookings,_Oregon\n", "/wiki/Burns,_Oregon\n", "/wiki/Eugene,_Oregon\n", "/wiki/Medford,_Oregon\n", "/wiki/Newport,_Oregon\n", "/wiki/Ontario,_Oregon\n", "/wiki/Pendleton,_Oregon\n", "/wiki/Portland,_Oregon\n", "/wiki/File:USA_Oregon_relief_location_map.svg\n", "/wiki/Astoria,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Bend,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Brookings,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Burns,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Eugene,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Medford,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Newport,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Ontario,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Pendleton,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/wiki/Portland,_Oregon\n", "/wiki/Template:Climate_chart/How_to_read_a_climate_chart\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=5\n", "/wiki/Climate_of_the_United_States\n", "/wiki/Climate_change_in_Oregon\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=6\n", "#cite_ref-1\n", "https://web.archive.org/web/20090531012223/http://www.geog.nau.edu/courses/alew/ggr346/text/chapters/ch10.html\n", "/wiki/Northern_Arizona_University\n", "http://www.geog.nau.edu/courses/alew/ggr346/text/chapters/ch10.html\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001154–55_2-0\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001154–55_2-1\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001154–55_2-2\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001154–55_2-3\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001154–55_2-4\n", "#CITEREFAllanBuckleyMeacham2001\n", "#cite_ref-WRCC_3-0\n", "#cite_ref-WRCC_3-1\n", "#cite_ref-WRCC_3-2\n", "#cite_ref-WRCC_3-3\n", "#cite_ref-WRCC_3-4\n", "#cite_ref-WRCC_3-5\n", "http://www.wrcc.dri.edu/narratives/OREGON.htm\n", "/wiki/Desert_Research_Institute\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001130–31_4-0\n", "#CITEREFAllanBuckleyMeacham2001\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001156–57_5-0\n", "#CITEREFAllanBuckleyMeacham2001\n", "#cite_ref-FOOTNOTETaylorHannan1999xii_6-0\n", "#cite_ref-FOOTNOTETaylorHannan1999xii_6-1\n", "#cite_ref-FOOTNOTETaylorHannan1999xii_6-2\n", "#CITEREFTaylorHannan1999\n", "#cite_ref-FOOTNOTEAllanBuckleyMeacham2001158–59_7-0\n", "#CITEREFAllanBuckleyMeacham2001\n", "#cite_ref-8\n", "https://web.archive.org/web/20100624153919/http://www.ocs.orst.edu/county_climate/Multnomah_files/Multnomah.html\n", "/wiki/Oregon_State_University\n", "http://www.ocs.orst.edu/county_climate/Multnomah_files/Multnomah.html\n", "/wiki/Template:Cite_web\n", "/wiki/Category:CS1_maint:_multiple_names:_authors_list\n", "#cite_ref-9\n", "https://web.archive.org/web/20100304143656/http://www.ocs.oregonstate.edu/county_climate/Jackson_files/Jackson.html\n", "/wiki/Oregon_State_University\n", "http://ocs.oregonstate.edu/county_climate/Jackson_files/Jackson.html\n", "/wiki/Template:Cite_web\n", "/wiki/Category:CS1_maint:_multiple_names:_authors_list\n", "/w/index.php?title=Climate_of_Oregon&action=edit§ion=7\n", "/wiki/ISBN_(identifier)\n", "/wiki/Special:BookSources/0-87114-101-9\n", "/wiki/ISBN_(identifier)\n", "/wiki/Special:BookSources/978-0-87071-468-9\n", "/wiki/Template:Oregon\n", "/wiki/Template_talk:Oregon\n", "https://en.wikipedia.org/w/index.php?title=Template:Oregon&action=edit\n", "/wiki/U.S._state\n", "/wiki/Oregon\n", "/wiki/Salem,_Oregon\n", "/wiki/Lists_of_Oregon-related_topics\n", "/wiki/Index_of_Oregon-related_articles\n", "/wiki/Outline_of_Oregon\n", "None\n", "/wiki/Oregon#Geography\n", "/wiki/Fauna_of_Oregon\n", "/wiki/List_of_beaches_in_Oregon\n", "/wiki/List_of_lakes_of_Oregon\n", "/wiki/List_of_rivers_of_Oregon\n", "/wiki/Government_of_Oregon\n", "/wiki/Constitution_of_Oregon\n", "/wiki/United_States_congressional_delegations_from_Oregon\n", "/wiki/List_of_Oregon_ballot_measures\n", "/wiki/Elections_in_Oregon\n", "/wiki/Governor_of_Oregon\n", "/wiki/List_of_governors_of_Oregon\n", "/wiki/History_of_Oregon\n", "/wiki/Bibliography_of_Oregon_history\n", "/wiki/Oregon_Trail\n", "/wiki/List_of_Oregon_state_parks\n", "/wiki/List_of_people_from_Oregon\n", "/wiki/Oregon_pioneer_history\n", "/wiki/Oregon_State_Fair\n", "/wiki/List_of_Oregon_state_symbols\n", "/wiki/Culture_of_Oregon\n", "/wiki/Crime_in_Oregon\n", "/wiki/Oregon#Demographics\n", "/wiki/Economy_of_Oregon\n", "/wiki/Oregon#Education\n", "/wiki/Gambling_in_Oregon\n", "/wiki/Politics_of_Oregon\n", "/wiki/List_of_regions_of_Oregon\n", "/wiki/Western_Oregon\n", "/wiki/Northwest_Oregon\n", "/wiki/Oregon_Coast\n", "/wiki/Portland_metropolitan_area,_Oregon\n", "/wiki/Tualatin_Valley\n", "/wiki/Willamette_Valley\n", "/wiki/Eastern_Oregon\n", "/wiki/Harney_Basin\n", "/wiki/High_Desert_(Oregon)\n", "/wiki/Palouse\n", "/wiki/Treasure_Valley\n", "/wiki/Central_Oregon\n", "/wiki/Southern_Oregon\n", "/wiki/Rogue_Valley\n", "/wiki/Cascade_Range\n", "/wiki/Columbia_River_Gorge\n", "/wiki/Columbia_River\n", "/wiki/Columbia_Plateau\n", "/wiki/Great_Basin\n", "/wiki/Mount_Hood_Corridor\n", "/wiki/Trout_Creek_Mountains\n", "/wiki/Oregon_statistical_areas\n", "/wiki/Albany%E2%80%93Corvallis%E2%80%93Lebanon_combined_statistical_area\n", "/wiki/Bend%E2%80%93Prineville_combined_statistical_area\n", "/wiki/Eugene,_Oregon\n", "/wiki/Springfield,_Oregon\n", "/wiki/Medford,_Oregon\n", "/wiki/Ashland,_Oregon\n", "/wiki/Portland_metropolitan_area,_Oregon\n", "/wiki/Salem_Metropolitan_Statistical_Area\n", "/wiki/List_of_cities_in_Oregon\n", "/wiki/Portland,_Oregon\n", "/wiki/Salem,_Oregon\n", "/wiki/Eugene,_Oregon\n", "/wiki/Gresham,_Oregon\n", "/wiki/Hillsboro,_Oregon\n", "/wiki/Beaverton,_Oregon\n", "/wiki/Bend,_Oregon\n", "/wiki/Medford,_Oregon\n", "/wiki/Springfield,_Oregon\n", "/wiki/Corvallis,_Oregon\n", "/wiki/Albany,_Oregon\n", "/wiki/Tigard,_Oregon\n", "/wiki/Lake_Oswego,_Oregon\n", "/wiki/Keizer,_Oregon\n", "/wiki/Grants_Pass,_Oregon\n", "/wiki/Oregon_City,_Oregon\n", "/wiki/McMinnville,_Oregon\n", "/wiki/Redmond,_Oregon\n", "/wiki/Tualatin,_Oregon\n", "/wiki/West_Linn,_Oregon\n", "/wiki/Woodburn,_Oregon\n", "/wiki/Forest_Grove,_Oregon\n", "/wiki/Newberg,_Oregon\n", "/wiki/Wilsonville,_Oregon\n", "/wiki/Roseburg,_Oregon\n", "/wiki/Klamath_Falls,_Oregon\n", "/wiki/Ashland,_Oregon\n", "/wiki/Milwaukie,_Oregon\n", "/wiki/Sherwood,_Oregon\n", "/wiki/Happy_Valley,_Oregon\n", "/wiki/Central_Point,_Oregon\n", "/wiki/Canby,_Oregon\n", "/wiki/Hermiston,_Oregon\n", "/wiki/Pendleton,_Oregon\n", "/wiki/List_of_counties_in_Oregon\n", "/wiki/Baker_County,_Oregon\n", "/wiki/Benton_County,_Oregon\n", "/wiki/Clackamas_County,_Oregon\n", "/wiki/Clatsop_County,_Oregon\n", "/wiki/Columbia_County,_Oregon\n", "/wiki/Coos_County,_Oregon\n", "/wiki/Crook_County,_Oregon\n", "/wiki/Curry_County,_Oregon\n", "/wiki/Deschutes_County,_Oregon\n", "/wiki/Douglas_County,_Oregon\n", "/wiki/Gilliam_County,_Oregon\n", "/wiki/Grant_County,_Oregon\n", "/wiki/Harney_County,_Oregon\n", "/wiki/Hood_River_County,_Oregon\n", "/wiki/Jackson_County,_Oregon\n", "/wiki/Jefferson_County,_Oregon\n", "/wiki/Josephine_County,_Oregon\n", "/wiki/Klamath_County,_Oregon\n", "/wiki/Lake_County,_Oregon\n", "/wiki/Lane_County,_Oregon\n", "/wiki/Lincoln_County,_Oregon\n", "/wiki/Linn_County,_Oregon\n", "/wiki/Malheur_County,_Oregon\n", "/wiki/Marion_County,_Oregon\n", "/wiki/Morrow_County,_Oregon\n", "/wiki/Multnomah_County,_Oregon\n", "/wiki/Polk_County,_Oregon\n", "/wiki/Sherman_County,_Oregon\n", "/wiki/Tillamook_County,_Oregon\n", "/wiki/Umatilla_County,_Oregon\n", "/wiki/Union_County,_Oregon\n", "/wiki/Wallowa_County,_Oregon\n", "/wiki/Wasco_County,_Oregon\n", "/wiki/Washington_County,_Oregon\n", "/wiki/Wheeler_County,_Oregon\n", "/wiki/Yamhill_County,_Oregon\n", "/wiki/File:Flag_of_Oregon.svg\n", "/wiki/Portal:Oregon\n", "/wiki/File:Abies_lasiocarpa_0775.JPG\n", "/wiki/Portal:Pacific_Northwest\n", "/wiki/Template:ClimateUS\n", "/wiki/Template_talk:ClimateUS\n", "https://en.wikipedia.org/w/index.php?title=Template:ClimateUS&action=edit\n", "/wiki/Climate_of_the_United_States\n", "/wiki/Climate_of_Alabama\n", "/wiki/Climate_of_Alaska\n", "/wiki/Climate_of_Arizona\n", "/wiki/Climate_of_Arkansas\n", "/wiki/Climate_of_California\n", "/wiki/Climate_of_Colorado\n", "/wiki/Climate_of_Connecticut\n", "/wiki/Climate_of_Delaware\n", "/wiki/Climate_of_Florida\n", "/wiki/Climate_of_Georgia_(U.S._state)\n", "/wiki/Climate_of_Hawaii\n", "/wiki/Climate_of_Idaho\n", "/wiki/Climate_of_Illinois\n", "/wiki/Climate_of_Indiana\n", "/wiki/Climate_of_Iowa\n", "/wiki/Climate_of_Kansas\n", "/wiki/Climate_of_Kentucky\n", "/wiki/Climate_of_Louisiana\n", "/wiki/Climate_of_Maine\n", "/wiki/Climate_of_Maryland\n", "/wiki/Climate_of_Massachusetts\n", "/wiki/Climate_of_Michigan\n", "/wiki/Climate_of_Minnesota\n", "/wiki/Climate_of_Mississippi\n", "/wiki/Climate_of_Missouri\n", "/wiki/Climate_of_Montana\n", "/wiki/Climate_of_Nebraska\n", "/wiki/Climate_of_Nevada\n", "/wiki/Climate_of_New_Hampshire\n", "/wiki/Climate_of_New_Jersey\n", "/wiki/Climate_of_New_Mexico\n", "/wiki/Climate_of_New_York\n", "/wiki/Climate_of_North_Carolina\n", "/wiki/Climate_of_North_Dakota\n", "/wiki/Climate_of_Ohio\n", "/wiki/Climate_of_Oklahoma\n", "None\n", "/wiki/Climate_of_Pennsylvania\n", "/wiki/Climate_of_Rhode_Island\n", "/wiki/Climate_of_South_Carolina\n", "/wiki/Climate_of_South_Dakota\n", "/wiki/Climate_of_Tennessee\n", "/wiki/Climate_of_Texas\n", "/wiki/Climate_of_Utah\n", "/wiki/Climate_of_Vermont\n", "/wiki/Climate_of_Virginia\n", "/wiki/Climate_of_Washington_(state)\n", "/wiki/Climate_of_West_Virginia\n", "/wiki/Climate_of_Wisconsin\n", "/wiki/Climate_of_Wyoming\n", "/wiki/Federal_district\n", "/wiki/Climate_of_Washington,_D.C.\n", "/wiki/Insular_area\n", "/wiki/Climate_of_American_Samoa\n", "/wiki/Climate_of_Guam\n", "/wiki/Climate_of_the_Northern_Mariana_Islands\n", "/wiki/Climate_of_Puerto_Rico\n", "/wiki/Climate_of_the_United_States_Virgin_Islands\n", "/wiki/Climate_of_Allentown,_Pennsylvania\n", "/wiki/Climate_of_Anchorage\n", "/wiki/Climate_of_Beaumont,_Texas\n", "/wiki/Climate_of_Bismarck,_North_Dakota\n", "/wiki/Climate_of_Chicago\n", "/wiki/Climate_of_Columbus,_Ohio\n", "/wiki/Climate_of_Dallas\n", "/wiki/Climate_of_Door_County,_Wisconsin\n", "/wiki/Climate_of_Grand_Forks,_North_Dakota\n", "/wiki/Climate_of_Houston\n", "/wiki/Climate_of_Little_Rock,_Arkansas\n", "/wiki/Climate_of_Los_Angeles\n", "/wiki/Climate_of_New_England\n", "/wiki/Climate_of_Miami\n", "/wiki/Climate_of_Milwaukee\n", "/wiki/Climate_of_Minneapolis%E2%80%93Saint_Paul\n", "/wiki/Climate_of_New_York_City\n", "/wiki/Climate_of_Oklahoma_City\n", "/wiki/Climate_of_Salt_Lake_City\n", "/wiki/Climate_of_San_Diego\n", "/wiki/Climate_of_Seattle\n", "/wiki/Climate_of_the_Tampa_Bay_area\n", "/wiki/List_of_cities_by_sunshine_duration#North_America\n", "/wiki/Climate_change_in_the_United_States\n", "/wiki/List_of_derecho_events#North_America\n", "/wiki/List_of_Storm_Prediction_Center_extremely_critical_days\n", "/wiki/Drought_in_the_United_States\n", "/wiki/Lists_of_floods_in_the_United_States\n", "/wiki/List_of_Storm_Prediction_Center_high_risk_days\n", "/wiki/List_of_costly_or_deadly_hailstorms#North_America\n", "/wiki/List_of_United_States_hurricanes\n", "/wiki/List_of_major_snow_and_ice_events_in_the_United_States\n", "/wiki/Snow_in_Florida\n", "/wiki/Snow_in_Louisiana\n", "/wiki/List_of_snowiest_places_in_the_United_States_by_state\n", "/wiki/Tornadoes_in_the_United_States\n", "/wiki/Template:WeatherRecordsByState\n", "/wiki/Weather-related_fatalities_in_the_United_States\n", "https://en.wikipedia.org/w/index.php?title=Climate_of_Oregon&oldid=1030296200\n", "/wiki/Help:Category\n", "/wiki/Category:Climate_of_Oregon\n", "/wiki/Category:Climate_of_the_United_States_by_state\n", "/wiki/Category:CS1_maint:_multiple_names:_authors_list\n", "/wiki/Special:MyTalk\n", "/wiki/Special:MyContributions\n", "/w/index.php?title=Special:CreateAccount&returnto=Climate+of+Oregon\n", "/w/index.php?title=Special:UserLogin&returnto=Climate+of+Oregon\n", "/wiki/Climate_of_Oregon\n", "/wiki/Talk:Climate_of_Oregon\n", "/wiki/Climate_of_Oregon\n", "/w/index.php?title=Climate_of_Oregon&action=edit\n", "/w/index.php?title=Climate_of_Oregon&action=history\n", "/wiki/Main_Page\n", "/wiki/Main_Page\n", "/wiki/Wikipedia:Contents\n", "/wiki/Portal:Current_events\n", "/wiki/Special:Random\n", "/wiki/Wikipedia:About\n", "//en.wikipedia.org/wiki/Wikipedia:Contact_us\n", "https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en\n", "/wiki/Help:Contents\n", "/wiki/Help:Introduction\n", "/wiki/Wikipedia:Community_portal\n", "/wiki/Special:RecentChanges\n", "/wiki/Wikipedia:File_Upload_Wizard\n", "/wiki/Special:WhatLinksHere/Climate_of_Oregon\n", "/wiki/Special:RecentChangesLinked/Climate_of_Oregon\n", "/wiki/Wikipedia:File_Upload_Wizard\n", "/wiki/Special:SpecialPages\n", "/w/index.php?title=Climate_of_Oregon&oldid=1030296200\n", "/w/index.php?title=Climate_of_Oregon&action=info\n", "/w/index.php?title=Special:CiteThisPage&page=Climate_of_Oregon&id=1030296200&wpFormIdentifier=titleform\n", "https://www.wikidata.org/wiki/Special:EntityPage/Q5133582\n", "/w/index.php?title=Special:DownloadAsPdf&page=Climate_of_Oregon&action=show-download-screen\n", "/w/index.php?title=Climate_of_Oregon&printable=yes\n", "https://commons.wikimedia.org/wiki/Category:Climate_of_Oregon\n", "https://www.wikidata.org/wiki/Special:EntityPage/Q5133582#sitelinks-wikipedia\n", "//en.wikipedia.org/wiki/Wikipedia:Text_of_Creative_Commons_Attribution-ShareAlike_3.0_Unported_License\n", "//creativecommons.org/licenses/by-sa/3.0/\n", "//foundation.wikimedia.org/wiki/Terms_of_Use\n", "//foundation.wikimedia.org/wiki/Privacy_policy\n", "//www.wikimediafoundation.org/\n", "https://foundation.wikimedia.org/wiki/Privacy_policy\n", "/wiki/Wikipedia:About\n", "/wiki/Wikipedia:General_disclaimer\n", "//en.wikipedia.org/wiki/Wikipedia:Contact_us\n", "//en.m.wikipedia.org/w/index.php?title=Climate_of_Oregon&mobileaction=toggle_view_mobile\n", "https://www.mediawiki.org/wiki/Special:MyLanguage/How_to_contribute\n", "https://stats.wikimedia.org/#/en.wikipedia.org\n", "https://foundation.wikimedia.org/wiki/Cookie_statement\n", "https://wikimediafoundation.org/\n", "https://www.mediawiki.org/\n" ] } ], "source": [ "# Find every hyperlink\n", "links = soup.find_all('a')\n", "\n", "# Loop over every link and print hyperlink\n", "for link in links:\n", " print(link.get('href'))" ] }, { "cell_type": "code", "execution_count": 98, "id": "102642a6", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "23" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Find number of images on page\n", "len(soup.find_all('img'))" ] }, { "cell_type": "code", "execution_count": 104, "id": "e5b00709", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"\"\n" ] } ], "source": [ "# Print details of first image\n", "print(soup.find_all('img')[0])" ] }, { "cell_type": "code", "execution_count": 103, "id": "9db5bf95", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "//upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Oregon_K%C3%B6ppen.svg/250px-Oregon_K%C3%B6ppen.svg.png\n" ] } ], "source": [ "# Find attributes of first image\n", "print(soup.find_all('img')[0].attrs['src'])" ] }, { "cell_type": "code", "execution_count": 97, "id": "c91d5847", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Download image\n", "url = 'https://' + soup.find_all('img')[0].attrs['src'][2:]\n", "response = requests.get(url)\n", "if response.status_code == 200:\n", " with open(\"images/test_image.jpg\", 'wb') as f:\n", " f.write(response.content)" ] }, { "cell_type": "code", "execution_count": 99, "id": "c0b34afb", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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trdNPbNHHnmEf/u3f+Oqq67i1VdfpaOjgzvvvJONGzdOtWtgYIDW1lYMw2DPnj1s3ryZz372s1MD4PLly+ns7OSpp55i586d/PM//zP9/f0sXbqUHTt28Gu/9mtUq1Veeukl1qxZw9NPP80nPvEJFi1axJ//+Z+zcuVKDh48yO7du/n4xz+OUopvfetbU+r55s2b+aM/+iN83+dP//RPyWQyXH755fznf/4nV1xxBf/n//yfMybE56Q6PYmDBw/yj//4jzzyyCN4nje1/Z//+Z/52c9+xqc//Wne85738Pzzz/Ov//qvtLe309fXRyaT4dOf/jRXXXUVP/rRj8hms7iuS39/P7fccguf/OQn2bNnD9/85jf50Y9+xMaNG7n66qtZu3YtP/jBD+jr60NrzcGDB7nuuuu466672L9/P6+88sqM9v34xz/mhz/8Ie9///v53Oc+x0c/+lFM8/C42traSrVa5eDBg9i2TX19PXv27KGrq4sPf/jD+L7Pli1b+MhHPsL69et5+OGHyeVyXH311Xzuc5/jt3/7txkZGeEHP/gBnZ2ddHd309LSwp133kl3dzf/+I//SDQa5eabb6ZarfLv//7vU2p8NBpl7dq1xONx3vCGN/D+97+f2267Dd/3OXDgAJ7nYRgGb3rTm2htbWXv3r0sX76c3//938eyLP72b/+WLVu28PWvf53ly5dzxx138OCDD/L973+fn//857zyyitcdtllfOITn2B6yO3Q0BB33303lmXx4Q9/mNtuu42vfvWr9Pf3c9111xGJRLjmmmu47LLLprSaYrFIPp8nmUxOCY5pmtTX1xMEAb7vI4Sgp6eH9773vfzZn/0ZxWKRr3zlK3R3d3PttdcyMDDAPffcw09+8hN++ctfctNNN7F69Wq2bt3KDTfcwLPPPsuvfvUr3vrWt/Ibv/EbbN68me9973t0d3ezc+dOXNflox/9KBdeeCHf//738X3/NL3Vs3FOC/GiRYv49Kc/TaVS4fd+7/col8torXnppZewLIvW1lba29tJpVK88MILxGIxLMsik8nQ1tbG1VdfTS6Xm5olTdOktbWVSy+9lEwmw86dO9m0aROlUomXX36ZdDrNn/zJn0yp1FJK2traaG9vJx6PUygUZrTvV7/6FVprOjs7aW9vZ82aNVMzCYBt28TjcQCklCSTSQzDoKGhgc7OTlKpFPF4nNbWVlpbW6lUKgRBwPDwMP/zf/5PPve5z9Hf30+pVEJKOfXPsixyuRw7duxgdHSU5557jne84x185CMfmbqeEGKqLYZhYFkW69ev58Ybb+Q73/kOQ0NDjI6OsmbNGhKJBFJKGhsbWbduHYsWLWL//v1s376dsbExdu/ezSuvvMJf/dVfcfvtt3PVVVcxODjIHXfcwec+9zk8z5syoo2Pj7Nnzx46OzuxbZvOzk7K5TIDAwNTAmoYBoZhTH2Px+Mkk8mpJRCEqm2xWMQ0Tdra2ohGo8TjcdavX891111HQ0MDfX19DA8Ps3XrVt7//vfztre9jcsvvxzDMNi9ezcjIyOsW7eOdDrNjh07pq6TTCZpb2/n4MGDaK2RUhKLxejo6KClpYVqtXpGhficVqcty+K2227DNE3+/M//nC9/+cv8wR/8AYsXL2bTpk2Mj49TLpdxXZc1a9bMOFZrzdDQEC0tLRwZFjoxMYHrulx22WWUSiX279/PNddcw4YNGyiXy0g5c2wUQsypWrW3t+M4Dtu3b6e+vp5cLjf1Ep4ItNYopfjkJz/JqlWr+MIXvsArr7wyoz2u66KUIh6P09zcTDKZ5I477iCVSlEul6fWxNPhui4AsViM2267jZ/85Cd88Ytf5MMf/vCMQQegXC5TKBTYsGEDHR0dSClZuXIl73vf+1BKMTo6SkNDAzfddBMPPfQQf/M3f8P999/PhRdeiGEYJBIJmpubGRoawvf9qTY1NTXNuq+TWL58ORs2bOCxxx7js5/9LOl0mn379tHT08Ptt98+6/lJKWlqaiKdTpNOp3nve9+LlHJqrX7BBRewdetWWlpauPvuu0mlUnR2dvLoo49ODZSlUonVq1eTSCRmnPu1sISfk0K8a9cuent7KRQK7Nixg7e97W18/etf5zvf+c7U+mrnzp38wz/8A6ZpsmjRIj760Y9OHb9lyxa++c1v8sADD3DXXXdNGbDK5TL33nsvL774IitWrODjH/84hw4d4rnnnuNLX/oSV1xxBUuWLGHFihX09/cjpeTll18mm81SrVbZvn371KwO8IEPfIDHHnuMv/zLv+Qtb3kL3d3dRKNRgiDg0KFDbNmyhYGBARzHYevWrezevXuqf3V1dZRKJQ4dOkRPTw89PT0UCgV6e3tpaWlh9+7d/OxnPwNg3759bNy4kc7OTh544AG+/vWvc9VVV/H+97+f7373u3zhC19g5cqVrF69mquuumpKTW1oaKCtrY3vfOc7uK7LLbfcwrXXXsu1117Ljh07uPbaa6fumVKKZ555hmeffZZKpcLv//7vs2HDBm6++Wa+9a1vsW/fPpYsWUJLSwu/+tWvaGpqoqOjg6uvvpqLLrpoSkDb29t573vfyw9+8AN++tOfsnHjRt75zneyevVqfvGLXwCwd+9estksdXV1QJhA8+lPf5ovf/nL/P3f/z0XXHABzzzzDGvXruXzn/88o6Oj9PX1USgUptTjCy64gHe+8518//vfp1Kp0NXVxYYNG9i0aROvvvoq6XSa4eFhBgcHueuuu7j11lt59NFHuffee2lrayOZTHLnnXeyb9++KYPWli1bGBwcxDAMXn75Za6//vrT+JYfxmkhBTheXH755fpUZjH19fWxbds2lFJTL87WrVspFAo0Nzezdu1a9u7dy+DgIEIIurq6WL16NTt27ODOO+/kve99L9dccw3xeJxLLrmE+vp6fvd3f5ef/OQn/NM//dOURXXlypW4rsvOnTvZs2cPlmWxatUqmpub2bFjB7lcjqVLl2IYBvv27SOVSnH55ZcTiUSA8MXftGkT+/fvJxqNcuGFF1Iqldi7dy+NjY10dHSwZ88efN9n6dKllEolBgYGaGpqorGxkb1792IYBuvWrWPXrl1UKhXWrl07NXgtWrSIcrnM2NgYF154IdFolFdeeQXTNFm7di2ZTIbNmzczMDBAS0sLa9eupa2tbWo2KZVKbNq0ib6+Prq7u7nggguIxWLcfffdVKtVPvOZzwDw/e9/n9/93d/lz/7sz1ixYgWNjY1cfPHFmKZJb28vW7ZsoVwus3jxYlasWMGBAwfYv38/6XSa+vp61q1bN2NGy+VybN68GcdxEEKwevVqmpub2bp1K4ODg1NtnX6M53ns2rWLffv2YVkWkUiEZcuWsWjRIrLZLK+++iqO47By5UqWLVuGEIKhoSFeffVVxsfHaW9vZ/369dxzzz189atf5eMf/ziO4/CNb3yD7u5ufvzjH7N79+4pe0draytr166lv7+fHTt2EI1GWbZsGb29vVMW6pUrV56ydxpACPGS1vryWT9orV/zf5dddpk+01BKaaWUDoJg6u9NmzbplStX6q985Su6Wq1qpZTWWusgCPRv//Zv66VLl+re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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Import packages\n", "import matplotlib.pyplot as plt\n", "import matplotlib.image as mpimg\n", "\n", "# Read image\n", "img = mpimg.imread('images/test_image.jpg')\n", "\n", "# Plot image\n", "plt.imshow(img)" ] }, { "cell_type": "markdown", "id": "b4b5d723", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## Selenium\n", "\n", "* Sometimes we want even more control...\n", "\n", "\n", "* Selenium is a package for performing **web browser automation**\n", "\n", "\n", "* We can use Selenium to enter text in search boxes, click buttons etc. \n", "\n", "" ] }, { "cell_type": "code", "execution_count": 1, "id": "0b10e9f2", "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: webdriver_manager in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (3.5.2)\n", "Requirement already satisfied: crayons in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from webdriver_manager) (0.4.0)\n", "Requirement already satisfied: requests in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from webdriver_manager) (2.27.1)\n", "Requirement already satisfied: configparser in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from webdriver_manager) (5.2.0)\n", "Requirement already satisfied: colorama in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from crayons->webdriver_manager) (0.4.4)\n", "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->webdriver_manager) (2021.10.8)\n", "Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->webdriver_manager) (2.0.11)\n", "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->webdriver_manager) (3.3)\n", "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/anaconda3/envs/lab7/lib/python3.10/site-packages (from requests->webdriver_manager) (1.26.8)\n" ] } ], "source": [ "# Install webdriver_manager: https://github.com/SergeyPirogov/webdriver_manager\n", "!pip3 install webdriver_manager" ] }, { "cell_type": "code", "execution_count": 2, "id": "9fcf7512", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Import packages\n", "from selenium import webdriver\n", "from selenium.webdriver.chrome.service import Service\n", "from selenium.webdriver.common.by import By\n", "from webdriver_manager.chrome import ChromeDriverManager" ] }, { "cell_type": "code", "execution_count": 3, "id": "8cf1d5dd", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "\n", "\n", "====== WebDriver manager ======\n", "Current google-chrome version is 97.0.4692\n", "Get LATEST chromedriver version for 97.0.4692 google-chrome\n", "Driver [/Users/jryan4/.wdm/drivers/chromedriver/mac64/97.0.4692.71/chromedriver] found in cache\n" ] } ], "source": [ "# Install Chrome webdriver\n", "driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))\n", "\n", "# Open a web browser at the following page\n", "driver.get(\"https://www.google.com/maps\")" ] }, { "cell_type": "markdown", "id": "8e2cf8d4", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "id": "d804d956", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "code", "execution_count": 4, "id": "2bf0ced3", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Enter some text in the search box\n", "inputElement = driver.find_element(By.ID, \"searchboxinput\")\n", "inputElement.send_keys('South Sister Oregon')" ] }, { "cell_type": "markdown", "id": "89ce62cd", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "code", "execution_count": 5, "id": "3092fad8", "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "# Click search button\n", "element = driver.find_element(By.ID, \"searchbox-searchbutton\")\n", "element.click()" ] }, { "cell_type": "markdown", "id": "b28c9438", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] } ], "metadata": { "celltoolbar": "Slideshow", "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.8.12" } }, "nbformat": 4, "nbformat_minor": 5 }