看雪学院是看雪论坛(https://www.kanxue.com/)下面的一个mooc平台,上面有一些性价比很高的安全课程。
下面介绍如何使用python来爬取看雪学院上已购买的课程。

环境

  • window 7 x64
  • python3.7 (Anaconda 3)
  • vscode
    使用python包有
  • requests 模拟http请求
  • bs4 解析html文档
  • re 正则表达式库

代码实现

这个爬虫很简单,直接上代码。

#-*- coding:utf-8 -*-
# kanxue_spider.py
#使用方法 python kanxue_spider.py [课程章节页url]
#如python kanxue_spider.py https://www.kanxue.com/book-section_list-40.htm
import requests
from requests.packages import urllib3
import os,re
import hashlib
from bs4 import BeautifulSoup#全局变量
#requests库使用headers
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0','Referer':'https://www.kanxue.com/'
}home = 'https://www.kanxue.com/'
#cookies,如何得到见下文
cookies_str = "xxxxx"
s = requests.Session()
cookies={}#根据url下载视频,保存为filename
def download_video(video_url,filename):headers1 = {'Referer':'https://www.kanxue.com/','Host':'video.kanxue.com','Accept':'video/webm,video/ogg,video/*;q=0.9,application/ogg;q=0.7,audio/*;q=0.6,*/*;q=0.5','User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0'}res1 = s.get(video_url, headers=headers1,cookies=cookies,stream=True)with open(filename, "wb") as f:for chunk in res1.iter_content(chunk_size=1024):if chunk:f.write(chunk)print(filename,'下载完毕')#生成x的md5值
def md5(x):m = hashlib.md5()m.update(x.encode('utf-8'))return m.hexdigest()#根据uri返回完成的url
def get_complete_url(x):url = ''if x.startswith('http'):url = xelif x.startswith('//'):url = 'https:'+xelif x.startswith('/'):url = home[:-1]+xelse:url = home + xreturn url#下载网课的web页面,因为其中含有一些文档
def download_html(html,filename):#解析html文档soup = BeautifulSoup(html,'lxml')data = html#静态文件的存储目录static_files_path = 'data/static'#该目录不存在的话,将其创建if not os.path.isdir(static_files_path):os.mkdir(static_files_path)#爬取页面中的css文件for tag in soup.find_all('link'):css_url = get_complete_url(tag['href'])#print(css_url)target_filename = '%s\\%s' % (static_files_path,md5(css_url))if not os.path.isfile(target_filename):with open(target_filename,'w',encoding='utf-8') as f:r = s.get(css_url,headers=headers,verify=False,cookies=cookies)f.write(r.text)#将原始页面中的路径替换成本地的相对路径data = data.replace(tag['href'],'../../static/%s' % md5(css_url))#爬取页面中的js文件for tag in soup.find_all('img'):img_url = get_complete_url(tag['src'])#print(img_url)target_filename = '%s\\%s' % (static_files_path,md5(img_url))if not os.path.isfile(target_filename):with open(target_filename,'wb') as f:r = s.get(img_url,headers=headers,verify=False,cookies=cookies)f.write(r.content)#将原始页面中的路径替换成本地的相对路径data = data.replace(tag['src'],'../../static/%s' % md5(img_url))#爬取页面中的js文件for tag in soup.find_all('script'):if not tag.get('src',''):continuejs_url = get_complete_url(tag['src'])#print(js_url)target_filename = '%s\\%s' % (static_files_path,md5(js_url))if not os.path.isfile(target_filename):with open(target_filename,'w',encoding='utf-8') as f:r = s.get(js_url,headers=headers,verify=False,cookies=cookies)f.write(r.text)#将原始页面中的路径替换成本地的相对路径data = data.replace(tag['src'],'../../static/%s' % md5(js_url))with open('%s.html'%filename,'w',encoding='utf-8') as f:f.write(data)print('%s.html'%filename,'下载完毕')#爬取课时内容,
#keshi_url为课时的url,filename为课时的名字
def spider_keshi(filename,keshi_url):res = s.get(keshi_url,headers = headers,cookies= cookies,verify=False)if res.status_code ==  200:#使用正则表达式找到视频的地址x = re.findall(r'value="(https://video.kanxue.com/.*?)"',res.text)if x:video_url = x[0]#print(video_url)video_filename = '%s.mp4'%filename#若视频文件不存在if not os.path.isfile(video_filename):#下载视频download_video(video_url,video_filename)#下载课时的页面      download_html(res.text,filename)#爬虫主函数
def main():#声明全局变量global headers,cookies#加载cookiesfor item in cookies_str.split(';'):k,v = item.strip().split('=')cookies[k] = vres = s.get(url=home,headers=headers,cookies=cookies)res1 = s.get(sys.argv[1],headers = headers,cookies = cookies,verify = False)if res1.status_code == 200:#解析html文档soup = BeautifulSoup(res1.text,'lxml').find('div',id='section_list')course_name = soup.b.text.strip()for li in soup.find_all('li',class_='mb-1'):#章的名称zhang_tilte = li.span.text.strip()#print(zhang_tilte)#构造存储路径path = 'data\\%s\\%s' % (course_name,zhang_tilte)#若该路径不存在,将其创建if not os.path.isdir(path):os.makedirs(path)#找到所有的课时for a in li.find_all('a'):#课时的titlekeshi_title = a['title'].replace('/','_')#课时完整的urlkeshi_url = 'https://www.kanxue.com/'+a['href']#爬取课时内容spider_keshi('%s\\%s' % (path,keshi_title),keshi_url)main()

