鱼C论坛

 找回密码
 立即注册
查看: 15528|回复: 66

[技术交流] 自己写的第一个爬虫:分析某大数据培训网站的学习需求

[复制链接]
发表于 2016-10-16 19:08:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhangjuying2000 于 2016-10-16 19:10 编辑

大数据时代,哪些课程最受欢迎?

大数据时代衍生出大数据技术,包括数据的采集、存取、清洗、挖掘、可视化等等,哪些课程或者哪些方向最受欢迎呢?本文以ppv课(国内领先的大数据学习社区www.ppvke.com)网站为例,该网站的免费课程频道有着较为齐全课程分类,并且积累了一定的用户学习数据。通过python软件爬取所有课程的学习人数、时长、类别等网络数据,可以一窥当前大数据时代学习群体的培训需求。

(1)导入相关库并构建网页解析函数
装入网页解析、多线程、数值计算、数据可视化等python安装库,并构造网页解析函数,在函数中设置模仿浏览器登录的head方式:
import urllib.request
from lxml import etree
import pandas as pd
from multiprocessing.dummy import Pool as threadspool
import urllib,re,time
import numpy as np
import matplotlib.pyplot as plt

start_url='http://www.ppvke.com/class/select'
url_host = 'http://www.ppvke.com/class/select?topicid='

def url_open(url):#构建网页解析函数
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0')
    page = urllib.request.urlopen(req)#模仿浏览器登录
    txt = page.read().decode('utf-8')
    htm = etree.HTML(txt)
    return htm

(2)构建每一类目链接获取函数
获取每个类目的链接,也就是图1中机器学习、数据挖掘等14个类目的链接,构建每个类目链接获取的函数:
def get_class_link(url):#获取每个类目的链接
    htm = url_open(url)
    class_topics = htm.xpath('/html/body/div[2]/div[1]/div[1]/dl[1]/dd/a/text()')[1:-1]#对课程类目的网址进行解析,并且去除一头一尾“全部”与“会员课程”
    class_link =[]
    for class_topic in class_topics:
        class_link.append(url_host + urllib.parse.quote(class_topic))#主要解决部分网址包含中文字符无法解码的问题
    return class_link
在免费课程主页:http://www.ppvke.com/class/select,点击对应的课程类目右键审查元素就可以获取相应的链接,该网站课程类目链接采取这样的方式:http://www.ppvke.com/class/select?topicid=机器学习,即在主页的基础上加入topicid=的形式。在这里需要注意,部分类目包含中文字符,如机器学习、数据挖掘、R语言等,在python网页解析中会出现“ASCII码无法识别的问题”,导致程序运行不出,这时需要加入urllib.parse.quote命令进行编码,使得中文字符识别出来,(英文字符在此命令下不受影响)。

(3)构建全部链接获取函数,解决翻页问题
再次,构建全部链接抓取函数。由于部分课程类目不止一页,需要对翻页的链接进行抓取,这时候我们需要解决两个问题:一是每个类目有多少翻页?二是翻页链接的形式是什么样的,有无规律可循?
在课程的底端可以看到每个类目的页数:

对于多页的课程类目链接形式为(以Excel为例):
http://www.ppvke.com/class/select?topicid=Excel&job=&grade=&page=&page=2
可以看到在课程类目的链接上加入了“&job=&grade=&page=&page=”这种形式。根据这两个问题的表现形式我们找到了解决方案,对于每个类目的页数问题,通过抓取“上一页”、“下一页”这个框中的列表长度来判断,如只有第一页保持原有链接不变,如有2个以上页面,则在原始链接的列表中加入page=2/3….的链接形式。最后封装成一个列表。
def get_all_links(class_link):#每个课程类目有不止一页,因此链接也有多个,因此基于类目链接构建全部链接函数
    htm = url_open(class_link)
    page_num=htm.xpath('/html/body/div[2]/div[1]/div[2]/div[3]/div/a/text()')
    urls = [class_link]
    if len(page_num)>2:
        for i in range(2,len(page_num)):
            urls.append(class_link + '&job=&grade=&page=&page='+str(i))#将翻页链接依次加入类目链接中
    else:
        pass
    return urls

(4)构建抓取信息函数
接下来就开始抓取每个页面的信息,并采用pandas.DataFrame的数据框,采用Xpath方式抓取。
def get_info(url):#抓取每个链接的信息,包括课程名称、时长、学习人数、类目
    htm = url_open(url)
    titles = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/h3/a/text()')
    times= htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/text()')
    numbers = htm.xpath('/html/body/div[2]/div[1]/div[2]/div[2]/ul/li/p[1]/span/text()')
    topic = htm.xpath('/html/body/div[2]/div[1]/div[1]/dl[1]/dd[@class="cur"]/a/text()')
    topics = topic * len(titles) #获取每个课程的类目变量,并且与每个课程一一对应,最好与其他变量在同一页面一起抓取
    frame = pd.DataFrame([topics,titles,times,numbers], index=['topics','titles','times','numbers'])#转入数据列表DataFrame
    frame = frame.T
    return frame

