利用Python爬取Twinkl上的教学资源

在线教育网站Twinkl最近宣布,任何人都可以获得为期一个月的会员资格(注册网址:www.twinkl.com/offer ,注册时输入代码: USATWINKLHELPS)。Twinkl上的教育资源主要面向学前、小学教育,资源格式一般为PPT和PDF,制作精美,学前班和小学教师应该会非常喜欢。最近写了个批量爬取脚本,放上来交流一下。

一、思路分析

暂时没有发现 Twinkl上的资源是否存在一个全局的索引规则,所以我们可以首先选定某一个分类目录,从而批量下载该目录下的所有资源。如下图,每一个分类目录下有若干页面。每个页面有12个资源,除了第一页的链接需要手动获取外,后面第N页的链接格式为:第一页链接/N。

查看页面源代码,发现每一个资源都对应一个li标签,例如:

其中入口链接为<a>标签的href属性,缩略图链接为<img>标签的src属性或data-src属性,资源标题为<h2>标签内的文本。

进入任意资源页面,很容易可以看到下载入口链接下面的id为download_link的<a>标签内:

访问此链接,可以通过post请求获得真实下载地址(这一步会校验登陆状态和会员资格)。下面图中location这一项即为真实下载地址,可以利用脚本获取。

此外,这里还可以顺便获得用户cookie,以便模拟登陆:

到这里,基本就可以理顺思路了。

二、功能实现

1.导入库

这里要用到如下库:

2.获取所有目录页面

此函数输入值为手动设置的初始链接(初始链接一般设为某一目录下的第一页),输出值为所有页面的序号和对应链接。

3.获取资源列表

输入值为上一步获得的页面链接,批量获取每一个页面中每一个资源对应的入口链接和缩略图链接,最后汇总为一个列表。实际测试时总是在获取缩略图时报错,检查发现缩略图属性名称不统一,所以用了一个异常处理语句。

4.获取真实下载链接

这两个函数分别用来获取下载入口链接和对应的真实地址。

5.下载资源

由于在下载链接中看不到文件格式,所以预设了几个可能的后缀名,通过判断语句来确定。

6.调取函数运行

调取上面的函数来实现爬取功能。若出现报错,则异常处理语句可保证脚本正常运行,同时自动等待一定时间。

7.主程序

直接利用cookie模拟登陆。可重新开始下载报错的项目。

三、其他说明

  • 经测试,整个脚本基本可以稳定运行,但是爬取到第八页之后经常出现报错现象;有时还有网络请求错误。有想法的朋友可以交流下。
  • 这个脚本仅模拟手工操作过程,不会对服务器造成额外负担。
点滴分享. permalink.

本站采用Disqus评论系统,可能需要科学上网才能正常评论。