- -

  • 人生第一篇!冲冲冲
    • 项目来源
    • 梳理需求
    • casecode获取
    • 数据解析
    • 代码实现

人生第一篇!冲冲冲

在大一上通过学长的介绍认识到了CSDN并加入到今天也刚好是半年的时间,所以想着认认真真的写下我的第一篇博客,也算是对我学习生涯的一次成果验收。

项目来源

说来也是巧合,我是偶然看到学校兼职群里有个学姐发布了一个小兼职贴,内容是拿数据,并且票子给的还真不少,所以我们数据专业定在所不辞。

简单询问之后,学姐的意思大概是:有这么一个网站
需要将里面的小学课程,点开就是这样
将小学里的,语文、数学、英语、英语PEP(三年级后才有)的每个课程视频点击开,这里我们随便点开一个
在这一页中需要我们拿的数据为
另外还有视频链接与视频封面链接(这里学姐也是非常热情的向我讲解了如何获取到这两个东西,包括:页面空白处右键选择查看网页源代码、Ctrl+F打开搜索框,将m3u8,,,,,,,,,,,,)
还让我把复制来的数据放到给定的excel中。




当时听学姐需求的时候我一脸懵逼呀,完事我一回过神来心想:这不就一简单爬虫吗?
。。。。。
。。。。
。。。
。。

OK,说干就干!
这活我接了!

梳理需求

首先我们反观需求,需要的数据都存在单个页面中,若要对单个页面请求,无疑请求量会很大,但像这种网站应该不会有反爬,大不了挂代理呗。这样思路就有了,先搞到每个小单页的url,再对url池挨个请求拿数据。
我们再观察一下这个网站,当我们点击更改年级、学科、单元时,整个网页并没有跳转,而是在原网页中动态加载出页面,这时我们大致就心里有谱,八九不离十是ajax。

按下F12,刷新页面,观察xhr和json一栏,果然有数据
我们直接进行全局搜索

随便找一个课程题目比如 我是中国人
然后搜索一下
这样数据包就被我们找到了。点开它,我们发现它的响应数据是一个庞大的json数据:caseJson。并且他是一个由字典列表循环嵌套起来的数据。


我们直接看到它的根部数据有一个caseCode的键,它的值是一串很诡异的代码。
这时!所有的感觉都回来了!真相只有一个!于是我去寻找这个名叫 千人糕 的课程小页。但怎么也找不到- -
坏了,难道这破json串的数据是无序的?
这种数据我咋用呀。
于是我怀着失落的心又回到network
不过,
这家伙属实是有点奇怪呀,咋还有一个jsondata,点进去瞅瞅。

这一瞅可要命了,终于被我找到!!!

不仅有casecode,而且自带单元名,还是有序的。
我们直接打开,我去上学了,这个单元

有三个课程,对应上面三个casecode,完美!
我们点开第一个”我是中国人“,发现他的网址就是由casecode拼接而成的
对应规则大致为:

url="https://tongbu.eduyun.cn/tbkt/tbkthtml/wk/weike/"+casecode[5]+"/"+casecode+".html"

OK,这样,大致思路就有了,让我们正式开始吧!

casecode获取

比较正常的思路是直接对我们确定的那个jsondata发送请求,然后把响应数据转化为我们python的list或者dict,但这里博主直接暴力获取!。。。。Ctrl c +Ctrl v

手动拼凑成一个list!就像这样哈哈哈
这些都是细节,大家不必在意,继续前进!
不断进行尝试,最后很容易弄清楚这个数据串的树状结构
(博主自认为已经尽力~)
通过字典与列表的层层嵌套切片,最后就能获得casecode啦!

数据解析

这里有两种思路,一种是直接在最后的小页中提取出全部信息,除此之外呢,在上一步获得casecode的过程中我们会发现相应的课程代码会同时携带着年级,学科等信息,
只需要在小页中解析剩余数据就可,博主这里是采用的第二种。
对于页面解析,这里直接xpath定位就可,而视频链接与图片链接建议采用正则表达式。
在实际需求中学姐向我说明,在挑选课程中有一步筛选,要求在每一本教材中,如果封面全都是
,也就是没有授课老师在封面中,则需要我们跳过这个小章节,只获取有老师的章节,但如果一本书中全部都是没有老师的章节,那就不管三七二十一直接获取所有章节内容。
所以这里需要我们进行一步逻辑判断。

代码实现

