xml地图|网站地图|网站标签 [设为首页] [加入收藏]

Python爬取Coursera课程财富的亲力亲为进程,coursera课程能源

时间:2020-01-04 21:40来源:计算机
Python爬虫相关:教怎获取Coursera全体课程列表? coursera的网页中包涵javascript,不运营只查看网页源代码是看不见你想要的事物的,所以爬起来很蛋疼。提出利用webkit,大概看有的别样关

Python爬虫相关:教怎获取Coursera全体课程列表?

coursera的网页中包涵javascript,不运营只查看网页源代码是看不见你想要的事物的,所以爬起来很蛋疼。提出利用webkit,大概看有的别样关于网页中含有JavaScript的拆解分析方法。  

Python爬取Coursera课程财富的详实经过,coursera课程能源

一时大家供给把有些杰出的东西收藏起来,时时回味,而Coursera上的后生可畏对科目无疑便是精华之作。Coursera中的大部分完成课程都提供了完整的配套传授能源,富含ppt,录像甚至字幕等,离线下来后会特别便利学习。很鲜明,大家不会去一个文本一个文本的下载,独有二货才那么干,程序猿都是聪明人!

那我们聪明人思谋如何做呢?当然是写叁个脚本来批量下载了。首先大家须要解析一入手工下载的流水线:登陆本人的Coursera账户(有的课程必要大家登陆并选课后技能看出相应的财富卡塔尔(قطر‎,在科目能源页面里,找到相应的文书链接,然后用心仪的工具下载。

不会细小略是啊?大家得以用程序来效仿以上的步骤,那样就可以解放双臂了。整个程序分成两个部分就能够了:

登入Coursera;在课程能源页面里面找到财富链接;依照财富链接接纳相符的工具下载能源。

上边就来具体的落到实处以下吧!

登录

刚开首时和睦并从未拉长登入模块,觉得访客就足以下载相应的教程财富,后来在测量检验comnetworks-002那门科目时意识访客访谈财富页面时会自动跳转到登入分界面,下图是chrome在隐身形式访谈该学科能源页面时的气象。

图片 1

要想模仿登入,我们先找到登入的页面,然后利用google的Developer Tools解析账号密码是哪些上传来服务器的。

咱俩在报到页面包车型地铁表单中填入账号密码,然后点击登陆。与此同不常候,大家要求双目紧盯Developer Tools——Network,找到提交账号音信的url。经常情形下,假如要向服务器交由新闻,日常都用post方法,这里大家只须求先找到Method为post的url。喜剧的是,每一回登陆账号时,Network里面都找不到提交账户音讯的地址。揣度登入成功后,直接跳转到登入成功后的页面,想要找的内容风流倜傥闪而过了。

于是乎就不管道输送入了风姿罗曼蒂克组账号密码,故意登入失利,果真找到了post的页面地址,如下图:

图片 2

地址为:https://accounts.coursera.org/api/v1/login。为了知道向服务器交由了什么内容,进一层观望post页面中表单中内容,如下图:

图片 3

咱俩看看风流罗曼蒂克共有八个字段:

email:账号的挂号邮箱password:账号密码webrequest:附加的字段,值为true。

接下去就开端写吗,笔者选取用python的Requests库来模拟登陆,关于Requests官方网站是这么介绍的。

Requests is an elegant and simple HTTP library for Python, built for human beings.

其实requests用起来实在轻松方便,不亏是非常为全人类设计的http库。requests提供了Session对象,可以用来在不一样的乞求中传递一些长期以来的多寡,举个例子在历次诉求中都带入cookie。

始于的代码如下:

signin_url = "https://accounts.coursera.org/api/v1/login"
logininfo = {"email": "...",
             "password": "...",
             "webrequest": "true"
             }

user_agent = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) "
              "AppleWebKit/537.36 (KHTML, like Gecko) "
              "Chrome/36.0.1985.143 Safari/537.36")

post_headers = {"User-Agent": user_agent,
                "Referer": "https://accounts.coursera.org/signin"
                }
coursera_session = requests.Session()

login_res = coursera_session.post(signin_url,
                                  data=logininfo,
                                  headers=post_headers,
                                  )
if login_res.status_code == 200:
    print "Login Successfully!"
else:
    print login_res.text

将表单中付出的剧情存放在词典中,然后作为data参数字传送递给Session.post函数。日常景色下,最棒是增添乞求User-AgentReferer等乞请底部,User-Agent用来模拟浏览器央求,Referer用来告诉服务器本身是从referer页面跳转到须要页面包车型大巴,不常候服务器会检查供给的Referer字段来确定保障是从固定地点跳到当前伏乞页的。

地点片段的运作结果很想得到,呈现如下音信:Invalid CSRF Token。后来在github上面找出到一个Coursera的批量下载脚本,开掘人家发送页面必要时headers多了XCSRF2Cookie, XCSRF2Token, XCSRFToken, cookie4个字段。于是又重新看了一下post页面的乞请尾部,开采确实有那多少个字段,推测是服务器端用来做一些限量的。

