logo资料库

爬取中国大学MOOC课程数据.pdf

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
爬取中国大学 MOOC 课程数据 任务: 在中国大学 MOOC 网站中有很多课程,这个项目的任务就是使用 Selenium 爬取网站中 Python 类型的课程的数据。 一、解析网页 (1) 网页分析 1、查找课程 进入中国大学 MOOC 网站 https://www.icourse163.org,在查找框中输入”python”就可以 查找到 Python 一类的课程,网址变成: https://www.icourse163.org/search.htm?search=python# 如图 1 所示。 图 1 MOOC 网课程 编写程序完成这个动作: def process(self, url, key): try: self.chrome.get(url) div = self.chrome.find_element_by_xpath( 1
"//div[@class='u-head-searchFunc']//div[@class='j-search-box u-search- container']") search = div.find_element_by_xpath(".//input[@type='text'][@name='search']") search.send_keys(key) span = div.find_element_by_xpath(".//span[@class='u-icon-search2 j-searchBtn']") span.click() self.spider() except Exception as err: print(err) 2、课程分析 右键点击一个课程的名称,看到 HTML 代码结构如图 2 所示。 图 2 HTML 结构 复制出其中一段 HTML 代码如下:
<span class="f-fcorange f-ib">Python</span>网络爬虫程序技
术
二、爬取数据 分析这些 HTML 代码可以清楚地看到: 一个
的 div 元素包含了一组
的 div 元素,每门课程都放在一个组
的元素中。在
元素中包含了该课程的所有信息:  在这个 div 中往下找到一个那么它的稳步就是 课程名称;  在这个 div 中往下找到一个
  • 3
  • 下一页
  • 分析这个按钮的 HTML 代码可以发现这个按钮可以通过下列的 XPATH 方法定位: link=chrome.find_element_by_xpath("//ul[@class='ux -pager']//li[@class='ux-pager_btn ux- pager_btn__next']//a") 它是一个超级链接,正常可以翻页时为下一页,到最后一 页不能再翻页时为下一页,因此可以设计程序进行翻页管理: link=self.chrome.find_element_by_xpath("//ul[@class='ux-pager']//li[@class='ux-pager_btn ux-pager_btn__next']//a") if link.get_attribute("class")=="th-bk-main-gh": link.click() 网页可以翻页时就执行 link.click()的点击动作翻到下一页,在翻到新的一页后我们可以 暂停几秒钟让网页稳定后再爬取网页的数据。 四、编写爬虫程序 根据前面的网页解析与网页翻页的分析,就可以设计爬虫程序爬取课程了。爬到的结果 存储到数据库 courses 表中,这个表设计如下: create table courses (ID int primary key,cCourse varchar(256),cCollege varchar(256),cTeacher varchar(16),cTeam varchar(256),cCount varchar(128),cProcess varchar(128), cBrief text) 其中 ID 是课程的编号,cCourse、cCollege、cTeacher、cTeam、cCount、cProcess、cBrief 分别是课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介。 爬虫程序如下: from selenium import webdriver from selenium.webdriver.chrome.options import Options import sqlite3 import time class MOOCSpider: def __init__(self): chrome_options = Options() 5
    chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') self.chrome = webdriver.Chrome(chrome_options=chrome_options) self.ID=0 def openDB(self): try: self.con=sqlite3.connect("courses.db") self.cursor=self.con.cursor() try: self.cursor.execute("drop table courses") except: pass self.cursor.execute( "create table courses (ID int primary key,cCourse varchar(256),cCollege varchar(256),cTeacher varchar(16),cTeam varchar(256),cCount varchar(128),cProcess varchar(128), cBrief text)") except Exception as err: print(err) def closeDB(self): self.con.commit() self.con.close() self.chrome.close() def insertDB(self,cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief): try: self.ID+=1 sql="insert into courses (ID,cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief) values (?,?,?,?,?,?,?,?)" self.cursor.execute(sql,[self.ID,cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief]) print("#",self.ID," ",cCourse," / ",cCollege," / ",cTeacher) except Exception as err: print(err) def spider(self): try: time.sleep(5) print(self.chrome.current_url) mdiv=self.chrome.find_element_by_id("j-courseCardListBox") divs=mdiv.find_elements_by_xpath(".//div[@data-action='课程点击']") for div in divs: 6
    course=div.find_element_by_xpath(".//span[@class=' u-course-name f- thide']").text d=div.find_element_by_xpath(".//div[@class='t2 f-fc3 f-nowrp f-f0']") links=d.find_elements_by_xpath(".//a") college=links[0].text if len(links)>=2: teacher=links[1].text else: teacher="" team=teacher try: team+=d.find_element_by_xpath(".//span").text except: pass count=div.find_element_by_xpath(".//span[@class='hot']").text process=div.find_element_by_xpath(".//span[@class='txt']").text brief=div.find_element_by_xpath(".//span[@class='p5 brief f-ib f-f0 f- cb']").text self.insertDB(course,college,teacher,team,count,process,brief) link=self.chrome.find_element_by_xpath("//ul[@class='ux- pager']//li[@class='ux-pager_btn ux-pager_btn__next']//a") if link.get_attribute("class")=="th-bk-main-gh": link.click() self.spider() except Exception as err: print(err) def process(self,url,key): try: url=url+"/search.htm?search="+key+"#" self.chrome.get(url) self.spider() except Exception as err: print(err) def show(self): self.cursor.execute("select ID,cCourse,cCollege,cTeacher,cTeam,cCount,cProcess,cBrief from courses order by ID") rows=self.cursor.fetchall() for row in rows: 7
    for i in range(8): if i==0: print("\n#", row[0]) else: print(row[i]) print() MS=MOOCSpider() MS.openDB() MS.process("https://www.icourse163.org","python") MS.show() MS.closeDB() 五、执行爬取程序 运行该程序可以爬取到 python 类的课程,部分结果如下: https://www.icourse163.org/search.htm?search=python#/ # 1 Python 语言程序设计 / 北京理工大学 / 嵩天 # 2 零基础学 Python 语言 CAP / 北京理工大学 / 嵩天 # 3 Python 网络爬虫与信息提取 / 北京理工大学 / 嵩天 # 4 Python 语言基础与应用 / 北京大学 / 陈斌 # 5 Python 数据分析与展示 / 北京理工大学 / 嵩天 # 6 Python 语言程序设计 / 北京交通大学 / 鲁凌云 # 7 用 Python 玩转数据 / 南京大学 / 张莉 # 8 Python 科学计算三维可视化 / 北京理工大学 / 黄天羽 # 9 Python 云端系统开发入门 / 北京理工大学 / 嵩天 # 10 Python 游戏开发入门 / 北京理工大学 / 嵩天 # 11 Python 机器学习应用 / 北京理工大学 / 礼欣 # 12 高级语言程序设计(Python) / 哈尔滨工业大学 / 车万翔 # 13 片上系统开发与 Python 实践 / 北京理工大学 / 嵩天 # 14 高级语言程序设计(Python)CAP # 15 Python 程序设计 / 深圳信息职业技术学院 / 黄锐军 # 16 Python 语言程序设计 / 西安邮电大学 / 王小银 # 17 python+ / 河南师范大学 / 张磊 # 18 Python 网络爬虫程序技术 / 深圳信息职业技术学院 / 黄锐军 # 19 Python 语言程序设计基础 / 南京邮电大学 / 薛景 # 20 大学计算机--Python 算法实践 / 东北大学 / 李金双 https://www.icourse163.org/search.htm?search=python#type=30&orderBy=0&pageIndex= / 哈尔滨工业大学 / 车万翔 2&courseTagType=null # 21 人工智能实践:Tensorflow 笔记 / 北京大学 / 曹健 # 22 计算机导论 / 上海工程技术大学 / 游晓明 # 23 程序设计基础 / 东北大学 / 李丹程 # 24 大学计算机——计算思维之路 CAP / 北京交通大学 / 王移芝 # 25 大学计算机——计算思维之路 / 北京交通大学 / 王移芝 # 26 网络信息计量与评价 / 北京师范大学 / 肖明 8
    分享到:
    收藏