from lxml import etree
import openpyxl
import re
import requests
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.4071 SLBChan/30'}
lis=['....']#博主这里就不把list搬过来了,大家自行获取
wb = openpyxl.load_workbook('源.xlsx')
cout=1
for t in lis:njname= t['njName']if '下' in njname:flag=Trueelse:flag=Falsefor i in t['subjectsList']:xk=['道德与法治','音乐','美术','科学','北师大']flag1=TrueCount=1xkname=i['xkName']for m in xk:if m in xkname:flag1=Falseif flag1==False:continue sheet = wb.get_sheet_by_name(njname+'('+xkname+')')#sheet.append(['ID','年级','学科','章节','课节名称','主讲人','主讲人简介','指导教师','指导教师简介','M3U8视频地址','视频第一帧默认图片','课节视频网页地址'])print("开始  ",njname,'  ',xkname)for j in i['danYuanList']:danyuanname=j['danyuanName']for x in j['caseList']:try:code=x['caseCode']data=[str(Count)]url='https://tongbu.eduyun.cn/tbkt/tbkthtml/wk/weike/2020'+code[4]+'J/'+code+'.html'page=str(requests.get(url=url,headers=headers).content,'utf-8')tree=etree.HTML(page)if flag==True:print('为下册')ss=['一','二','三']flag2=Falseif '数学' in xkname:flag2=Trueelif "PEP"in xkname:flag2=Truefor s in ss:if s in njname and '英语' in xkname:flag2=Trueif flag2==True:print('特殊对象')imglink=re.findall(r'image: "(https://.*?.jpg)"',page,re.S)data.append(njname)data.append(xkname)data.append(danyuanname)classname=tree.xpath('//div[@class="XiangX_T"]/h3/text()')[0]vlink=re.findall(r'file: "(https://.*?.m3u8)"',page,re.M)if len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==0:data.append(classname)data.append(' ')data.append(' ')data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url) elif len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==1:mainman=re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M)[0]    text_mainman=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[0]if len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==0: data.append(classname)data.append(mainman)data.append(text_mainman)data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url)elif len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==1: helper=re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M)[0]text_helper=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[1]data.append(classname)data.append(mainman)data.append(text_mainman)data.append(helper)data.append(text_helper)data.append(vlink[0])data.append(imglink[0])data.append(url)sheet.append(data)print('round   ',cout,'  over!')#print(data)cout+=1Count+=1else:print('非特殊对象')tar=tree.xpath('//h4[@class="XiaZi"]')if tar==[]:print('[][[[[[[[[]]]]]]]]')imglink=re.findall(r'image: "(https://.*?.jpg)"',page,re.S)data.append(njname)data.append(xkname)data.append(danyuanname)classname=tree.xpath('//div[@class="XiangX_T"]/h3/text()')[0]vlink=re.findall(r'file: "(https://.*?.m3u8)"',page,re.M)if len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==0:data.append(classname)data.append(' ')data.append(' ')data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url) print('data=',data)elif len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==1:mainman=re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M)[0]    text_mainman=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[0]if len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==0: data.append(classname)data.append(mainman)data.append(text_mainman)data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url)print('data=',data)elif len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==1: helper=re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M)[0]text_helper=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[1]data.append(classname)data.append(mainman)data.append(text_mainman)data.append(helper)data.append(text_helper)data.append(vlink[0])data.append(imglink[0])data.append(url)print('data=',data)sheet.append(data)print('round   ',cout,'  over!')#print(data)cout+=1Count+=1else:print('!!!!!!!!!!!!!!!!!!!!!!!')passelif flag==False:print('为上册')imglink=re.findall(r'image: "(https://.*?.jpg)"',page,re.S)data.append(njname)data.append(xkname)data.append(danyuanname)classname=tree.xpath('//div[@class="XiangX_T"]/h3/text()')[0]vlink=re.findall(r'file: "(https://.*?.m3u8)"',page,re.M)if len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==0:data.append(classname)data.append(' ')data.append(' ')data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url) elif len(re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M))==1:mainman=re.findall(r'<h5>主讲人:(.*?)</h5>',page,re.M)[0]    text_mainman=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[0]if len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==0: data.append(classname)data.append(mainman)data.append(text_mainman)data.append(' ')data.append(' ')data.append(vlink[0])data.append(imglink[0])data.append(url)elif len(re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M))==1: helper=re.findall(r'<h5>指导教师:(.*?)</h5>',page,re.M)[0]text_helper=re.findall(r'<p class="GuGan GuGan1">简介:(.*?)</p>',page,re.M)[1]data.append(classname)data.append(mainman)data.append(text_mainman)data.append(helper)data.append(text_helper)data.append(vlink[0])data.append(imglink[0])data.append(url)sheet.append(data)print('round   ',cout,'  over!')#print(data)cout+=1Count+=1except:cout+=1print(cout,'    失败!!!')print(url)
print(cout,'条')
wb.save("Data.xlsx")

对文章内容有问题请邮箱联系 sangyunchang1@163.com
一定会尽力回复

