H a n d s o n, p r o j e c t b a s e d


More About Plotly and the GitHub API


Download 4.21 Mb.
Pdf ko'rish
bet292/344
Sana31.01.2024
Hajmi4.21 Mb.
#1818553
1   ...   288   289   290   291   292   293   294   295   ...   344
Bog'liq
Python Crash Course, 2nd Edition

More About Plotly and the GitHub API
To read more about working with Plotly charts, there are two good places
to start. You can find the Plotly User Guide in Python at https://plot.ly/python 
/user-guide/. This resource gives you a better understanding of how Plotly 
uses your data to construct a visualization and why it approaches defining 
data visualizations in this way.
The python figure reference at https://plot.ly/python/reference/ lists all the set-
tings you can use to configure Plotly visualizations. All the possible chart 
types are listed as well as all the attributes you can set for every configura-
tion option.
For more about the GitHub API, refer to its documentation at https://
developer.github.com/v3/. Here you’ll learn how to pull a wide variety of spe-
cific information from GitHub. If you have a GitHub account, you can work 
with your own data as well as the publicly available data for other users’ 
repositories.


372
Chapter 17
The Hacker News API
To explore how to use API calls on other sites, let’s take a quick look at 
Hacker News (http://news.ycombinator.com/). On Hacker News, people share 
articles about programming and technology, and engage in lively discus-
sions about those articles. The Hacker News API provides access to data 
about all submissions and comments on the site, and you can use the API 
without having to register for a key.
The following call returns information about the current top article as 
of this writing:
https://hacker-news.firebaseio.com/v0/item/19155826.json
When you enter this URL in a browser, you’ll see that the text on the 
page is enclosed by braces, meaning it’s a dictionary. But the response is dif-
ficult to examine without some better formatting. Let’s run this URL through 
the 
json.dump()
method, like we did in the earthquake project in Chapter 16, 
so we can explore the kind of information that’s returned about an article:
import requests
import json
# Make an API call, and store the response.
url = 'https://hacker-news.firebaseio.com/v0/item/19155826.json'
r = requests.get(url)
print(f"Status code: {r.status_code}")
# Explore the structure of the data.
response_dict = r.json()
readable_file = 'data/readable_hn_data.json'
with open(readable_file, 'w') as f:
json.dump(response_dict, f, indent=4)
Everything in this program should look familiar, because we’ve used it 
all in the previous two chapters. The output is a dictionary of information 
about the article with the ID 19155826:
{
"by": "jimktrains2",
u
"descendants": 220,
"id": 19155826,
v
"kids": [
19156572,
19158857,
--snip--
],
"score": 722,
"time": 1550085414,
w
"title": "Nasa's Mars Rover Opportunity Concludes a 15-Year Mission",
"type": "story",
x
"url": "https://www.nytimes.com/.../mars-opportunity-rover-dead.html"
}
hn_article.py
readable_hn 
_data.json


Working with APIs
373
The dictionary contains a number of keys we can work with. The key 
'descendants'
tells us the number of comments the article has received u. The 
key 
'kids'
provides the IDs of all comments made directly in response to this 
submission v. Each of these comments might have comments of their own as 
well, so the number of descendants a submission has is usually greater than 
its number of kids. We can see the title of the article being discussed w, and a 
URL for the article that’s being discussed as well x.
The following URL returns a simple list of all the IDs of the current top 
articles on Hacker News:
https://hacker-news.firebaseio.com/v0/topstories.json
We can use this call to find out which articles are on the home page 
right now, and then generate a series of API calls similar to the one we just 
examined. With this approach, we can print a summary of all the articles 
on the front page of Hacker News at the moment:
from operator import itemgetter
import requests
# Make an API call and store the response.
u
url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
r = requests.get(url)
print(f"Status code: {r.status_code}")
# Process information about each submission.
v
submission_ids = r.json()
w
submission_dicts = []
for submission_id in submission_ids[:30]:
# Make a separate API call for each submission.
x
url = f"https://hacker-news.firebaseio.com/v0/item/{submission_id}.json"
r = requests.get(url)
print(f"id: {submission_id}\tstatus: {r.status_code}")
response_dict = r.json()
# Build a dictionary for each article.
y
submission_dict = {
'title': response_dict['title'],
'hn_link': f"http://news.ycombinator.com/item?id={submission_id}",
'comments': response_dict['descendants'],
}
z
submission_dicts.append(submission_dict)
{
submission_dicts = sorted(submission_dicts, key=itemgetter('comments'),
reverse=True)
|
for submission_dict in submission_dicts:
print(f"\nTitle: {submission_dict['title']}")
print(f"Discussion link: {submission_dict['hn_link']}")
print(f"Comments: {submission_dict['comments']}")
hn_submissions.py


374
Chapter 17
First, we make an API call, and then print the status of the response u. 
This API call returns a list containing the IDs of up to the 500 most popu-
lar articles on Hacker News at the time the call is issued. We then convert 
the response object to a Python list at v, which we store in 
submission_ids

We’ll use these IDs to build a set of dictionaries that each store information 
about one of the current submissions.
We set up an empty list called 
submission_dicts
at w to store these diction-
aries. We then loop through the IDs of the top 30 submissions. We make a 
new API call for each submission by generating a URL that includes the cur-
rent value of 
submission_id
x. We print the status of each request along with 
its ID, so we can see whether it’s successful.
At y we create a dictionary for the submission currently being pro-
cessed, where we store the title of the submission, a link to the discussion 
page for that item, and the number of comments the article has received so 
far. Then we append each 
submission_dict
to the list 
submission_dicts
z.
Each submission on Hacker News is ranked according to an overall 
score based on a number of factors including how many times it’s been 
voted up, how many comments it’s received, and how recent the submis-
sion is. We want to sort the list of dictionaries by the number of comments. 
To do this, we use a function called 
itemgetter()
{, which comes from the 
operator
module. We pass this function the key 
'comments'
, and it pulls the 
value associated with that key from each dictionary in the list. The 
sorted()
function then uses this value as its basis for sorting the list. We sort the list 
in reverse order to place the most-commented stories first.
Once the list is sorted, we loop through the list at | and print out 
three pieces of information about each of the top submissions: the title, 
a link to the discussion page, and the number of comments the submission 
currently has:
Status code: 200
id: 19155826 status: 200
id: 19180181 status: 200
id: 19181473 status: 200
--snip--
Title: Nasa's Mars Rover Opportunity Concludes a 15-Year Mission
Discussion link: http://news.ycombinator.com/item?id=19155826
Comments: 220
Title: Ask HN: Is it practical to create a software-controlled model rocket?
Discussion link: http://news.ycombinator.com/item?id=19180181
Comments: 72
Title: Making My Own USB Keyboard from Scratch
Discussion link: http://news.ycombinator.com/item?id=19181473
Comments: 62
--snip--


Working with APIs
375
You would use a similar process to access and analyze information with 
any API. With this data, you could make a visualization showing which sub-
missions have inspired the most active recent discussions. This is also the 
basis for apps that provide a customized reading experience for sites like 
Hacker News. To learn more about what kind of information you can access 
through the Hacker News API, visit the documentation page at https://github 
.com/HackerNews/API/.

Download 4.21 Mb.

Do'stlaringiz bilan baham:
1   ...   288   289   290   291   292   293   294   295   ...   344




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling