RateMyProfessors — Professor Ratings Scraper
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
- Reads the public GraphQL API directly, so no browser and no proxy overhead
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.