国家中小学网络平台爬虫项目相关推荐

  1. 爬虫项目(四)---采集从01月22日以来全国各省疫情数据

    采集从03月02日以来全国各省疫情数据 当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url:https://ncov.dxy.cn/ncovh5/view/pneumonia 分析 确 ...

  2. 爬虫项目(三)---采集最近一日全国各省疫情数据

    该内容出自黑马程序员教程 采集最近一日全国各省疫情数据 当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页 url:https://ncov.dxy.cn/ncovh5/view/pneumo ...

  3. 互联网晚报 | 3月1日 星期二 |​ 2022年苹果可能推出三款Apple Watch;“国家中小学智慧教育平台”投入试运行...

    ‍ ‍小米投资纽迪瑞 3月1日消息,近日,深圳纽迪瑞科技开发有限公司发生工商变更,新增小米关联公司瀚星创业投资有限公司为股东.据公开资料显示,纽迪瑞成立于2011年4月,是一家压力感应触控技术解决方案 ...

  4. 肝了N小时,整理了100+Python爬虫项目

    提到爬虫,相信绝大部分人的第一反应就是 Python,尽管其他编程语言一样能写爬虫,但在人们的印象中,爬虫似乎与 Python 绑定了一样,由此可见爬虫在 Python 中的份量. 最近小二做了个免费 ...

  5. 肝了N小时,整理了100+Python爬虫项目(附源码)

    提到爬虫,相信绝大部分人的第一反应就是 Python,尽管其他编程语言一样能写爬虫,但在人们的印象中,爬虫似乎与 Python 绑定了一样,由此可见爬虫在 Python 中的份量. 最近我做了个免费的 ...

  6. 【python教程入门学习】Python零基础入门爬虫项目

    Python入门爬虫项目 这是我的第一个python项目,分享给大家. 需求 我们目前正在开发一款产品其功能大致是:用户收到短信如:购买了电影票或者火车票机票之类的事件.然后app读取短信,解析短信, ...

  7. 2020年度国家科学技术奖提名项目公示丨附全名单

    来源:科学技术部 3月24日,科学技术部发布了<国家科学技术奖励工作办公室公告第95号>文件.该文件称,2020年度国家科学技术奖提名工作已结束,并对2020年度国家自然科学奖.国家技术发 ...

  8. scrapyd部署爬虫项目到LINUX服务器

    1,首先把scrapy爬虫项目上传到服务器 我的服务器架设在公司内网里.所以在这里使用WinSCP作为上传工具. 2,修改项目的配置文件scrapy.cfg 给爬虫项目指定分组,具体方法是在deplo ...

  9. 【飞谷六期】爬虫项目1

    报名了飞谷六期的爬虫项目,但是自己相关的基础还是较弱,每天都有种无所事事的感觉.决定还是记录一下每天学习到的知识,自己看看也知道学习了些什么. 1.XShell连接阿里云,Xftp传输文件 2.把例子 ...

最新文章

  1. [BTS06]BizTalk2006 SDK阅读笔记(五) 管道-Pipeline
  2. iOS进阶之底层原理-锁、synchronized
  3. Idea创建web项目,配置tomcat服务器
  4. Hibernate缓存和加强
  5. 深入理解Java 虚拟机
  6. UI模板素材|教你App中的页面指示器要如何设计
  7. 高级会计可以用计算机,高会无纸化考试计算器不好用 建excel计算可以吗?官方回复!...
  8. CSU 1027 Smallbox魔方
  9. JAVA中各种简写全称整理
  10. android excel布局,Androidui布局控件(2)表格布局excelPanel
  11. python实现人脸检测及识别(2)---- 利用keras库训练人脸识别模型
  12. 题目1512:用两个栈实现队列
  13. matlab中realmax
  14. C# HttpClient Multipart 上传文件
  15. 用c#算成绩的总和_用c#编写输出成绩的总分和平均分
  16. 4月1日标准IO和文件IO的区别(个人收藏)
  17. 后端返回base64格式数据转excel格式文件并下载
  18. silvaco仿真遇到的bug和解决方案
  19. html设置径向渐变色,【前端Talkking】CSS系列-css3之径向渐变初探
  20. 使用TamperMonkey实现慕课网自动播放下一集

热门文章

  1. 每日10行代码82:网上购物活动满减凑单计算器
  2. 倾囊相授:小编是如何从阿里云转战达摩院并成功上岸de?
  3. 从顶点覆盖(Vertex Cover)到碰撞集(Hitting Set)的归约
  4. ubuntu16.04 安装显卡驱动
  5. AndroidStudio 实现用户登录注册
  6. android桌面壁纸显示不全屏显示,手机壁纸怎么全屏 全屏显示手机壁纸方法
  7. 【重磅】2021年SCI影响因子滚烫式公布!各领域TOP期刊!(附下载链接)
  8. 捣鼓PlantUML(三、时序图)
  9. 【ISCCC认证】WEB安全工程师认证介绍
  10. 使用labelimg标注图片