用浏览器登陆了三次,开采XCS凯雷德F2Token, XCSHavalFToken是长度为24的妄动字符串,XCS奥迪Q7F2Cookie为"csrf2_token_"加上长度为8的率性字符串。可是一贯没搞了解Cookie是怎么求出来的,可是看github上边代码,Cookie有如只是"csrftoken"和其余八个的组合,试了弹指间居然能够。

在原本的代码上加多以下局地就丰硕了。

def randomString(length):
    return ''.join(random.choice(string.letters + string.digits) for i in xrange(length))
XCSRF2Cookie = 'csrf2_token_%s' % ''.join(randomString(8))
XCSRF2Token = ''.join(randomString(24))
XCSRFToken = ''.join(randomString(24))
cookie = "csrftoken=%s; %s=%s" % (XCSRFToken, XCSRF2Cookie, XCSRF2Token)
post_headers = {"User-Agent": user_agent,
                "Referer": "https://accounts.coursera.org/signin",
                "X-Requested-With": "XMLHttpRequest",
                "X-CSRF2-Cookie": XCSRF2Cookie,
                "X-CSRF2-Token": XCSRF2Token,
                "X-CSRFToken": XCSRFToken,
                "Cookie": cookie
                }

从那之后登入功效开始达成。

深入分析能源链接

登陆成功后,大家只供给get到财富页面的内容,然后过滤出本身须要的能源链接就可以了。能源页面包车型地铁地址不会细小略,为https://class.coursera.org/name/lecture,个中name为课程名称。比方对于课程comnetworks-002,能源页面地址为

抓取到页面财富后,大家需求解析html文件,这里选择采取BeautifulSoup。BeautifulSoup是叁个得以从HTML或XML文件中领取数额的Python库,相当强盛。具体行使官方网址络有很详细的文书档案,这里不再赘言。在使用BeautifulSoup前,大家还得寻找财富链接的规律,方便大家过滤。

个中课程每一周的总标题为class=course-item-list-header的div标签下,每一周的教程均在class=course-item-list-section-list的ul标签下,每节课程在二个li标签中,课程能源则在li标签中的div标签中。

翻开了几门科目之后,开采过滤能源链接的措施相当粗略,如下:

ppt和ppt能源:用正则表明式相称链接;字幕能源:找到title="Subtitles (srt)"的标签,取其href质量;录像能源:找到title="Video (MP4)"的标签,取其href属性就能够。

字幕和摄像也得以用正则表达式过滤,但是用BeautifulSoup依照title属性来同盟,有更加好的易读性。而ppt和pdf能源,未有固定的title属性,只可以动用正则表明式来合作。

具体代码如下:

soup = BeautifulSoup(content)
chapter_list = soup.find_all("div", class_="course-item-list-header")
lecture_resource_list = soup.find_all("ul", class_="course-item-list-section-list")
ppt_pattern = re.compile(r'https://[^"]*.ppt[x]?')
pdf_pattern = re.compile(r'https://[^"]*.pdf')
for lecture_item, chapter_item in zip(lecture_resource_list, chapter_list):
    # weekly title
    chapter = chapter_item.h3.text.lstrip()
    for lecture in lecture_item:
        lecture_name = lecture.a.string.lstrip()
        # get resource link
        ppt_tag = lecture.find(href=ppt_pattern)
        pdf_tag = lecture.find(href=pdf_pattern)
        srt_tag = lecture.find(title="Subtitles (srt)")
        mp4_tag = lecture.find(title="Video (MP4)")
        print ppt_tag["href"], pdf_tag["href"]
        print srt_tag["href"], mp4_tag["href"]

下载能源

既然如此已经赢得了能源链接,下载部分就相当轻便了,这里自身选用使用curl来下载。具体思路很粗大略,正是出口curl resource_link -o file_name到叁个种子文件中去,例如到feed.sh中。那样只供给给种子文件试行权限,然后运转种子文件就可以。

为了方便分类课程能源,可感觉课程周周的标题创设多个文本夹,之后该周的兼具课程均下载在该目录下。为了便利大家连忙牢固到每节课的保有能源,能够把生机勃勃节课的全数能源文件均命名叫课名.文件类型。具体的落到实处比较简单,这里不再给出具体程序了。能够看一下四个测量试验例子中的feed.sh文件,部分剧情如下:

mkdir 'Week 1: Introduction, Protocols, and Layering'
cd 'Week 1: Introduction, Protocols, and Layering'
curl https://d396qusza40orc.cloudfront.net/comnetworks/lect/1-readings.pdf -o '1-1 Goals and Motivation (15:46).pdf'
curl https://class.coursera.org/comnetworks-002/lecture/subtitles?q=25_en&format=srt -o '1-1 Goals and Motivation (15:46).srt'
curl https://class.coursera.org/comnetworks-002/lecture/download.mp4?lecture_id=25 -o '1-1 Goals and Motivation (15:46).mp4'
curl https://d396qusza40orc.cloudfront.net/comnetworks/lect/1-readings.pdf -o '1-2 Uses of Networks (17:12).pdf'
curl https://class.coursera.org/comnetworks-002/lecture/subtitles?q=11_en&format=srt -o '1-2 Uses of Networks (17:12).srt'
curl https://class.coursera.org/comnetworks-002/lecture/download.mp4?lecture_id=11 -o '1-2 Uses of Networks (17:12).mp4'

