RateMyProfessors — Professor Ratings Scraper
Pricing
Pay per event
RateMyProfessors — Professor Ratings Scraper
Scrape professors and student ratings from RateMyProfessors via its public GraphQL API. Input school names or IDs; get full professor profiles with avg rating, difficulty, and the complete corpus of student reviews with course codes, tags, grades, and comment text.
Pricing
Pay per event
Rating
0.0
(0)
Developer
BowTiedRaccoon
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
10 days ago
Last modified
Categories
Share
RateMyProfessors Professor Ratings Scraper
Scrapes professors and student reviews from RateMyProfessors through its public GraphQL API. Returns professor profiles with average rating, difficulty and would-take-again rate, plus the full corpus of individual student reviews with course codes, tags, grades and comment text.
RateMyProfessors Scraper Features
- Input school names or RateMyProfessors school IDs — names are resolved for you
- Returns professor-level aggregates and every individual rating behind them
- Each review carries course code, quality, difficulty, grade received and comment text
- Rating tags, attendance policy and textbook usage included per review
- Lean by design, so runs are quick and cheap
includeRatings: falsegives professor summaries only, for a cheaper pass
What can you do with RateMyProfessors data?
- Education researchers — Study grade expectations against difficulty ratings across departments.
- NLP teams — Train sentiment or aspect-extraction models on a large corpus of free-text reviews with structured labels attached.
- Prospective students — Compare a department's teaching quality across schools before committing.
- University administrators — Benchmark departmental sentiment against peer institutions.
- Ed-tech products — Seed a course-selection tool with real ratings rather than a licensed feed.
How RateMyProfessors Scraper Works
- You supply school names or IDs in
schools. - Each name is resolved to a RateMyProfessors school ID.
- Every professor at the school is collected with their aggregate scores.
- When
includeRatingsis true, the full rating corpus for each professor is pulled and emitted one record per review, stopping atmaxItems.
Input
Full pull, professors plus every review:
{"schools": ["Arizona State University", "University of Michigan"],"includeRatings": true,"maxItems": 5000}
Professor summaries only — far fewer records:
{"schools": ["Arizona State University"],"includeRatings": false,"maxItems": 500}
| Field | Type | Default | Description |
|---|---|---|---|
schools | array | ["Arizona State University"] | School names or RateMyProfessors school IDs |
includeRatings | boolean | true | Fetch every individual student rating per professor |
maxItems | integer | 10 | Maximum records across all schools |
A large school with includeRatings: true produces tens of thousands of records. Set maxItems deliberately.
RateMyProfessors Scraper Output Fields
{"school_name": "Arizona State University","school_city": "Tempe","school_state": "AZ","first_name": "Jane","last_name": "Doe","department": "Computer Science","avg_rating": "4.3","num_ratings": "218","would_take_again_percent": "87","avg_difficulty": "3.1","rating_class": "CSE110","rating_quality": "5","rating_difficulty": "3","rating_comment": "Clear lectures and fair exams. Do the practice sets.","rating_date": "2026-03-14","rating_tags": "Caring,Gives good feedback","rating_grade": "A","rating_attendance_mandatory": "non mandatory"}
| Field | Type | Description |
|---|---|---|
school_id | string | Global school ID (base64-encoded) |
school_legacy_id | string | Numeric legacy school ID |
school_name | string | Full school name |
school_city | string | School city |
school_state | string | School state abbreviation |
professor_id | string | Global professor ID (base64-encoded) |
professor_legacy_id | string | Numeric legacy professor ID |
first_name | string | Professor first name |
last_name | string | Professor last name |
department | string | Professor department |
avg_rating | string | Average quality rating, 1–5 |
num_ratings | string | Total ratings for this professor |
would_take_again_percent | string | Percentage who would take this professor again |
avg_difficulty | string | Average difficulty rating, 1–5 |
rating_id | string | Global rating ID (base64-encoded) |
rating_legacy_id | string | Numeric legacy rating ID |
rating_class | string | Course code for this rating — e.g. CS101 |
rating_quality | string | Quality rating for this review, 1–5 |
rating_difficulty | string | Difficulty rating for this review, 1–5 |
rating_comment | string | Full text of the student comment |
rating_date | string | Date the rating was posted (ISO 8601) |
rating_thumbs_up | string | Thumbs-up votes on this rating |
rating_thumbs_down | string | Thumbs-down votes on this rating |
rating_tags | string | Comma-separated tags applied to this rating |
rating_for_credit | string | Whether the course was taken for credit |
rating_attendance_mandatory | string | Attendance policy — yes / no / non mandatory |
rating_textbook_used | string | Textbook used — 1 yes, 0 no, -1 unknown |
rating_grade | string | Grade the student received |
scrapedAt | string | ISO 8601 timestamp of extraction |
FAQ
What is one record — a professor or a review?
A review, when includeRatings is true: each record carries the professor and school fields alongside that single rating. Set includeRatings to false and you get one record per professor instead.
Do I need a school ID, or will a name do?
A name is fine. Arizona State University resolves on its own. Pass an ID when a name is ambiguous.
Does this need an account or API key?
No. It reads the same public GraphQL API the website uses.
Why are there both school_id and school_legacy_id?
RateMyProfessors migrated to base64 global IDs and kept the numeric ones. Both are emitted so records join against old and new datasets alike.
How do I keep a large school from producing a huge bill?
Start with includeRatings: false to size the professor count, then decide whether the full corpus is worth it and set maxItems accordingly.
Need More Features?
Need department filters or date-bounded rating pulls? Open an issue on the actor.
Why Use RateMyProfessors Scraper?
- Full review corpus, not just averages — Comment text, course code, grade and tags on every record, which is what makes the data usable for research rather than browsing.
- Names resolve to IDs automatically — No pre-step to look up school identifiers.
- Pay per record — Pull one department or a whole university and pay for exactly what comes back.