Contributed by Thomas Kassel. He enrolled in the NYC Data Science Academy 17-week remote bootcamp program, taking place from January to April 2017. This post is based on his third class project focusing on web scraping in Python. The original article can be found here.
Clean technology continues to undergo significant advancements spanning technology, sustainability, financial, and policy issues. Given the field’s large scope, there is no shortage of news outlets covering the action. With the goal of tracking and analyzing recent cleantech trends, a web scraping framework was constructed using Python’s scrapy library to gather articles from online sources; natural language processing was then conducted using Python’s TextBlob and visualized using R’s ggplot2.
Greentech Media is a leading provider of online media and research in the cleantech world, with an in-depth focus on renewables, energy efficiency, energy storage, grid modernization, green financing and environmental policy. 100+ online articles from the previous 3 months were scraped for the following information:
Cleantech 100 is an annual ranking of the top 100 up-and-coming companies in the cleantech community, described as those companies “most likely to have a big commercial impact in a 5-10 year timeframe.” The 2017 rankings were scraped and the company names were used as anchors for text recognition in the Greentech Media articles.
Python’s scrapy framework is a fast and flexible method based upon the use of “spiders” (scripts with html parsing instructions) to gather online information and store it for further use. In this instance a specific scrapy class “Crawl Spider” was used, which is created by defining start URLs, a set of rules to inform the spider which links on the start page to follow, and set of instructions (specific xpath references) on how to parse, extract and save fields from the html at the destination page. Let’s take a look at the spider used to gather information from Greentech Media’s articles.
from scrapy import Spider
from scrapy.spiders import CrawlSpider , Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.http import Request
from scrapy.selector import Selector
from cleantechScrapy.items import GTMArticleItem
from cleantechScrapy.items import Cleantech100Item
##### Crawl Spider to scrape GTM articles #####
name = 'GTM.spider'
allowed_urls = ['https://www.greentechmedia.com']
start_urls = [
rules = (
# Follow links to articles and use parseArticle method at each article page
Rule(LinkExtractor(allow=('/articles/read/.*', )), callback='parseArticle'),
def parseArticle(self, response):
self.logger.info('Successfully crawled to %s', response.url)
# Initialize article item
item = GTMArticleItem()
# Parse article information using xpaths
item['theme'] = response.xpath('//div[@class="article-header-box"]/strong/text()').extract_first()
title = response.xpath('//h1[@class="article-page-heading"]/text()').extract_first()
title = title.encode('ascii','ignore')
item['title'] = title.strip()
body = response.xpath('//div[@class="col-md-9"]/p/descendant-or-self::text()').extract()
body = map(lambda x : x.encode('ascii','ignore'),body)
body = map(lambda x : x.replace('\t',"").replace('\n'," ").replace("\\'","'"),body)
item['body'] = ''.join(body)
item['tags'] = response.xpath('//ul[@class="tag-list"]/li/a/text()').extract()
item['comments'] = response.xpath('//span[@class="comment-count"]/a/text()').extract_first()
For each article - 107 in total - the attributes (theme, tags, text body) were then stored as a Python dictionary in JSON format for further use. The 2017 Cleantech 100 companies were scraped using a very similar framework.
With the scraped data stored locally, text processing was then conducted on the Greentech Media articles through the use of regular expressions, word/phrase frequencies, and sentiment analyzers from the Python TextBlob framework. The following questions were explored.
As illustrated below, electric vehicles, policy, and energy storage are covered by 10 or more articles, collectively making up about a third of all articles published on Greentech Media in recent months. Interestingly, policy is typically of secondary focus of the website - perhaps more policy coverage has been warranted lately, given the current political climate and uncertainty around the Trump administration’s effect on environmental issues.
Greentech Media’s readers have the ability to submit their own two cents on a newsfeed-like comments section. We can observe from the below histogram that although many articles go uncommented (far left bin of each facet), a healthy number of articles elicit anywhere from 10-100 comments, with some generating more than 150. Furthermore, certain polarizing themes may be eliciting more reader comments than others – for example, most articles tagged with “energy storage” are uncommented; most articles tagged with “donald trump” had ~60 comments.
To get a pulse on the current “players” in the cleantech community, the below proper noun types were searched for in all articles. Lists of cleantech countries, people and companies were generated simply off of domain knowledge; a list of startups (as mentioned earlier) was scraped from the Cleantech 100 online website.
Regular expressions were used to identify total word counts for each proper noun. Additionally, using TextBlob, sentences from all articles were tokenized and analyzed for the relative polarity and subjectivity of that sentence. TextBlob gives each sentence a numeric polarity score ranging from -1 to 1, with a value of -1 indicating highly negative content and a value of 1 indicating highly positive content (0 being neutral). Additionally, it assigns each sentence a subjectivity score from 0 (completely objective) to 1 (completely subjective). For each proper noun, an average for each of these scores was calculated across all sentences in which the noun was mentioned.
Since sentiment analyzers are imperfect and a product of their training library, the choice of training library is an interesting tuning parameter, albeit beyond the scope of this blog post. The default sentiment analyzer used by TextBlob and in this analysis is trained using the pattern library.
(Countries) The U.S. receives by far the most mentions in Greentech Media’s articles. Developing nations China and India, although having less private cleantech innovation, are extremely relevant players in the global environmental discussion.
(People) Cleantech magnate and entrepreneur Elon Musk is frequently mentioned, often with a slightly positive and subjective tone. Surprisingly, Donald Trump and Scott Pruitt (new EPA secretary), staunch opposers of the environmental agenda, are also mentioned in a positive light. This could be generally due to positive and rising economic tides (and greater cleantech investment) during their administration so far.
(Large Companies) Elon Musk’s revolutionary electric car company, Tesla, although smaller than enormous global brand GE (General Electric), is helping to define the cleantech industry and mentioned very frequently in the articles.
(Startups) Unlike the other three lists, some startups tend to have slightly negative associations, perhaps due to the inherent uncertainty, risk and high failure rate of a startup environment. However, on the other end of the spectrum, Greentech Media’s articles appear to be in agreement with Cleantech 100’s high endorsement of some energy storage/grid modernization providers (Stem, Blue Pillar, etc) depicted in the top right.