OrbTop

RateMyProfessors — Professor Ratings Scraper

EDUCATIONLEAD GENERATION

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: false gives 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

  1. You supply school names or IDs in schools.
  2. Each name is resolved to a RateMyProfessors school ID.
  3. Every professor at the school is collected with their aggregate scores.
  4. When includeRatings is true, the full rating corpus for each professor is pulled and emitted one record per review, stopping at maxItems.

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.