step1:浏览需要爬取资源的主页,找到链接
每一节课的id号依此递增
step2:ctrl+shift+C 查看源码,刷新页面(才能出现视频资源)
刷新前:
刷新后:
step3:在源代码中查找原视频链接所在位置
<div class="m-lessoonDetail">会出现在下面代码中,用来定位视频所在位置
Step4:接下来就是根据源代码写爬虫切割字符获取资源啦~
ps:我们需要使用Selenium抓取JavaScript动态生成数据的网页
Selenium 可以帮我们应对这个问题。
简单说下这个东西有什么用吧,我们可以编写代码让浏览器:1.自动加载网页;
2.模拟表单提交(比如模拟登录),获取需要的数据;
3.页面截屏;
4.判断网页某些动作是否发生,等等。
然后这个东西是不支持浏览器功能的,你需要和第三方的浏览器一起搭配使用,
1.首先安装Selenium
直接通过pip命令行进行安装:
pip install selenium
2.若想调用Chrome浏览器,需要下载Chromedriver(32位没关系啦~,64位照样用)
下面是下载Chromedriver的链接。
不要急~我们还需要将它放在python的Scripts文件夹下才能调用它
import sys
import time
from bs4 import BeautifulSoup #网页解析,获取数据
import re #正则表达式,进行文字匹配
from selenium import webdriver #用于模拟chmore访问网站
import xlwt #excel操作
def main():
print("开始爬取......")
baseurl = 'https://www.icourse163.org/learn/WHU-1001539003?
tid=1002049010#/learn/content?type=detail&id=' #需要爬取的url
datalist = getData(baseurl) #获取爬取的内容
savapath = u'数据结构_武汉大学.xlsx' #存放路径
saveData(datalist, savapath) #存入操作
print("爬取完成!")
#获取页面全部内容,模拟浏览器访问页面
def askURL(url):
browser = webdriver.Chrome() # 调用本地的Chrome浏览器
browser.get(url) # 请求页面,会打开一个浏览器窗口
time.sleep(2)
try:
browser.refresh() # 刷新浏览器页面方法 refresh(只有刷新,含有资源的js才会显示)
time.sleep(3)
except Exception as e:
print("Exception found", format(e))
html_text = browser.page_source # 获得页面代码
browser.quit() # 关闭浏览器
return html_text
#解析内容
def getData(baseurl):
videoLink = re.compile(r'src="(.*?)"',re.S) #切割js内容,以获取视频链接
videoName = re.compile(r'<div class="u-select">.*?>(.*?)(',re.S) #获取视频名
datalist = [] #将视频链接与视频名存入列表
for i in range(0,104):
#for i in range(0, 2):
url = baseurl+str(1002711856+i)
html = askURL(url)
soup = BeautifulSoup(html,"html.parser") #解析html,读取整个html
for item in soup.find_all('div',class_="m-lessonDetail"): # 找到每一个课程detail
data = []
item = str(item) #转换成字符串
name = re.findall(videoName, item)[1] #得到视频名
if re.findall(videoLink,item) is not None:
video = re.findall(videoLink,item)[0] #得到视频链接
else:
video =" " #视频链接为空,则留空
if len(name)!=0:
data.append(name)# 添加视频名
else:
data.append(" ") #留空
data.append(video) #添加视频
print("正在爬取第"+str(i)+"条"+name+video)
datalist.append(data) #把处理好的一部视频放入datalist
return datalist
#保存数据
def saveData(datalist,savepath):
book=xlwt.Workbook(encoding="utf-8")
sheet = book.add_sheet("数据结构_武汉大学") #创建sheet
#col=('视频名','视频链接')
#sheet.append(col) #可添加列头
#for i in range(0,104):
#for i in range(0,2):
for i in range(len(datalist)):
data=datalist[i]
print("写入第%s条"%i)
for j in range(0,2):
sheet.write((i),(j),data[j])
book.save(savepath) #保存
if __name__ == '__main__':
main()