爬取耶鲁大学公开课

  耶鲁大学(Yale University)是一所坐落于美国康涅狄格州纽黑文的私立研究型大学,创于1701年,初名“大学学院”(Collegiate School),是全美历史第三悠久的高等学府,亦为常春藤盟校成员之一。该校教授阵容、学术创新、课程设置和场馆设施等方面堪称一流。除了研究生课程之外,耶鲁同时也非常注重本科生教育。在各个大学排名榜单中,都一直名列前茅。

  所以,我们今天的目标是爬取耶鲁大学公开课信息,并将它们加以保存。

首先,我们打开耶鲁大学公开课的首页进行分析。可以看到,在表格中有着许多课程,这就是我们要爬取其中之一。。

然后点击“检查”,查看这些信息在网页中的位置以及属性。

现在进入课程页面,点击一门课程,可以看到课程的详细信息,包括课程名称,课程描述等信息。

同样的,我们也要得到它们的属性

最后,在确定我们要爬取的信息的属性之后,我们就可以编写代码进行爬取了。

在爬取之前,我们先确定思路:

1、爬取首页中所有课程中的URL并保存。

2、然后根据爬取到的URL,分别爬取课程的详细信息并保存。

3、在爬取所有的课程信息之后,将爬取的课程信息保存为csv文件保存在本地

首先我们编写爬取首页的代码:

# 获取列表中的URL
def getDetailsUrl(url):  # 爬取列表中课程类别和子链接到列表中
    r = requests.get(url)
    r.encoding = ‘utf8‘
    soup = BeautifulSoup(r.text, ‘lxml‘)
    # 获取课程类别
    depa = soup.find_all(‘td‘, {‘class‘: ‘views-field views-field-title active‘})
    for i in depa:
        # 课程标题
        m = i.text
        Course_Title.append(m.replace(‘\n‘, ‘‘))
        # 课程类别
        n = i.find(‘a‘)
        Department.append(n.text)
    # 获取课程子连接
    link = soup.find_all(‘td‘, {‘class‘: ‘views-field views-field-title-1‘})
    for i in link:
        # 课程子链接
        n = i.find(‘a‘)
        ListUrl.append(n[‘href‘])

然后,我们开始编写爬取课程信息代码:

经过分析,所有的课程界面的网页结构都是相同的,所以我们可以利用同一个函数来进行爬取,而且所有的课程链接组成为:https://oyc.yale.edu+课程子链接

# 获取子网页中的内容
def getText():
    # 页数
    page = 1
    for i in range(len(ListUrl)):
        url = ‘https://oyc.yale.edu‘ + ListUrl[i]
        print(‘第{}个链接:{}‘.format(page, url))
        page = page + 1
        r = requests.get(url)
        r.encoding = ‘utf8‘
        soup = BeautifulSoup(r.text, ‘lxml‘)
        # 课程编号
        aa = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-course-number‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        aa.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Course_Number.append(aa)
        # 关于课程
        bb = soup.find(‘div‘, {‘class‘: ‘views-field views-field-body‘}).find(‘div‘, {‘class‘: ‘field-content‘}).text
        bb.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        About_the_Course.append(bb)
        # 课程结构
        cc = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-course-structure‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        cc.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Course_Structure.append(cc)
        # 讲课教授
        dd = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-professor-name‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        dd.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Professor.append(dd)
        # 课程描述
        ee = soup.find(‘div‘, {‘class‘: ‘views-field views-field-body‘}).find(‘div‘, {‘class‘: ‘field-content‘}).text
        ee.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Description.append(ee)
        # 课程资料
        ff = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-syllabus-texts‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        ff.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Texts.append(ff)

        # 随机暂停,防止被封
        time.sleep(random.randint(1, 6))

在爬取完课程信息后,我们就可以将这些信息进行保存:

    # CSV标题
    l = [‘Department‘, ‘Course_Number‘, ‘Course_Title‘, ‘About_the_Course‘, ‘Course_Structure‘, ‘Professor‘,
         ‘Description‘, ‘Texts\n‘]
    choose = 1
    for i in range(len(ListUrl)):
        all = [Department[i],
               Course_Number[i],
               Course_Title[i],
               About_the_Course[i],
               Course_Structure[i],
               Professor[i],
               Description[i],
               Texts[i]]
        with open(‘123.csv‘, ‘a+‘, newline=‘‘, encoding=‘uft8‘) as csvfile:
            writer = csv.writer(csvfile)
            if choose == 1:
                writer.writerow(l)
                choose = 10
            writer.writerow(all)

