基于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福利。
基于requests实现极客学院课程爬虫的更多相关文章
- python scrapy版 极客学院爬虫V2
python scrapy版 极客学院爬虫V2 1 基本技术 使用scrapy 2 这个爬虫的难点是 Request中的headers和cookies 尝试过好多次才成功(模拟登录),否则只能抓免费课 ...
- python极客学院爬虫V1
定向爬取极客学院视频,原本只有年费VIP只能下载,经过分析,只要找个免费体验VIP即可爬取所有视频 涉及的基本技术:python xpath 正则 com+ 通过python调用迅雷从组件,实现自动创 ...
- 【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎
Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九, ...
- scrapy爬取极客学院全部课程
# -*- coding: utf-8 -*- # scrapy爬取极客学院全部课程 import scrapy from pyquery import PyQuery as pq from jike ...
- maven介绍 极客学院
来自极客学院 Apache Maven 是一套软件工程管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven - 概述 M ...
- 极客学院年VIP卡原价260的F码,200出售
F码是中国最大的IT职业在线教育平台——极客学院推出的VIP时间兑换码,凭此可在极客学院官网兑换年VIP,畅享平台上所有IT技术课程. 购买请点击 http://www.bejson.com/othe ...
- "做中学"之“极客时间”课程学习指导
目录 "做中学"之"极客时间"课程学习指导 所有课程都可以选的课程 Java程序设计 移动平台开发 网络攻防实践 信息安全系统设计基础 信息安全专业导论 极客时 ...
- 【极客学院-idea教程】
极客学院idea教程: http://whudoc.qiniudn.com/2016/IntelliJ-IDEA-Tutorial/index.html
- 极客学院免费VIP
[手快福利]用我的链接注册极客学院,你我都能免费得30天VIP!6500+编程开发视频教程随便学,还能下载资料和源码 http://e.jikexueyuan.com/invite/index.htm ...
随机推荐
- 【团队项目选题】自选项目:桌游APP
由于我们团队的黄金点游戏结果是第二名,按理说是一定能选到一个自选项目的,所以以下只列出我们选择的自选项目 自选项目名称 桌游APP 暂定 (名字还没想好) 项目大致介绍 此APP集成了多种桌游,主 ...
- 防DDOS攻击SHELL脚本
最近一段时间服务器频繁遭到DDOS攻击,目前只能通过封IP来源来暂时解决.IP不源变化多端,光靠手工来添加简直是恶梦,想了个方法,用SHELL来做. 比较简单,但很实用:) 以下内容根据作者原文进行适 ...
- ios开发网络知识 TCP,IP,HTTP,SOCKET区别和联系
TCP,IP,HTTP,SOCKET区别和联系 网络由下往上分为: 对应 物理层-- 数据链路层-- 网络层-- IP协议 传输层-- ...
- BZOJ1483: [HNOI2009]梦幻布丁
传送门 名字起得很高端实际上很简单的算法hhh 启发式合并 简单讲就是一些合并一堆队列的题可以用启发式合并,或者说这是一个思想.每次把小的合并到大的部分,均摊复杂度$O(MlogN)$. //BZOJ ...
- virtual和abstract
virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能私有的. ...
- .NET导入Excel到SQL数据库
在我们开发各类应用型系统,经常会遇到导入导出Excel,为什么会用到他呢?企业或者单位在从无信息化到信息化的一个转变过程.在没有信息化的企业或单位之前,一般都采用Excel来记录相应的数据,做统计计算 ...
- 将十六进制色值转换成Color
在给Background赋值时,除了自带的Red,Blue,Black等,可以通过以下方法赋予其他颜色. 主要是将Hex转换成ARGB(A:alpha,表示透明度.R:Red.G:Green.B:Bl ...
- Discuzx系统 CSS 编码规范,CSS属性书写顺序
1. 属性写在一行内,属性之间.属性名和值之间以及属性与“{}”之间须有空格,例如:.class { width: 400px; height: 300px; } 2. 属性的书写顺序: ...
- 聊聊Azure的安全性
本来没打算写这篇博文,毕竟感觉太理论化,不像做技术的人应该写的东西,但是作为一名售前,发现很多不了解Azure的客户,上来的第一个问题竟然就是Azure如何保证客户数据的安全性,我清楚记得我第一次被问 ...
- c#微信开发 转
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...