(5)导入网页,爬取信息
构造完相关函数后,将参数代入,爬取所有类目下所有课程的数据信息:
if __name__ == '__main__':
    time.sleep(2)
    class_links = get_class_link(start_url)#获取类目链接
    pool = threadspool(2)
    urls = list(map(get_all_links,class_links))#多线程抓取每个类目的所有链接
    url_links = []
    for x in urls:
        url_links.extend(x) #将所有链接装进一个list
    frame_list = list(map(get_info,url_links))#数据框列表
    a,b,c,d = [], [], [], []
    [(a.extend(x['topics'])) for x in frame_list]
    [(b.extend(x['titles'])) for x in frame_list]
    [(c.extend(x['times'])) for x in frame_list]
    [(d.extend(x['numbers'])) for x in frame_list]
    c1 = [int(re.findall(r"\d+" ,txt)[0]) for txt in c]
    d1 = [int(re.findall(r"\d+" ,txt)[0]) for txt in d] #采用正则表达式提取数字,并转化为整型,也算是数据清洗
    frame = pd.DataFrame([a,b,c1,d1], index=['topics','titles','times','numbers'])#将数据整合
    frame = frame.T

(6)数据截取、分组及可视化
通过数据截取、分组计算、画图就可以得到每个类目平均的学习人数:
游客,如果您要查看本帖隐藏内容请回复


如图,概率与统计课程的平均学习人数最多,达到3000以上,这说明学习者对大数据的基础统计理论的学习需求较大;其次是R语言、Mysql、SPSS等,说明了大数据常用的软件与数据库的学习需求也较高。
分类比较,比如在大数据统计软件方面的平均学习人数上,由上图可以看出,R语言>SPSS>Python>SAS>Excel>Matlab,后三者在大数据统计技术上已稍显落后(spss在开发出数据挖掘模块),且R、Python是目前大数据分析下最火的两大统计软件,相应的学习需求也高;数据库方面:Mysql>Nosql>Sql>Oracle,Mysql平均学习人数最多且远远超过其他数据库,作为大数据目前最常用的数据库存储工具,因此会获得如此高的关注度;理论方面:概率统计>机器学习>数据挖掘,说明学习者对基础理论的需求还是比较高,由于大数据技术是计算机与数据统计等内容的结合,很多计算机从业者缺乏统计理论知识以及初学者也要从最基础的理论学起,这导致概率与统计的学习需求遥遥领先,从侧面也说明了在大数据领域统计理论的缺失或不足较为明显。对于大数据里较火的软件平台——Hadoop,平均学习人数处于不高不低的状态,这是由于大多数大数据学习者还处于初级水平,对Hadoop这一高级应用技术还缺乏了解,所以学习需求没那么高。

每一课程类目的平均学习人数

每一课程类目的平均学习人数

SAS类目所有的课程学习人数

SAS类目所有的课程学习人数

课程学习人数与学习时长的散点图

课程学习人数与学习时长的散点图

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
拈花小仙 + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-16 20:39:24 | 显示全部楼层
看看怎么玩
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-16 21:33:04 | 显示全部楼层
很好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-16 22:25:56 | 显示全部楼层
你改成鱼C论坛,爬一下试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-17 10:16:44 | 显示全部楼层
关于Xpath 这块 大神能再讲讲吗?

“采用pandas.DataFrame的数据框,采用Xpath方式抓取”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-17 10:41:33 | 显示全部楼层
想学
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-17 16:34:25 | 显示全部楼层
不二如是 发表于 2016-10-16 22:25
你改成鱼C论坛,爬一下试试

,有空试试吧,我也是新手,所以最开始选了这个分类比较清楚,数据量也不大的网站
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 16:35:20 | 显示全部楼层
silypho 发表于 2016-10-17 10:16
关于Xpath 这块 大神能再讲讲吗?

“采用pandas.DataFrame的数据框,采用Xpath方式抓取”

与BeautifulSoup类似,都是有右键点击元素,然后copy路径,来解析的,关键就是语法不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-17 16:37:10 | 显示全部楼层
zhangjuying2000 发表于 2016-10-17 16:35
与BeautifulSoup类似,都是有右键点击元素,然后copy路径,来解析的,关键就是语法不一样

哈哈哈! 关于BeautifulSoup ,还能继续讲讲嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-17 16:39:02 | 显示全部楼层
自己搜索查看ing,大神若有空,指教更是感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-10-17 16:46:09 | 显示全部楼层
silypho 发表于 2016-10-17 16:37
哈哈哈! 关于BeautifulSoup ,还能继续讲讲嘛

这个不好讲呀,关键还是动手去学,beautifulsoup 是 HTML 解析库,XPath 是 HTML / XML 查询语言
要弄懂这个,我建议你还是学一些简单的网页结构,比如<title></title> class
<p></p>等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-10-17 18:13:25 | 显示全部楼层
zhangjuying2000 发表于 2016-10-17 16:46
这个不好讲呀,关键还是动手去学,beautifulsoup 是 HTML 解析库,XPath 是 HTML / XML 查询语言
要弄懂 ...

一个个来吧~ 慢慢学ing
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-17 20:42:44 | 显示全部楼层
小甲鱼的视频,我的最爱!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 00:34:18 From FishC Mobile | 显示全部楼层
学习了学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 10:09:43 | 显示全部楼层
感谢楼主无私奉献!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 11:23:29 | 显示全部楼层
3qqqqqqqqqqqqqqqqqqqqqqqqqqq
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-18 15:30:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-18 19:22:14 | 显示全部楼层
嗯嗯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-18 20:51:32 | 显示全部楼层
楼主好人,谢谢分享,很喜欢,哈哈哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-21 04:05:43 | 显示全部楼层
11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-28 01:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表