zoukankan      html  css  js  c++  java
  • 基于requests实现极客学院课程爬虫

    背景

    本文主要是为了完成极客学院课程《Python 单线程爬虫》中讲师布置的实战作业。

    开发环境

    操作系统:windows 10

    Python :Python 2.7

    IDE:PyCharm 4.5.3

    安装requests

    在CMD命令提示窗口敲以下一行命令即可安装。

    pip install requests

    实现代码

    # coding=utf-8
    __author__ = 'scaleworld'
    import requests
    import re
    import sys
    
    reload(sys)
    sys.setdefaultencoding("utf-8")
    
    
    class Spider:
        def __init__(self):
            print '开始爬取极客学院课程信息。。。'
    
        # 获取源代码
        def getSource(self, url):
            html = requests.get(url)
            return html.text
    
        # 获取每个课程块信息
        def getLessons(self, source):
            lessons = re.findall('deg="0" >(.*?)</li>', source, re.S)
            return lessons
    
        # 获取课程信息,如课程名称、课程介绍、课程时间、课程等级、学习人数
        def getLessonInfo(self, lesson):
            info = {}
            info['title'] = re.search('<h2 class="lesson-info-h2"><a(.*?)>(.*?)</a></h2>', lesson, re.S).group(2).strip()
            info['desc'] = re.search('<p style="height: 0px; opacity: 0; display: none;">(.*?)</p>', lesson, re.S).group(
                1).strip()
            timeandlevel = re.findall('<em>(.*?)</em>', lesson, re.S)
            info['time'] = timeandlevel[0].strip().replace("
    ", "").replace("    ", "")
            info['level'] = timeandlevel[1].strip()
            info['learnNumber'] = re.search('"learn-number">(.*?)</em>', lesson, re.S).group(1).strip()
            return info
    
        # 保存课程信息到文件LessionInfos.txt
        def saveLessionInfos(self, lessonInfos):
            # 'w':只写,会覆盖之前写入的内容
            # 也可以用'a':追加到文件末尾
            # 如果文件不存在,则自动创建文件
            f = open('LessionInfos.txt', 'w')
            i = 0
            for each in lessonInfos:
                i += 1
                f.writelines('' + str(i) + '个课程:
    ')
                f.writelines('title:' + each['title'] + '
    ')
                f.writelines('desc:' + each['desc'] + '
    ')
                f.writelines('time:' + each['time'] + '
    ')
                f.writelines('level:' + each['level'] + '
    ')
                f.writelines('learnNumber:' + each['learnNumber'] + '
    
    ')
            f.close()
    
    
    if __name__ == '__main__':
        # 定义课程信息数组
        lessonInfos = []
        # 课程信息页面url
        url = 'http://www.jikexueyuan.com/course/'
        # 实例化爬虫
        spider = Spider()
        # 取[1,21)及1到20页的课程信息
        for i in range(1, 21):
            # 构建分页URL
            pageUrl = url + '?pageNum=' + str(i)
            print '正在处理页面:' + pageUrl
            source = spider.getSource(pageUrl)
            lessons = spider.getLessons(source)
            for lesson in lessons:
                lessonInfo = spider.getLessonInfo(lesson)
                lessonInfos.append(lessonInfo)
                # print 'title:'+lessonInfo.get('title')
                # print 'desc:'+lessonInfo.get('desc')
                # print 'time:'+lessonInfo.get('time')
                # print 'level:'+lessonInfo.get('level')
                # print 'learnNumber:'+lessonInfo.get('learnNumber')
            print '已处理' + str(lessons.__len__()) + '个课程信息。'
        print '极客学院课程信息爬取完毕,正在保存课程信息。。。'
        spider.saveLessionInfos(lessonInfos)
        print '极客学院课程信息保存完毕。' 

    抓取结果示例

    第1个课程:
    title:WordPress 主题模板文件
    desc:本课程主要介绍构成 WordPress 主题的模板文件,模板文件的引用和模板文件的层次体系。
    time:3课时36分钟
    level:中级
    learnNumber:2215人学习

    第2个课程:
    title:Android 开发规范
    desc:本课程主要为大家讲解在 Android 开发中搭建项目时,整体的设计架构风格和规范以及基础架构、代码命名和编写规范等等。
    time:3课时41分钟
    level:初级
    learnNumber:2874人学习

    ……

    结语

    极客学院是个非常好的学习网站,大家可以点此链接获取免费的30天VIP福利。

  • 相关阅读:
    我的SWT与数字图像处理总结(1)—重点Image类的介绍
    我的SWT与数字图像处理总结(2)—使用JFreeChart生成灰度直方图
    使用Wiz编写和发布博客园(cnblogs)博客
    RCP之病人信息系统开发总结(2):项目结构分析和重要类分析
    Java与XML(一):采用DOM操作XML文件
    Java实例开发0502 简单的HTTP服务器端
    RCP之病人信息系统开发总结(1):数据库设计
    我的SWT与数字图像处理总结(3)—SWT如何得到图像某个位置的像素值和相应的RGB的值
    对象的保存和载入
    Java与XML(二):使用Dom4j 操作 XML 文件
  • 原文地址:https://www.cnblogs.com/imfanqi/p/4784280.html
Copyright © 2011-2022 走看看