那么它的稳步就是
课程名称;
在这个 div 中往下找到一个
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
print(course,college,teacher,team,count,process,brief)
except Exception as err:
print(err)
运行这个程序发现可以爬取到课程的名称、学校、教师、团队、参加人数、进度与课程
简介等,说明网页解析成功。
三、网页翻页
查看网页中翻页的按钮,它由“下一页”按钮控制,如图 3 所示。
图 3 翻页按钮
复制 HTML 的代码如下:
分析这个按钮的 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