到此处结束,大家早已打响达成爬取Coursera课程资源的目的,具体的代码放在gist上。使用时,大家只必要周转程序,并把课程名称作为参数字传送递给程序就足以了(这里的课程名称实际不是全体课程的总体名字,而是在课程介绍页面地址中的缩略名字,举例计算机Networks那门课,课程名称是comnetworks-002卡塔尔。

骨子里,那么些程序能够视作一个粗略的小爬虫程序了,上面粗略介绍下爬虫的定义。

少数都不轻松的爬虫

关于怎么样是爬虫,wiki上是这么说的

A Web crawler is an Internet bot that systematically browses the World Wide Web, typically for the purpose of Web indexing.

爬虫的风姿罗曼蒂克体化布局图如下(图片来源wiki卡塔尔国:

图片 4

简单来说的话,爬虫从Scheduler中获取初阶的urls,下载相应的页面,存款和储蓄有用的多寡,相同的时候深入分析该页面中的链接,借使已经访谈就pass,没访谈的话到场到Scheduler中等待抓取页面。

当然有局地公约来约束爬虫的行为标准,比方多数网址都有三个robots.txt文件来规定网址怎样内容能够被爬取,哪些不得以。

各种寻觅引擎背后都有叁个强硬的爬虫程序,把触角伸到网络中的全部犄角,不断去搜集有用音信,并成立目录。这种寻找引擎品级的爬虫达成起来特别复杂,因为互连网上的页面数量太过宏大,只是遍历他们就曾经很狼狈了,更毫不说去解析页面音讯,并创设目录了。

实际行使中,大家只须求爬取特定站点,抓取小量的能源,那样完毕起来大约超多。然而仍有好些个让人高烧的难点,例如多数页面成分是javascript生成的,那时候大家供给二个javascript引擎,渲染出全体页面,再加以过滤。

更不佳的是,好些个站点都会用一些格局来堵住爬虫爬取财富,比如节制同意气风发IP意气风发段时间的拜望次数,恐怕是节制若干次操作的年月间距,参预验证码之类。绝大相当多景观下,我们不精通服务器端是怎么样幸免爬虫的,所以要想让爬虫职业起来实在挺难的。

开放课程 Coursera 有什优点?

在这里之后小编还选用性的上了此外的几门课,可是因为收获相当的小上了后生可畏两周便退了。一门是UW的Computational Method for Data Analysis,相当于选拔数学系的大三大四科目,包蕴Fourier转变wavelet调换以致在图像处理和时限信号管理方面包车型地铁采纳, 另一门也是UW的Scientific Computing,约等于国内的精兵简政办法。Rice的那门科目助教是周详计划的,专门为在线学习录像的录像,做的project也是天下的同窗们任意分到其余人的体系打分,然后取中位数是你每一次作业的分数。而UW的两门课就是一贯的在UW的教学录制,再加上机器批阅和修改的功课,相比较没趣。所以Coursera上的教程也是勾兑的,必要筛选,不过完全来看质量依然相比较高的。小编后天策画攻读一些社科类的课程,以往等待开学的有八个塞尔维亚共和国语作文的教程和三个经济学入门课程,前面二个是Ohio州立,前面一个是海得拉巴大学的。期望。笔者翻出来刚刚上完Python那门课时写的生龙活虎篇博客,抄过来大家看看。I took my first online course on Coursera, Introduction to Interactive Programming in Python. I want to share my feeling communicating with my classmates in the discussion forum.First, everybody was encouraged to make even very small improvements. When doing the mini-project, some guys added very little features with few lines of codes, everybody gave positive feed- backs, innovation, no matter how small, was welcomed. But in our learning atmosphere, if one guy says he know 1+2 = 3 from 1+1 =2, nobody will give it a credit, because it is so simple and will be regarded as meaningless. However. as this altitude is forged in a learner's mind, he will dare not and will not be able to make big improvements or innovation.Second, age is not the problem. As sharing is encouraged by sharing tutorial videos on YouTube, I watched some of them. I find a boy under 7 gave one of the videos! I am so surprised that he talked with great confidence and 气场(how to translate?卡塔尔国. On Ted, there was one 14-year-old guy who made nuclear fusion, but this 7-year-old boy......余下全文>>  

偶然候我们要求把生机勃勃部分经文的事物收藏起来,时时回味,而Coursera上的一些科目无疑就...

编辑:计算机 本文来源:Python爬取Coursera课程财富的亲力亲为进程,coursera课程能源

关键词: