从ratemyprofessor.com 提取数据

问题描述 投票:0回答:1

背景信息:我正在寻找从ratemyprofessor.com提取数据 - 我的编程经验有限,所以我决定看看是否预先构建了一些东西来完成此任务。

我在这里遇到了这个:https://classic.scraperwiki.com/scrapers/ratemyprofessors/

这正是我正在寻找的。 ScraperWiki 关闭了,但已将所有内容转移到 Morph.io - 我在这里做了:https://morph.io/reddyfire/ratemyprofessors

我的问题:它不起作用。它应该输出一个数据库,为我提供我确定需要的信息。我假设它与它从中提取的 URL 有关:

response = scraperwiki.scrape("http://www.ratemyprofessors.com/SelectTeacher.jsp?sid=%s&pageNo=%s" % (sid,str(i)))

但我不知道这是否正确。我对此感到非常沮丧,但我想继续寻找解决方案。

我需要什么:我正在寻找学院每位讲师的**姓名、部门、总评分、整体质量、轻松度和热度评分。以下是所需格式的一些示例输出:

 {"953":("Stanford",32),"799":("Rice",17),"780":("Princeton",16)}
python database web-scraping
1个回答
0
投票

我测试了为你做一个简化的刮刀。请注意,它不是 pythonic(即不美观或不快),但作为起点它是有效的。

__author__ = 'Victor'
import urllib
import re
url = 'http://www.ratemyprofessors.com/ShowRatings.jsp?tid=306975'

def crawlURL(addedURL):
    url = addedURL
    html = urllib.urlopen(url).read()

    teacherData = re.findall(r'\">(.*?)</',html)

    output = ''
    addStuff = 0
    for x in xrange(len(teacherData)):
        if teacherData[x] == 'Submit a Correction':
            output = 'professor: '
            for y in xrange(4):
                output += teacherData[x-8+y] + ' '
            addStuff = 1
        elif teacherData[x] == 'Helpfulness' and addStuff == 1:
            output += ': Overall quality: '+ str(teacherData[x-2]) + ': Average grade: ' + str(teacherData[x-1]) + ': Helpfulness: ' + teacherData[x+1]
        elif teacherData[x] == 'Easiness' and addStuff == 1:
            output += ': Easiness: ' + str(teacherData[x+1])
            addStuff = 0
            break
    print output
crawlURL(url)

它呈现此输出:

博士。 Kimora John Jay 学院 : 整体质量: 5.0: 平均成绩: 答:有用性:5.0 :轻松性:4.6

还有很大的改进空间,但这已经是我能得到的最接近的伪代码了。

在此示例中,它是一个打印输出的函数,如果您想将其添加到列表中,只需在末尾添加“返回输出”并使用“listName.append(crawlURL(url))”调用该函数

这是针对 Python 2.7 的

是的,它没有获得您请求的确切数据。它只是为你打开一扇门;)

编辑: 这是有关如何循环请求的示例

def crawlURL(addesURL):
    ...
    return output

baseURL = 'http://www.ratemyprofessors.com/ShowRatings.jsp?tid=306'
for x in xrange(50):
    url = baseURL + str(x+110)
    if crawlURL(url) != '': print crawlURL(url)

如果您正在迭代他们的所有数据,您应该考虑时不时地添加延迟,这样您就不会意外地对他们进行 DDoS。

© www.soinside.com 2019 - 2024. All rights reserved.