要求:

  • 爬取的链接:http://www.imooc.com/course/list
  • 爬取的内容:课程链接,课程的图片url,课程的名称,学习人数,课程描述
  • 爬取的内容如何存储:
    • 文件(csv);
    • mysql数据库;
  • 分析爬取的信息;
    • 词云
import re
import requests
import lxml.etree as etree
import csvdef get_content(url):"""爬取页面内容的函数"""try:user_agent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36"response = requests.get(url, headers={'User-Agent': user_agent})response.raise_for_status()  # 如果返回的状态码不是200, 则抛出异常;response.encoding = response.apparent_encoding  # 判断网页的编码格式, 便于respons.text知道如何解码;except Exception as e:print("爬取错误")else:print(response.url)print("爬取成功!")return response.contentdef parser_content(html):"""分析页面获取需要的信息:课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 """# 1). 将html内容转化成xpath可以解析/匹配的格式;selector = etree.HTML(html)# 2). 获取每个课程的信息: <div class="course-card-container">courseDetails = selector.xpath('//div[@class="course-card-container"]')courseInfos = []for courseDetail in courseDetails:# 课程的名称: <h3 class="course-card-name">初识HTML+CSS</h3>name = courseDetail.xpath('.//h3[@class="course-card-name"]/text()')[0]# 学习人数"""<div class="course-card-info"><span>入门</span><span><i class="icon-set_sns"></i>1000167</span></div>"""studentNum = courseDetail.xpath('.//span/text()')[1]# 课程描述: <p class="course-card-desc">HTML+CSS基础教程8小时带领大家步步深入学习标签用法和意义</p>courseInfo = courseDetail.xpath(".//p[@class='course-card-desc']/text()")[0]# print(name, studentNum, courseInfo)# 课程链接, h获取/learn/9 ====> http://www.imooc.com/learn/9# <a target="_blank" href="/learn/9" class="course-card">courseUrl = "http://www.imooc.com" + courseDetail.xpath('.//a/@href')[0]# print(courseUrl)# 课程的图片url:"""<img class="course-banner lazy" data-original="//img1.mukewang.com/529dc3380001379906000338-240-135.jpg" src="//img1.mukewang.com/529dc3380001379906000338-240-135.jpg" style="display: inline;">"""courseImgUrl = 'http:' + courseDetail.xpath('.//img/@src')[0]courseInfos.append((name, studentNum, courseInfo, courseUrl, courseImgUrl))return courseInfosdef save_csv(courseInfo):"""将获取的课程信息保存为csv格式"""with open('doc/mooc.csv', 'w') as f:writer = csv.writer(f)writer.writerows(courseInfo)print("csv文件保存成功........")def save_json(courseInfo):"""将获取的信息保存为json格式"""import jsonwith open('doc/mooc.json', 'w', encoding='utf-8') as f:for item in courseInfo:item = {'name': item[0],'studentNum': item[1],'courseInfo': item[2],'courseUrl': item[3],'courseImgUrl': item[4]}# ensure_ascii: 如果有中文, 则设置为False, 表示使用Unicode编码, 中文不会乱码;# indent=4: 所金为4个空格, 便于阅读;jsonitem = json.dumps(item, ensure_ascii=False, indent=4)f.write(jsonitem + '\n')print("json文件保存成功......")def moocSpider():# 1). 爬取课程信息的第一页url = "http://www.imooc.com/course/list"html = get_content(url=url)courseInfos = parser_content(html)  # 列表, 保存第一也的课程信息;# 2). 如果有下一页信息, 则继续爬取课程内容;# 如果没有下一页信息, 则跳出循环, 将课程信息保存到文件中.....;while True:# 获取是否拥有下一页?selector = etree.HTML(html)nextPage = selector.xpath('//a[contains(text(), "下一页")]/@href')print(nextPage)# 只爬取前2页, 用于测试;# if nextPage and ('3' not in nextPage[0]):if nextPage:url = "http://www.imooc.com" + nextPage[0]html = get_content(url=url)otherCourseInfo = parser_content(html)courseInfos += otherCourseInfo  # 把其他页获取的页面信息追加到变量中;else:print("全部爬取结束......")break# print(courseInfos)save_csv(courseInfos)save_json(courseInfos)# 1). 课程信息有多页, url规则:# 两种url均可:# http://www.imooc.com/course/list?page=28# http://www.imooc.com/course/list?page=1# http://www.imooc.com/course/list/2# http://www.imooc.com/course/list/28# 2).  什么时候爬取结束? 没有下一页的时候# 有下一页:#     <a href="/course/list/2?page=2">下一页</a># 没有下一页:#     <span class="disabled_page">下一页</span>def dealCourseData(filename):"""对于爬取的课程信息进行分析, 返回清洗好的数据"""#wordcloudString = ''# 读取需要的文件内容with open(filename) as f:reader = csv.reader(f)# 清洗需要分析的文本信息: 删除里面不必要的逗号, 句号, 表情;pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z0-9]+)')for item in reader:# 将来进行词云展示时, 需要的是字符串, 而不是列表;name = "".join(re.findall(pattern, item[0]))detail = "".join(re.findall(pattern, item[2]))wordcloudString += namewordcloudString += detailreturn  re.sub(r'(学习|使用|入门|基础|实现|掌握)', '', wordcloudString)import re
import jieba
from PIL import Image
from wordcloud import wordcloud
import numpy as npdef gen_wordcloud(text, filename):# 1). 强调分割中有问题的词;#  2). 难点: 如何切割中文, jieba, lcutresult = jieba.lcut(text)# print(result)# 绘制词云# 3). 打开图片, 获取图片的数据信息;imgObj = Image.open('./doc/wordcloud.jpg')img_mask = np.array(imgObj)# print(img_mask)# 4). 创建词云对象, 设置属性wcObj = wordcloud.WordCloud(mask=img_mask,  # 数据如何填充到图片background_color="snow",  # 背景颜色font_path="/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc",  # 如果是中文, 指定字体库(fc-list :lang=zh)min_font_size=5,  # 图片中最小的字体大小max_font_size=50,  # 图片中最小的字体大小width=1000,  # 图片宽度height=1000,  # 高)# 5). 生成图片# 词云绘制时, 默认之处理字符串类型, 怎么分隔每个单词? 必须以逗号分隔符分割wcObj.generate(",".join(result))wcObj.to_file(filename)print("生成图片%s成功......." %(filename))if __name__ == '__main__':# 爬取数据信息# moocSpider()# 分析爬取的数据text = dealCourseData('doc/mooc.csv')filename = "doc/mooc.png"gen_wordcloud(text, filename)

xpath爬取mooc网课程相关推荐

  1. Selenium爬取MOOC网课程信息

    近期在写一份关于大数据相关的作业,需要搜索近年来市面上关于大数据的书籍信息和课程信息.其中一位同学负责在当当网上爬取书籍信息,我就负责爬取MOOC网的课程信息. 刚开始的时候,以为MOOC网作为一个公 ...

  2. python-scapy爬取mooc网保存在数据库中并下载图片

    爬取的步骤 - 确定url地址; - 获取页面信息;(urllib, requests); - 解析页面提取需要的数据: (正则表达式, bs4, xpath) - 保存到本地(csv, json, ...

  3. xpath爬取当当网

    xpath爬取当当网 import requests from lxml import etree #from itertools import chain #import json # 利用接口读取 ...

  4. Python爬虫学习笔记 (9) [初级] 小练习 爬取慕课网课程清单

    更新日期: 2021.03.28 本节学习内容 : 练习使用 bs4 和 xlwings - 爬取慕课网免费课程清单并存为 Excel 文件. 目录 1. 目标信息 2. 爬取步骤 3. 代码 5. ...

  5. 使用Python+xpath爬取知网所有中英文期刊的封面背景图片

    使用Python+xpath+beautifulsoup爬取知网所有中英文期刊的封面背景图片` import json import requests from bs4 import Beautifu ...

  6. 爬虫爬评书吧_爬虫学习:xpath爬取评书网

    在家闲着,想找点评书听,但找了很久都没找到方便打包下载的地方.于是就拿起自学的python爬虫,自己动手丰衣足食. 运行环境:Windows7,python3.7 操作步骤: 1.打开选好的评书主页面 ...

  7. python爬虫实例练习:爬取慕课网课程名称以及对应的链接

    1.安装与开发环境 模块安装: bs4 解析库安装:pip install bs4 开发环境: python 3.x + pycharm ps:文章来源于小编的头条号:"python数据科学 ...

  8. python爬取MOOC课程信息

    MOOC课程信息爬取 时间 :2019-10-12 一.任务与目标 网站地址 http://www.imooc.com/course/list/ 2. 采用scrapy爬虫框架 爬取信息包括:课程名称 ...

  9. 使用scrapy爬虫框架爬取慕课网全部课程信息

    爬取的链接: http://www.imooc.com/course/list 爬取的内容: 课程链接, 课程的图片url, 课程的名称, 学习人数, 课程描述 1.安装scrapy模块 pip in ...

最新文章

  1. php dw文件上传下载,使用PHP实现文件上传
  2. SLF4J 的几种实际应用模式--之二:SLF4J+Logback
  3. SQL Server 2008行数据和页数据压缩解密
  4. unity3d优化IOS
  5. AOV网拓扑排序(c/c++)
  6. 异常注意事项_finally有return语句
  7. matlab深度学习_matlab使用贝叶斯优化的深度学习
  8. 用计算机控制英文,计算机控制
  9. Random Forest算法中的参数详解
  10. vue2 枚举类型转换
  11. Python自定义包
  12. Cesium:去除原生自带右上角弹窗
  13. []TLD code run
  14. 【算法导论】第15章动态规划
  15. 我写的万年历插件(含天干地支,农历,阳历,节气,各种节假日等),基于MooTools 1.4
  16. c语言int作用,C语言中的int max(int x,int y) 究竟有何作用?
  17. GitHub 中国区前 100 名到底是什么样的人?
  18. 任正非:华为不会让CFO接班 干部选拔以李云龙为标杆
  19. hive根据日期算哪一年的第几周(年周)以及算周几星期几
  20. ssdb leveldb ldb文件恢复 ext4magic extundelete

热门文章

  1. 门牌号码编辑器_用于门牌号码检测的深度学习
  2. 女人入洞房那天以后!!
  3. 央视做成“宝葫芦”不是完全没有机会
  4. 7.20 Bootstrap、企业黄页2.0、form表单、全选不选反选
  5. 四川大学锦城学院计算机系2013届李乔,四川大学锦城学院2019年度“翻转课堂”教学技能大赛圆满举行...
  6. MySQL安装失败,如何完全卸载MySQL
  7. win10 安装.net3.5失败,错误代码0x800f0922
  8. 两台异步电动机(星角降压启动+自耦降压启动)的顺序启/停控制——电气控制
  9. python实验报告范文及模板_太阳能电池实验报告模板
  10. FL Studio水果编曲20.8.4更新内容及新增功能介绍