Package: pushshift.py
Installationpipinstallpushshift.pyAt present, only python 3 is supported.DescriptionA minimalist wrapper for searching public reddit comments/submissions via the pushshift.io API.Pushshift is an extremely useful resource, but the API is poorly documented. As such, this API wrapper
is currently designed to make it easy to pass pretty much any search parameter the user wants to try.Although it is not necessarily reflective of the current status of the API, you should
attempt to familiarize yourself with the Pushshift API documentation to better understand
what search arguments are likely to work.API Documentation on github/r/pushshiftFeaturesHandles rate limiting and exponential backoff subject to maximum retries and
maximum backoff limits. A minimum rate limit of 1 request per second is used
as a default per consultation with Pushshift’s maintainer,/u/Stuck_in_the_matrix.Handles paging of results when using supported sort options. At the moment, onlycreated_utcsort types page properly. Returns all historical results for a given query by default.Optionally handles incorporation ofprawto fetch objects after getting ids from pushshiftIf not usingpraw, returns results incommentandsubmissionobjects whose
API is similar to the correspondingprawobjects. Additionally, result objects have
an additional.d_attribute that offers dict access to the associated data attributes.Optionally adds acreatedattribute which converts a comment/submission’screated_utctimestamp to the user’s local time. (may raise exceptions for users with certain timezone
settings).Simple interface to pass query arguments to the API. The API is sparsely documented,
so it’s often fruitful to just try an argument and see if it works.Limited support for pushshift’saggsargument.Astop_conditionargument to make it simple to stop yielding results given arbitrary user-defined criteriaWARNINGSNon-default sorts (i.e. sorting by anything other thancreated_utc) have limited support from
the pushshift.io API. As such, this project will raise an exception for any request that can’t
provide reliably sorted and paged data.Non-default sorts require a limit <= max_results_per_request (500 by default)Demo usagefrompushshift_pyimportPushshiftAPIapi=PushshiftAPI()Or to use pushshift search to fetch ids and then use praw to fetch objects:importprawfrompushshift_pyimportPushshiftAPIr=praw.Reddit(...)api=PushshiftAPI(r)100 most recent submissions# The `search_comments` and `search_submissions` methods return generator objectsgen=api.search_submissions(limit=100)results=list(gen)First 10 submissions to /r/politics in 2017, filtering results to url/author/title/subreddit fields.Thecreated_utcfield will be added automatically (it’s used for paging).importdatetimeasdtstart_epoch=int(dt.datetime(2017,1,1).timestamp())list(api.search_submissions(after=start_epoch,subreddit='politics',filter=['url','author','title','subreddit'],limit=10))Trying a search argument that doesn’t actually workAccording to the pushshift.io API documentation, we should be able to search submissions by url,
but (at the time of this writing) this doesn’t actually work in practice.
The API should still respect thelimitargument and possibly other supported arguments,
but no guarantees. If you find that an argument you have passed is not supported by the API,
best thing is to just remove it from the query and modify your api call to only utilize
supported arguments to mitigate risks from of unexpected behavior.url='http://www.politico.com/story/2017/02/mike-flynn-russia-ties-investigation-235272'url_results=list(api.search_submissions(url=url,limit=500))len(url_results),any(r.url==urlforrinurl_results)# 500, FalseAll AskReddit comments containing the text “OP”Use theqparameter to search text. Omitting thelimitparameter does a full
historical search. Requests are performed in batches of size specified by themax_results_per_requestparameter (default=500). Omitting the “max_reponse_cache”
test in the demo below will return all results. Otherwise, this demo will perform two
API requests returning 500 comments each. Alternatively, the generator can be queried for additional results.gen=api.search_comments(q='OP',subreddit='askreddit')max_response_cache=1000cache=[]forcingen:cache.append(c)# Omit this test to actually return all results. Wouldn't recommend it though: could take a while, but you do you.iflen(cache)>=max_response_cache:break# If you really want to: pick up where we left off to get the rest of the results.ifFalse:forcingen:cache.append(c)Using theaggsargument to count comments mentioning trump each hour in past weekReplicating the example from the pushshift documentation:https://api.pushshift.io/reddit/search/comment/?q=trump&after=7d&aggs=created_utc&frequency=hour&size=0I haven’t really experimented much with this functionality of the API, so I figured
the simplest way to support it would be to just disable most of the bells and whistles
provided by the API wrapper when theaggsargument is provided (i.e. paging, converting
the result to a namedtuple for dot notation attribute access).api=PushshiftAPI()gen=api.search_comments(q='trump',after='7d',aggs='created_utc',frequency='hour',size=0,)result=next(gen)Using thestop_conditionargument to get the most recent submission by a bot accountgen=api.search_submissions(stop_condition=lambdax:'bot'inx.author)forsubmingen:passprint(subm.author)LicensePSAW’s source is provided under theSimplified BSD License.Copyright (c), 2018, David Marx