如何使用这个代码

首先需要使用Firefox或Chrome,用用户名密码登陆看雪学院,按F12打开开发者工具,在控制台中输入document.cookie,右键复制对象,将cookies复制赋值给代码中的全局变量cookies_str

找到需要下载的课程,在课程主页中打开课程章节,如下图

这个url为脚本的第1个参数

参考资料

  • requests如何下载二进制流文件
    https://2.python-requests.org//zh_CN/latest/user/quickstart.html#id5

如何爬取看雪学院的课程相关推荐

  1. python爬取看雪论坛的所有主题帖的回复消息

    最近因为实验课题的需要,我们对看雪论坛的消息回复进行爬取, https://bbs.pediy.com/(看雪论坛) 对于看雪论坛的消息回复查看的一般顺序为: 进入看雪论坛的主页----->选择 ...

  2. 看雪学院课程《汇编语言详解与二进制漏洞初阶》笔记

    前言和声明 安全工程师这条路任重道远.如今国际形势复杂,网络战一旦爆发,安全势力弱的一方很快会处于竞争的下风,加上国家的安全人才缺口过大,我辈则应当肩挑重担,为祖国安全尽一份力. 本博客是博主在学习看 ...

  3. 看雪学院-解密入门教学(二)笔记

    解密入门教学(二)- 看雪学院 原作地址:http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458281884&idx=2&a ...

  4. scrapy框架 爬取重庆工程学院

    scrapy框架 爬取重庆工程学院 目的:爬取重庆工程学院 中的管理学院的学院动态 百度搜索重庆工程学院,看到如图所示 因为我使用scarpy框架,不知道如何创建项目的,可以看看我之前的文章(简单的理 ...

  5. 看雪学院-OllyDBG入门系列(四)内存写入 笔记

    看雪学院-OllyDBG入门系列(四)内存断点 笔记 原作地址:http://bbs.pediy.com/showthread.php?threadid=21378 作者:CCDebuger 在 Ol ...

  6. DLL注入的方式 (转载自看雪学院)

    DLL 注入技术的 N 种姿势 看雪学院 看雪学院,为IT专业人士.技术专家提供了一个民间交流与合作空间. 18 人赞同了该文章 本文中我将介绍DLL注入的相关知识.不算太糟的是,DLL注入技术可以被 ...

  7. 看雪学院-浅入浅出Android安全 笔记

    Note 看雪学院-浅入浅出Android安全 原作地址:http://www.kanxue.com/?article-read-547.htm 翻译作者:飞龙 Android 由四个层组成:Linu ...

  8. 看雪学院-OllyDBG入门系列(三)笔记

    原作地址:http://bbs.pediy.com/showthread.php?threadid=21330 作者:CCDebuger 看雪学院-OllyDBG入门系列(三)笔记 这样的编辑框中输注 ...

  9. 【免费报名】亚洲诚信看雪学院:“走进企业看安全”技术分享沙龙等你来侃~...

    看雪学院<走近企业看安全>系列活动,秉承以技术交流为主线的主旨,通过纯技术类交流,为企业与安全人士搭建起一个技术分享.交流的平台. 前期系列活动,带领大家走进知道创宇.百度.360.微软. ...

最新文章

  1. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  2. ios snapkit m_如何使用自动布局和SnapKit在iOS上创建漂亮的拉伸布局
  3. (C++)1010 一元多项式求导 --需二刷
  4. 看完 50000 张专辑封面,AI 设计师开始疯狂输出
  5. SGU 113 Nearly prime numbers
  6. 详解Linux2.6内核中基于platform机制的驱动模型 (经典)
  7. otc机器人氩弧焊机_轻松搞定砂光机前后连线翻转!【富全智能】全自动180度圆筒式翻板机...
  8. Redis五种数据结构
  9. @程序员,当你准备选择“这条路”,那么恭喜你,你的钱包可能要鼓了!
  10. LinuxQuestions.org庆祝16岁生日
  11. python 相对路径报错_小白学 Python(18):基础文件操作
  12. 详解Python使用模拟退火算法求解列表“最大值”
  13. SpringBoot项目中遇到的BUG
  14. 禁用linux的密码策略
  15. OpenCV的第一个小程序:读取图像并显示
  16. Linux开源字体——“文泉驿正黑”的安装命令
  17. 【多线程经典实例】实现一个线程安全的单例模式
  18. 大数据Hive(四):Hive查询语法
  19. Bug软件缺陷管理制度
  20. 单相逆变器的建模与仿真

热门文章

  1. xlsx表格怎么做汇总统计_excel不同表格中的数据该怎么汇总到一个表格?
  2. dubbo学习之源码
  3. 物联网操作系统有哪些特点
  4. vue 一键复制粘贴
  5. web安全-xss弹弹弹
  6. 【观察】浪潮信息:“All in 液冷”背后,加速推进液冷产业化
  7. 【半监督医学图像分割 2023 CVPR】UCMT 论文翻译
  8. php验证码类(分享)
  9. 电脑浏览器被劫持的用户求助
  10. 用h5简单实现APP帮助中心(FAQ),下次也可以用