最后,我们将这些代码结合起来,加入首页的URL,组合成为一个项目。

运行程序后,可以得到一个csv文件,如下

打开csv文件,就可以看到所爬取到的课程信息了,如下图所示:

完整程序代码如下:

import csv
import time
import random
import requests
from bs4 import BeautifulSoup

all = []  # 转存数据
Department = []  # 课程类别
Course_Title = []  # 课程名称
ListUrl = []  # 课程子链接
Course_Number = []  # 课程编号
About_the_Course = []  # 关于课程
Course_Structure = []  # 课程结构
Professor = []  # 讲课教授
Description = []  # 课程描述
Texts = []  # 相关资料

# 获取列表中的URL
def getDetailsUrl(url):  # 爬取列表中课程类别和子链接到列表中
    r = requests.get(url)
    r.encoding = ‘utf8‘
    soup = BeautifulSoup(r.text, ‘lxml‘)
    # 获取课程类别
    depa = soup.find_all(‘td‘, {‘class‘: ‘views-field views-field-title active‘})
    for i in depa:
        # 课程标题
        m = i.text
        Course_Title.append(m.replace(‘\n‘, ‘‘))
        # 课程类别
        n = i.find(‘a‘)
        Department.append(n.text)
    # 获取课程子连接
    link = soup.find_all(‘td‘, {‘class‘: ‘views-field views-field-title-1‘})
    for i in link:
        # 课程子链接
        n = i.find(‘a‘)
        ListUrl.append(n[‘href‘])

# 获取子网页中的内容
def getText():
    # 页数
    page = 1
    for i in range(len(ListUrl)):
        url = ‘https://oyc.yale.edu‘ + ListUrl[i]
        print(‘第{}个链接:{}‘.format(page, url))
        page = page + 1
        r = requests.get(url)
        r.encoding = ‘utf8‘
        soup = BeautifulSoup(r.text, ‘lxml‘)
        # 课程编号
        aa = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-course-number‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        aa.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Course_Number.append(aa)
        # 关于课程
        bb = soup.find(‘div‘, {‘class‘: ‘views-field views-field-body‘}).find(‘div‘, {‘class‘: ‘field-content‘}).text
        bb.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        About_the_Course.append(bb)
        # 课程结构
        cc = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-course-structure‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        cc.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Course_Structure.append(cc)
        # 讲课教授
        dd = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-professor-name‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        dd.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Professor.append(dd)
        # 课程描述
        ee = soup.find(‘div‘, {‘class‘: ‘views-field views-field-body‘}).find(‘div‘, {‘class‘: ‘field-content‘}).text
        ee.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Description.append(ee)
        # 课程资料
        ff = soup.find(‘div‘, {‘class‘: ‘views-field views-field-field-syllabus-texts‘}).find(‘div‘, {
            ‘class‘: ‘field-content‘}).text
        ff.replace(‘\n‘, ‘‘).replace(‘,‘, ‘.‘)
        Texts.append(ff)

        # 随机暂停,防止被封
        time.sleep(random.randint(1, 6))

if __name__ == ‘__main__‘:
    url = ‘https://oyc.yale.edu/courses‘
    getDetailsUrl(url)
    getText()
    # CSV标题
    l = [‘Department‘, ‘Course_Number‘, ‘Course_Title‘, ‘About_the_Course‘, ‘Course_Structure‘, ‘Professor‘,
         ‘Description‘, ‘Texts\n‘]
    choose = 1
    for i in range(len(ListUrl)):
        all = [Department[i],
               Course_Number[i],
               Course_Title[i],
               About_the_Course[i],
               Course_Structure[i],
               Professor[i],
               Description[i],
               Texts[i]]
        with open(‘123.csv‘, ‘a+‘, newline=‘‘, encoding=‘uft8‘) as csvfile:
            writer = csv.writer(csvfile)
            if choose == 1:
                writer.writerow(l)
                choose = 10
            writer.writerow(all)

原文地址:https://www.cnblogs.com/Y-xp/p/12079905.html

时间: 2024-10-12 15:43:35

爬取耶鲁大学公开课的相关文章

斯坦福大学公开课:iOS 7应用开发 笔记

2015-07-06 第一讲   课务.iOS概述 -------------------------------------------------- 开始学习斯坦福大学公开课:iOS 7应用开发留下笔记

