准备放寒假啦,爬取一些MOOC上的课程爬回家去看。
爬取的课程是北京大学的离散数学概论

其实GitHub有可以直接用的程序 但是我半路出家 不怎么会提交HTTP请求 所以直接用selenium简单粗暴了。
网页解析我用的是BeautifulSoup。
思路其实很简单了,直接在课件网页里面把每一个chapter里的每一个lesson的所有unit里的视频都拿下来就可以了。所以就直接嵌套循环就OK了。
遇到的一些困难:

  1. 课件部分的两个框都是隐藏的框,所以在模拟浏览器点击
    操作之前,都需要用JavaScript修改元素display的值

  2. 元素的id属性每一次点击都是不一样的,所以在定位元素的时候没有用id属性定位,用了title属性或者其他的属性。
  3. 另外就是 我没有办法用headless模式爬取网页,应该是我这边的环境问题,不知道各位有没有遇到这种情况。

代码:

# -*- coding:utf-8 -*-
import time
from selenium import webdriver
from bs4 import BeautifulSoup
import re
import json
from selenium.webdriver.chrome.options import Optionschrome_options = Options()
chrome_options.add_argument("--disable-gpu")
browser = webdriver.Chrome(executable_path='G:\\chromedriver.exe', options=chrome_options)
browser.get('https://www.icourse163.org/learn/NJTU-1002530017#/learn/content?type=detail&id=1004513821')    # 目标网页
time.sleep(3)
video = {}soup = BeautifulSoup(browser.page_source, 'html.parser')
c_l = soup.find("div", attrs={"class": "j-breadcb f-fl"})
chapter_all = c_l.find("div", attrs={"class": "f-fl j-chapter"})
chapter = chapter_all.find_all("div", attrs={"class": "f-thide list"})
for chap in chapter:js = 'document.querySelectorAll("div.down")[0].style.display="block";'browser.execute_script(js)chapter_name = chap.texta = browser.find_element_by_xpath("//div[@title = '"+chapter_name+"']")a.click()time.sleep(3)soup1 = BeautifulSoup(browser.page_source, 'html.parser')c_l1 = soup1.find("div", attrs={"class": "j-breadcb f-fl"})lesson_all = c_l1.find("div", attrs={"class": "f-fl j-lesson"})lesson = lesson_all.find_all("div", attrs={"class": "f-thide list"})for les in lesson:js1 = 'document.querySelectorAll("div.down")[1].style.display="block";'browser.execute_script(js1)lesson_name = les.textb = browser.find_element_by_xpath("//div[@title = '"+lesson_name+"']")b.click()time.sleep(3)soup2 = BeautifulSoup(browser.page_source, 'html.parser')units = soup2.find_all("li", attrs={"title": re.compile(r"^视频")})  # 只爬取视频课件 for unit in units:video_name = unit.get("title")video_link = browser.find_element_by_xpath("//li[@title = '"+video_name+"']")video_link.click()time.sleep(3)soup2 = BeautifulSoup(browser.page_source, 'html.parser')try:video_src = soup2.find("source")video[chapter_name + " " + lesson_name + video_name] = video_src.get("src")except:continue
browser.quit()

爬取完成的效果是这样的

写的不好,刚入门没多久,感兴趣可以对着原网页的源码慢慢看。
selenium 简单粗暴,但是爬取速度很慢,不如其他爬取方法。
以后还是要学会提交POST请求,有爬虫大佬带我入门就更好啦!
刚学没多久爬虫,也没啥计算机基础,第一次写东西,多多批评指正!

