基于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("\n", "").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) + '个课程:\n')
            f.writelines('title:' + each['title'] + '\n')
            f.writelines('desc:' + each['desc'] + '\n')
            f.writelines('time:' + each['time'] + '\n')
            f.writelines('level:' + each['level'] + '\n')
            f.writelines('learnNumber:' + each['learnNumber'] + '\n\n')
        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福利。

更多相关文章
一周排行
  • Collecting Log In Info Through MITM { Man In The Middle } Attack Ok so I've been reading online and there is
  • 


    		    5.MySQL Cluster(MySQL集群)
    5.1 MySQL Cluster 简介 请参考官方文档:http://dev.mysql
  • 


    		    Rundeck crontab格式
    rundeck的crontab任务不同于Linux上边的,它精确到秒级别.另外它还存在几个
  • PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种Web标准: DOM 处理, CSS 选择器, JSON, Canvas, ...
  •   IntelliLock的使用说明: http://blog.csdn.net/gnicky/article/details/20737107 http://download.csdn.net/detail/wxl
  • 第一章:Web标准 1.内容.结构.表现和行为 内容是网页原材料,如文本,图像,视频等.结构是XHTML的标记集合. 表现即外观,用CSS来设置.行为是对浏览者动作的反应,用JavaScript来编写. 好的网页必须 ...
  • Google Code jam Qualification Round 2015   Problem A. Standing Ovation
    Problem A. Standing Ovation  Problem's Link:
  • 竞赛图:图中的任意两点间有且仅有一条有向弧连接 求竞赛图中的哈密顿路的算法: 首先,由数学归纳法可证竞赛图在n>=2时必存在哈密顿路: (1)n=2时显然: (2)假设n=k时,结论成立,哈密顿路为V1,V2, ...
  • 1.用SQL语句查找出字符型字段内的最大值 select max(cast(字段 as int)) from 表 注:因为数据库是按字符比较的,10,9.因为9比1大,而只要有一位数字大,10后面就不会比较了,所以9
  • 转了几篇文章看看效果 看看51cto的效果为 我的博克:alphajay.blogspot.com 等有空再把自己原创的搞到这里来