{ "cells": [ { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Updated 2018-02-27 14:50:36.395425\n", "By leonyin\n", "Using Python 3.6.1\n", "On Darwin-17.4.0-x86_64-i386-64bit\n" ] } ], "source": [ "runtime_meta()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# USNPL\n", "A scraper for the usnpl site for newspapers, magazines, and college papers.\n", "\n", "View this on [Github](https://github.com/yinleon/usnpl/blob/master/scrape_usnpl.ipynb).
\n", "View this on [NBViewer](https://nbviewer.jupyter.org/github/yinleon/usnpl/blob/master/scrape_usnpl.ipynb?flush=true).
\n", "Visit my lab's [website](https://wp.nyu.edu/smapp/)\n", "\n", "### The output has\n", "Geography - The state of the media source.
\n", "Name - The name of the media source.
\n", "Facebook - The URL for the Facebook account.
\n", "Twitter_Name - The Tweet screen name for the Twitter account.
\n", "Twitter_ID - The Tweet ID for the Twitter Account.
\n", "Website - The URL for the media source
\n", "Medium - What format is the media source?\n", "\n", "The output is publically avaiable as a csv here.
\n", "... and you can access it from the Web using Pandas:" ] }, { "cell_type": "code", "execution_count": 46, "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", "
NameMediumWebsiteFacebookTwitter_NameTwitter_IDGeography
0Alaska Dispatch NewsNewspapershttp://www.adn.comhttps://www.facebook.com/akdispatchadndotcom15828025AK
1Alaska Journal of CommerceNewspapershttp://www.alaskajournal.comhttps://www.facebook.com/AlaskaJournalalaskajournal341639834AK
2Anchorage PressNewspapershttp://www.anchoragepress.comhttps://www.facebook.com/anchoragepressanchoragepress17761344AK
3Petroleum NewsNewspapershttp://www.petroleumnews.comhttps://www.facebook.com/PetroleumNewsNaNNaNAK
4Delta DiscoveryNewspapershttp://www.deltadiscovery.comhttps://www.facebook.com/deltadiscoveryNaNNaNAK
\n", "
" ], "text/plain": [ " Name Medium Website \\\n", "0 Alaska Dispatch News Newspapers http://www.adn.com \n", "1 Alaska Journal of Commerce Newspapers http://www.alaskajournal.com \n", "2 Anchorage Press Newspapers http://www.anchoragepress.com \n", "3 Petroleum News Newspapers http://www.petroleumnews.com \n", "4 Delta Discovery Newspapers http://www.deltadiscovery.com \n", "\n", " Facebook Twitter_Name Twitter_ID \\\n", "0 https://www.facebook.com/akdispatch adndotcom 15828025 \n", "1 https://www.facebook.com/AlaskaJournal alaskajournal 341639834 \n", "2 https://www.facebook.com/anchoragepress anchoragepress 17761344 \n", "3 https://www.facebook.com/PetroleumNews NaN NaN \n", "4 https://www.facebook.com/deltadiscovery NaN NaN \n", "\n", " Geography \n", "0 AK \n", "1 AK \n", "2 AK \n", "3 AK \n", "4 AK " ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "link = 'https://raw.githubusercontent.com/yinleon/usnpl/master/data/usnpl_newspapers_twitter_ids.csv'\n", "df = pd.read_csv(link, dtype={'Twitter_ID' : str})\n", "\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Python modules required to run this is found in this file, and can be downloaded in the notebook with the command below:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "!pip install -r requirements.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the requirements downloaded, you can use the code below to scrape the website." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "import time\n", "import requests\n", "\n", "import tweepy\n", "import pandas as pd\n", "from tqdm import tqdm_notebook as tqdm\n", "from bs4 import BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "states = '''ak\t al\t ar\t az\t ca\t co\t ct\t dc\t de\t fl\t ga\t hi\t ia\t id\t il\t in\t ks ky\t la\t ma\t md\t me\t mi\t mn\t mo\t ms\t mt\t nc\t nd\t ne\t nh\t nj\t nm\t nv\t ny\t oh\t ok\t or\t pa\t ri\t sc\t sd\t tn\t tx\t ut\t va\t vt\t wa\t wi\t wv\t wy\t'''\n", "states = [s.strip() for s in states.split(' ')]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def parse_row(soup):\n", " '''\n", " For each media publication in the html, \n", " we're going to strip the city name, the publication name,\n", " the website url, and social links (if they exist)\n", " \n", " The input `soup` is a beautiful soup object.\n", " the output is a dict of the parsed fields.\n", " '''\n", " city = soup.find('b').text\n", " name = soup.find('a').text\n", " web = soup.find('a').get('href')\n", " \n", " fb = soup.find('a', text='F')\n", " if fb:\n", " fb= fb.get('href')\n", " tw = soup.find('a', text='T')\n", " if tw:\n", " tw=tw.get('href').replace('http://www.twitter.com/', '').rstrip('/')\n", " \n", " return {\n", " 'Facebook' : fb,\n", " 'Twitter_Name' : tw,\n", " 'Name' : name,\n", " 'Website' : web\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will use that function and apply it to sections of the website where the data is. The output of each of these sections will be appended to the list `sites`, and create a list of dictionaries.\n", "\n", "Line-by-line, we are looking through each 2-letter state abbreviation, collecting the html of that state's page, soupifying it (so that we can parse it), parsing out the fields we're interested in, and then appending those results to a list. The if/else statements regarding medium differ because the html holding such information also differs." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "sites = []\n", "for state in states:\n", " url = 'http://www.usnpl.com/{}news.php'.format(state)\n", " r = requests.get(url)\n", " soup = BeautifulSoup(r.content, 'lxml')\n", " \n", " data_possibilities = soup.find_all('div' ,{\"id\" : 'data_box'})\n", " for i, raw_table in enumerate(data_possibilities[1:]):\n", " j = 1 if i == 0 else 0\n", " medium = raw_table.find('h3').text\n", " if medium == 'Newspapers':\n", " data_table = str(raw_table).split('

\\n\\n')[j]\n", " entries_to_parse = data_table.rstrip('').split('\\n
\\n')\n", " elif medium in ['Magazines', 'College Newspapers']:\n", " data_table = str(raw_table).split('Untitled Document')[1]\n", " entries_to_parse = data_table.rstrip('').split('\\n
\\n')\n", " else:\n", " break\n", " \n", " for row in tqdm(entries_to_parse):\n", " row = row.strip('\\r').strip('\\n')\n", " if row:\n", " entry = parse_row(BeautifulSoup(row, 'lxml'))\n", " entry['Geography'] = state.upper()\n", " entry['Medium'] = medium\n", " sites.append(entry)\n", " time.sleep(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That list of dictionaries is now a perfect format to place into a Pandas dataframe." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df = pd.DataFrame(sites)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "df['Website'] = df['Website'].str.rstrip('/')" ] }, { "cell_type": "code", "execution_count": 9, "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", "
FacebookGeographyMediumNameTwitter_NameWebsite
0https://www.facebook.com/akdispatchAKNewspapersAlaska Dispatch Newsadndotcomhttp://www.adn.com
1https://www.facebook.com/AlaskaJournalAKNewspapersAlaska Journal of Commercealaskajournalhttp://www.alaskajournal.com
2https://www.facebook.com/anchoragepressAKNewspapersAnchorage Pressanchoragepresshttp://www.anchoragepress.com
3https://www.facebook.com/PetroleumNewsAKNewspapersPetroleum NewsNonehttp://www.petroleumnews.com
4https://www.facebook.com/deltadiscoveryAKNewspapersDelta DiscoveryNonehttp://www.deltadiscovery.com
\n", "
" ], "text/plain": [ " Facebook Geography Medium \\\n", "0 https://www.facebook.com/akdispatch AK Newspapers \n", "1 https://www.facebook.com/AlaskaJournal AK Newspapers \n", "2 https://www.facebook.com/anchoragepress AK Newspapers \n", "3 https://www.facebook.com/PetroleumNews AK Newspapers \n", "4 https://www.facebook.com/deltadiscovery AK Newspapers \n", "\n", " Name Twitter_Name Website \n", "0 Alaska Dispatch News adndotcom http://www.adn.com \n", "1 Alaska Journal of Commerce alaskajournal http://www.alaskajournal.com \n", "2 Anchorage Press anchoragepress http://www.anchoragepress.com \n", "3 Petroleum News None http://www.petroleumnews.com \n", "4 Delta Discovery None http://www.deltadiscovery.com " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Let's save it\n", "df.to_csv('data/usnpl_newspapers.csv', index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Getting Twitter User IDs\n", "We want to get the Twitter ID, in addition to the screename. This section uses Tweepy to get such info." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# fill these in!\n", "consumer_key = ''\n", "consumer_secret = ''\n", "access_key = ''\n", "access_secret = ''" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "auth = tweepy.OAuthHandler(consumer_key, consumer_secret)\n", "auth.set_access_token(access_key, access_secret)\n", "api = tweepy.API(auth,\n", " wait_on_rate_limit=True,\n", " wait_on_rate_limit_notify=True)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# filter the media outlets for unique Twitter Names to query.\n", "twitter_names = df[~df['Twitter_Name'].isnull()]['Twitter_Name'].unique()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This is an example of an API call for user metadata, and what kind of info we get back." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "user = api.get_user(twitter_names[0])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'contributors_enabled': False,\n", " 'created_at': 'Tue Aug 12 20:59:03 +0000 2008',\n", " 'default_profile': False,\n", " 'default_profile_image': False,\n", " 'description': \"Alaska's largest news site and newspaper. (Formerly Alaska Dispatch News) Newstips@adn.com or call 907-257-4301.\",\n", " 'entities': {'description': {'urls': []},\n", " 'url': {'urls': [{'display_url': 'adn.com',\n", " 'expanded_url': 'http://adn.com',\n", " 'indices': [0, 23],\n", " 'url': 'https://t.co/brBsUYJrYV'}]}},\n", " 'favourites_count': 215,\n", " 'follow_request_sent': False,\n", " 'followers_count': 70902,\n", " 'following': False,\n", " 'friends_count': 6093,\n", " 'geo_enabled': True,\n", " 'has_extended_profile': False,\n", " 'id': 15828025,\n", " 'id_str': '15828025',\n", " 'is_translation_enabled': False,\n", " 'is_translator': False,\n", " 'lang': 'en',\n", " 'listed_count': 1383,\n", " 'location': 'Anchorage, Alaska',\n", " 'name': 'Anchorage Daily News',\n", " 'notifications': False,\n", " 'profile_background_color': 'FFFFFF',\n", " 'profile_background_image_url': 'http://pbs.twimg.com/profile_background_images/15686233/1-tweet.jpg',\n", " 'profile_background_image_url_https': 'https://pbs.twimg.com/profile_background_images/15686233/1-tweet.jpg',\n", " 'profile_background_tile': True,\n", " 'profile_banner_url': 'https://pbs.twimg.com/profile_banners/15828025/1458879223',\n", " 'profile_image_url': 'http://pbs.twimg.com/profile_images/932121310108442624/NY7s0rqO_normal.jpg',\n", " 'profile_image_url_https': 'https://pbs.twimg.com/profile_images/932121310108442624/NY7s0rqO_normal.jpg',\n", " 'profile_link_color': '0084B4',\n", " 'profile_location': None,\n", " 'profile_sidebar_border_color': 'FFFFFF',\n", " 'profile_sidebar_fill_color': 'DDFFCC',\n", " 'profile_text_color': '333333',\n", " 'profile_use_background_image': False,\n", " 'protected': False,\n", " 'screen_name': 'adndotcom',\n", " 'status': {'contributors': None,\n", " 'coordinates': None,\n", " 'created_at': 'Tue Mar 06 06:20:46 +0000 2018',\n", " 'entities': {'hashtags': [{'indices': [15, 24], 'text': 'Iditarod'}],\n", " 'symbols': [],\n", " 'urls': [],\n", " 'user_mentions': [{'id': 919941379,\n", " 'id_str': '919941379',\n", " 'indices': [3, 13],\n", " 'name': 'Sports at ADN',\n", " 'screen_name': 'sportsadn'}]},\n", " 'favorite_count': 0,\n", " 'favorited': False,\n", " 'geo': None,\n", " 'id': 970907016972480512,\n", " 'id_str': '970907016972480512',\n", " 'in_reply_to_screen_name': None,\n", " 'in_reply_to_status_id': None,\n", " 'in_reply_to_status_id_str': None,\n", " 'in_reply_to_user_id': None,\n", " 'in_reply_to_user_id_str': None,\n", " 'is_quote_status': False,\n", " 'lang': 'en',\n", " 'place': None,\n", " 'retweet_count': 10,\n", " 'retweeted': False,\n", " 'retweeted_status': {'contributors': None,\n", " 'coordinates': None,\n", " 'created_at': 'Tue Mar 06 06:14:24 +0000 2018',\n", " 'entities': {'hashtags': [{'indices': [0, 9], 'text': 'Iditarod'}],\n", " 'symbols': [],\n", " 'urls': [{'display_url': 'twitter.com/i/web/status/9…',\n", " 'expanded_url': 'https://twitter.com/i/web/status/970905415071363072',\n", " 'indices': [117, 140],\n", " 'url': 'https://t.co/qvX7Q3dBns'}],\n", " 'user_mentions': []},\n", " 'favorite_count': 18,\n", " 'favorited': False,\n", " 'geo': None,\n", " 'id': 970905415071363072,\n", " 'id_str': '970905415071363072',\n", " 'in_reply_to_screen_name': None,\n", " 'in_reply_to_status_id': None,\n", " 'in_reply_to_status_id_str': None,\n", " 'in_reply_to_user_id': None,\n", " 'in_reply_to_user_id_str': None,\n", " 'is_quote_status': False,\n", " 'lang': 'en',\n", " 'place': None,\n", " 'possibly_sensitive': False,\n", " 'retweet_count': 10,\n", " 'retweeted': False,\n", " 'source': 'Twitter Web Client',\n", " 'text': \"#Iditarod musher Mitch Seavey is second musher to leave Rohn, but he's running without one of his top dogs from las… https://t.co/qvX7Q3dBns\",\n", " 'truncated': True},\n", " 'source': 'TweetDeck',\n", " 'text': \"RT @sportsadn: #Iditarod musher Mitch Seavey is second musher to leave Rohn, but he's running without one of his top dogs from last year's…\",\n", " 'truncated': False},\n", " 'statuses_count': 50552,\n", " 'time_zone': 'Alaska',\n", " 'translator_type': 'none',\n", " 'url': 'https://t.co/brBsUYJrYV',\n", " 'utc_offset': -32400,\n", " 'verified': True}" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "user._json" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "I wonder what we can win in the raffle w/ our hunting liscence?
\n", "You don't need a hunting liscence to scrape the web and do some whacky analysis!\n", "\n", "Let's iterate through the unique Twitter usernames from our media outlets, make the API call, and store the results we're interested in as a dictionary." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from tweepy import TweepError" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8aaee0e149e841fe96cf9526e7babdce", "version_major": 2, "version_minor": 0 }, "text/plain": [ "A Jupyter Widget" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Exception in thread Thread-158:\n", "Traceback (most recent call last):\n", " File \"/anaconda3/lib/python3.6/threading.py\", line 916, in _bootstrap_inner\n", " self.run()\n", " File \"/anaconda3/lib/python3.6/site-packages/tqdm/_tqdm.py\", line 144, in run\n", " for instance in self.tqdm_cls._instances:\n", " File \"/anaconda3/lib/python3.6/_weakrefset.py\", line 60, in __iter__\n", " for itemref in self.data:\n", "RuntimeError: Set changed size during iteration\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Rate limit reached. Sleeping for: 605\n", "Rate limit reached. Sleeping for: 664\n", "Rate limit reached. Sleeping for: 578\n", "Rate limit reached. Sleeping for: 650\n", "\n" ] } ], "source": [ "user_ids = []\n", "for screen_name in tqdm(twitter_names):\n", " try:\n", " user = api.get_user(screen_name=screen_name)\n", " user_id = user.id_str\n", " except TweepError:\n", " user_id = None\n", " pass\n", " user_ids.append({\n", " 'Twitter_ID' : user_id,\n", " 'Twitter_Name' : screen_name\n", " })" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's save the output, and merge it back into the dataframe of USNPL fields we parsed out." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "df_users = pd.DataFrame(user_ids)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_users.to_csv('data/twitter_users.csv', index=False)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": true }, "outputs": [], "source": [ "df_merge = df.merge(df_users, on='Twitter_Name', how='left')[['Name', 'Medium', 'Website', 'Facebook', 'Twitter_Name','Twitter_ID', 'Geography']]\n", "df_merge.to_csv('data/usnpl_newspapers_twitter_ids.csv', index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And that is how we scrape a website and get a nice csv." ] }, { "cell_type": "code", "execution_count": 39, "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", "
NameMediumWebsiteFacebookTwitter_NameTwitter_IDGeography
12Fairbanks Daily News-MinerNewspapershttp://www.newsminer.comhttps://www.facebook.com/fairbanksDNMnewsminer16555200AK
\n", "
" ], "text/plain": [ " Name Medium Website \\\n", "12 Fairbanks Daily News-Miner Newspapers http://www.newsminer.com \n", "\n", " Facebook Twitter_Name Twitter_ID Geography \n", "12 https://www.facebook.com/fairbanksDNM newsminer 16555200 AK " ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_merge[df_merge['Name'] == 'Fairbanks Daily News-Miner']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can aggregate this data get an idea of the media landscape across states." ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "df_ = df_merge[df_merge['Geography'].isin(['WY', 'AZ', 'MA', 'NY'])]\n", "df_ = pd.crosstab(df_['Geography'], df_['Medium'])" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nkrPYAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df_.plot(kind='barh', title=\"Num of State-Level Media Outlets\");" ] } ], "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.6.2" } }, "nbformat": 4, "nbformat_minor": 2 }