Selenium + Python + Chrome 中国大学慕课网视频爬取相关推荐

  1. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  2. Python爬虫:彼岸图网图片爬取

    杂 哈哈,这是我第一篇博客 半年以后回来再看发现这代码简直太难看了 现在已经弃用大小驼峰转蛇形命名了 确实好看 除了命名别的也写的不怎么样 因为爬虫只是个爱好所以也不准备再投入时间重构了 将就着看吧 ...

  3. Python爬虫学习教程 bilibili网站视频爬取!【附源码】

    Python爬虫学习教程,万物皆可爬!每个技术大牛都是从基础慢慢的提升上去的,基础知识越深以后的发展越牛!学好python,才能玩转python,那到底怎么才能学好python? 通过爬取b站案例带领 ...

  4. python高级语言程序设计答案_高级语言程序设计(Python)中国大学慕课查询答案...

    唐朝对大案.疑案常由大理寺.刑部和御史台会同审理,称()A.会审B.三司会审C.小三司D.三司推事 宋代法律效力高于律的法律形式是()A.敕B.令C.格D.式 压力的国际标准单位是mmHg柱. () ...

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

    目的:使用selenium + chrome爬取中国大学Mooc网计算机学科的所有的课程链接列表 思路:找到每个分页的节点属性为class="m-course-list" 的div ...

  6. 新农慕课python项目答案_2020中国大学慕课用Python玩转数据答案搜题公众号

    2020中国大学慕课用Python玩转数据答案搜题公众号 更多相关问题 低碳钥Q235钢板对接时,焊条应选用().A.E7015B.E6015C.E5515D.E4303 不属于无线宽带接入技术的() ...

  7. python数据挖掘方法及应用 大学期末考_中国大学慕课mooc数据挖掘与python实践期末答案...

    中国大学慕课mooc数据挖掘与python实践期末答案 2020-09-15 14:34:51 来源 : 热度 : 0 责任编辑 : 中国大学慕课mooc数据挖掘与python实践期末答案 更多相关[ ...

  8. python语言基础与应用考试题_中国大学慕课mooc_Python语言基础与应用_章节测试答案...

    中国大学慕课mooc_Python语言基础与应用_章节测试答案 更多相关问题 热力管道穿过楼板处应安装套管.套管应高出地面()mm..A . 20 B . 30 C.40 D. 50 预应力张拉锚固体 ...

  9. python编程基础课后答案-中国大学慕课moocPython编程基础课后答案

    中国大学慕课moocPython编程基础课后答案 更多相关问题 [问答题,简答题] 询问笔录的正文应围绕哪些情况进行记录? [单选] 升降式逆止阀应安装地()位置的管道上. [问答题,简答题] 简述事 ...

最新文章

  1. 超详干货!Linux 环境变量配置全攻略
  2. 微信的通讯录首字母滑动的实现
  3. 在Ubuntu中自动运行KMS服务
  4. 【收藏】使用springboot构建rest api远程提交spark任务
  5. gradle 指定springcloud 版本_springcloud小技能:服务注册发现如何隔离
  6. 与您相约.NET Conf China 2020! 新进2位重磅嘉宾
  7. define 汉字 error C2001: newline in constant
  8. 35岁程序员的独家面试经历
  9. 人脸关键点: DCNN-Deep Convolutional Network Cascade for Facial Point Detection
  10. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]
  11. 停止MySQL正在执行的SQL语句
  12. easyExcel实现excel文件上传和下载
  13. 高仿QQ空间广告位 ——— 一个位置来回切换两张广告图
  14. IntelliJ IDEA 超实用使用技巧分享
  15. More Grounded Image Captioning by Distilling Image-Text Matching Model
  16. 网易AI入选2018年杭州案例
  17. 【BlueZ】【蓝牙】跨平台实现Ble MasterSlaveMesh 之Linux篇-1
  18. 贝壳找房《2018城市居住报告》:新一线租房量持续攀升
  19. ssm+layui 超市管理系统 大学期末作业详解(1)
  20. 如何用迅雷下载OneDrive文件

热门文章

  1. 汽车天线连接器-市场现状及未来发展趋势
  2. 四、DMSP/OLS、NPP/VIIRS等夜间灯光数据能源碳排放空间化——反演
  3. Tone Mapping中luma滤波(降噪)对噪声放大的定性分析
  4. 乒乓球游戏-第12届蓝桥杯Scratch选拔赛真题精选
  5. Atlas 200 DK 系列--初级篇--图像分类应用的部署和使用
  6. SpringBoot无法接收到前端传来的json数据
  7. 用andengine做一款俄罗斯方块游戏
  8. FileNotFoundError: [WinError 3]系统找不到指定的路径
  9. 10% building 2/2 modules 0 active ERROR SyntaxError: Unexpected stringimport core-js/modules/es6.r
  10. 第一次参加区域赛之旅——2016 ACM/ICPC 大连站 感想