奇点大学公开课之尼葛洛庞帝讲述物联网和智能设备

前沿: 昨天无意间看到了奇点大学公开课的这么一个视频,里面讲述正是我一直喜爱的一直寻找的前沿科技,物联网和下一个工业革命. 1,尼葛洛庞帝讲述什么是物联网? 起始我的认知是物流联网是让每个物品能够交流,能够沟通的,但是这对我来说就是一个概念,今天在听完大师讲述完之后,我才幡然醒悟,我们的物联网不是用手机控制家里的某个物品,不是我在公司用手机把电视机关闭,把电灯关闭,不是把门关闭,而是没个物品都是有自己的智慧,我们要想想那种场景,我在公司,家里的电视机能自动关闭,电灯能自动关闭,家里的吸尘器能自己

《斯坦福大学公开课:编程方法学》随笔

这是观看网易公开课 Mehran Sahami教授的<斯坦福大学公开课:编程方法学>后的随笔. 目前只看到第三次课,<Karel与Java>,我的收获有以下要点: 1.软件工程跟普通的写代码是不同的.软件应该考虑很多东西,比如:可移植性.便于升级维护等等,而不仅仅是写出代码实现功能那么简单. 2.代码是写给机器执行的,但更重要的是人要让人能看懂.(代码后期维护等等的工作量或者时间是写代码的10倍及更多,所以让代码更规范更易被人读懂很重要) 3.准确定义一个函数.一个类.一个包的功能

使用selenium + chrome爬取中国大学Mooc网的计算机学科的所有课程链接

目的:使用selenium + chrome爬取中国大学Mooc网计算机学科的所有的课程链接列表 思路:找到每个分页的节点属性为class="m-course-list" 的div元素,再找到该元素下面的类属性为class = "u-clist f-bg f-cb f-pr j-href ga-click"的div元素的属性data-href的值,使用xpath获取. 难点:在网页源码里面,是看不到相关的课程链接信息,点击分页,发现地址栏的url一直都在变,但改变u

python爬取中国大学排名

教程来自:[Python网络爬虫与信息提取].MOOC. 北京理工大学 目标:爬取最好大学网前50名大学 代码如下: import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text exce

爬取中国大学排名

我们需要爬取2019年中国内地的大学排名,这里以物理学科为例,http://www.zuihaodaxue.cn/BCSR/wulixue2019.html. 这个页面比较简单爬取难度不大,这里我们使用python的requests,bs4,BeautifulSoup库,关于BeatutifulSoup库的文档可以在这个网站查询https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ 先定义一个get函数来爬取相关信息 def get(url): tr

Python爬虫——定向爬取“中国大学排名网”

内容整理自中国大学MOOC——北京理工大学-蒿天-Python网络爬虫与信息提取 相关实战章节 我们预爬取的url如下 http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html 网页节选 在浏览器中读取网页源代码 可以 发现表格数据信息是直接写入HTML页面信息中,所以我们可以直接采取定向爬虫操作. 我们的整体设计思路如下: 1.从网络上获取大学排名网络内容 2.提取网页内容中信息到合适的数据结构 3.利用数据结构展示并输出结果 仔细观察可以发现

斯坦福大学公开课:iPad和iPhone应用开发(iOS5) 学习笔记 2

继续学习公开课 第二节课做了一个简单的计算器作为例子.大概Touch了如下知识点: 讲解了XCode4,我看了一下最新下载的是XCode8了. XCode创建工程, singleViewApplication还是有的,界面对比起XCode4来,更简洁些了,操作跟视频讲解里的差不多. 体会了下第一节课讲的MVC View的代码看不到这个感觉不太爽,特别是前面操作是将number的button拷贝到了 operation的 button,结构导致operation button也都连接到了digit

用Python实现一个爬取XX大学电费通知的小脚本

内容简要 1分析网站 2简单爬取 3进阶自定义爬取 4保存进数据库 学校基础设施太差,宿舍电量过低提醒虽然贴在楼下,但是作为低头一族,经常忘记看提醒导致宿舍酣战时突然黑屏,为了避免这种尴尬的场景以及强化PY学习,我决定制作一个简单的爬虫. 首先我通过学校的微信公众号找到了一个十分隐蔽的查低电量提醒网站.它的界面是这样的: 手机适应的页面当然在电脑上会有一些崩=.=,但是不要介意,我们要的是功能.下面是查询到的界面 虽然看起来low而且经常不更新,但是它至少能用.于是我决定用它来制作低电量提醒查询