Skip to main content

Installation

pip install -e git+git://github.com/dmarx/psaw.git

At present, only python 3 is supported.

Description

A 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, I recommend you attempt to familiarize yourself with the Pushshift API documentation to better understand what search arguments are likely to work. The documentation is distributed across several locations:

Features

  • Handles 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. Returns all historical results for a given query by default.

  • Returns results in comment and submission objects whose API is similar to the corresponding praw objects. Additionally, result objects have an additional .d_ attribute that offers dict access to the associated data attributes.

  • Adds a created attribute which converts a comment/submission’s created_utc timestamp to the user’s local time.

  • Extremely 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’s aggs argument.

  • A stop_condition argument to make it simple to stop yielding results given arbitrary user-defined criteria

Demo usage

from psaw import PushshiftAPI

api = PushshiftAPI()

100 most recent submissions

# The `search_comments` and `search_submissions` methods return generator objects
gen = api.search_submissions(limit=100)
results = list(gen)

First 10 submissions to /r/politics in 2017, filtering results to url/author/title/subreddit fields.

The created_utc field will be added automatically (it’s used for paging).

list(api.search_submissions(after=int(dt.datetime(2017, 1, 1).timestamp()),
                        subreddit='politics',
                        filter=['url','author', 'title', 'subreddit'],
                        limit=10))

Trying a search argument that doesn’t actually work

According 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 the limit argument 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 == url for r in url_results)
# 500, False

All AskReddit comments containing the text “OP”

Use the q parameter to search text. Omitting the limit parameter does a full historical search. Requests are performed in batches of size specified by the max_results_per_request parameter (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 = 1000
cache = []

for c in gen:
    cache.append(c)

    # Omit this test to actually return all results. Wouldn't recommend it though: could take a while, but you do you.
    if len(cache) >= max_response_cache:
        break

# If you really want to: pick up where we left off to get the rest of the results.
if False:
    for c in gen:
        cache.append(c)

Using the aggs argument to count comments mentioning trump each hour in past week

Replicating the example from the pushshift documentation:

https://api.pushshift.io/reddit/search/comment/?q=trump&after=7d&aggs=created_utc&frequency=hour&size=0

I 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 the aggs argument 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 the stop_condition argument to get the most recent submission by a bot account

gen = api.search_submissions(stop_condition=lambda x: 'bot' in x.author)

for subm in enumerate(gen):
    pass

print(subm.author)

License

PSAW’s source is provided under the Simplified BSD License.

  • Copyright (c), 2018, David Marx

Metadata

Release files for psaw 0.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for psaw 0.0.1
File Size Uploaded
psaw-0.0.1.tar.gz 5.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for psaw 0.0.1
File Interpreter ABI Platform
psaw-0.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 15.3 kB

Release files / psaw-0.0.1.tar.gz

Download URL psaw-0.0.1.tar.gz
Size 5.9 kB
Tags Source
SHA-256 checksum
How to use checksums
f56e94ef009cf7e86319b18ffb5233f79ad6f302c0d31dce7495e560a5270a03
BLAKE2b-256 checksum
How to use checksums
5907db0980b92edd8a1d84259fa98848be7f3bf325cfcd8827ff6d96549686fd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release files / psaw-0.0.1-py3-none-any.whl

Download URL psaw-0.0.1-py3-none-any.whl
Size 9.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4a1a07549b59f5ef88da1b2f4826bfe3cd91b0413fb6295744a9ab6006ab3166
BLAKE2b-256 checksum
How to use checksums
c3178cc9aca8e7b2cb5a9daf9d72de5209719e7f72b660a2872d3592e658981c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.1.0

1 release file

0.0.12

1 release file

0.0.11

1 release file

0.0.10

1 release file

0.0.9

2 release files

0.0.8

1 release file

0.0.7

1 release file

0.0.6

1 release file

0.0.5

1 release file

0.0.4

1 release file

0.0.3

1 release file

0.0.2

1 release file

This release

0.0.1 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page