写在前面

从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院CSDN学院网易云课堂慕课网等平台,数据统一抓取到mongodb里面,如果对上述平台造成了困扰,请见谅,毕竟我就抓取那么一小会的时间,不会对服务器有任何影响的。

1. 目标网站

今天的目标网站是 http://edu.51cto.com/courselist/index.html?edunav 数据量大概在1W+,还不错

2. 分析页面需要的信息

下图标注的框框,就是我们需要的信息了

如果查看源码,我们还能得到其他有价值的隐藏信息,也同时的抓取到,另外,今天的主题不是下载图片,所以针对课程缩略图,我只保留一个图片链接到mongodb里面,就不做单独的处理了。

在开发者工具中,继续检索有用信息。发现一个独家 这个信息看似有用唉,可以做保留。

3. 分析爬取方式

分析完毕就是要爬取操作了,看一下这个网站是否是ajax动态加载的,如果不是,那么就采用最笨的办法爬取。

查阅网站源代码之后,发现没有异步数据。

采用URL拼接的方式爬取即可。

URL规律如下,因为数据相对变化不大,末尾的页码是417,所以URL直接生成就可以了。

http://edu.51cto.com/courselist/index-p2.html
http://edu.51cto.com/courselist/index-p3.html
http://edu.51cto.com/courselist/index-p4.html
http://edu.51cto.com/courselist/index-p5.html
...
http://edu.51cto.com/courselist/index-p417.html

今天主要使用requests-html这个库

github地址 : https://github.com/kennethreitz/requests-html 依旧是大神开发的,非常6。

我们拿51cto学院 完整的练个手

from requests_html import HTMLSession

BASE_URL = "http://edu.51cto.com/courselist/index.html"
def get_content():
session = HTMLSession()
r = session.get(BASE_URL)
print(r.html) if __name__ == '__main__':
get_content()

使用上面的代码,就能快速的获取到一个请求的响应了。

继续编写下面几行代码之后,你不得不惊叹,我去~,数据都获取到了!

    print(r.html)
print(r.html.links)
print(r.html.absolute_links) # 获取所有的绝对地址
print(r.html.find('.cList',first=True)) # 获取class=cList的第一个标签
c_list = r.html.find('.cList',first=True)
print(c_list.text)



当然这些对咱来说还是远远不够的,毕竟我们要把他写入mongodb里面

上面的只是叫你对这个库有一个基本的认知,更多的资料你可以去他的教程网站查阅

http://html.python-requests.org/

4. 分析爬取方式

看一下异步方式,异步的出现可以为我们的爬虫加速

这个地方有一个你一定要注意的,我写这篇文章的时候,requests-html 是从github下载之后,更新的本次,你如果之前使用pip进行安装,那么异步应该是没有更新上去的。

好了,接下来我们实现一下异步,可能由于作者认为异步目前不是很稳定,所以我查阅了一下他的源码,然后实现了如下代码,写的不好,请见谅~

下面的代码,注意看模块的区别,以及核心的异步函数

async def get_html():
for i in range(1,3):
r = await asession.get(BASE_URL.format(i)) # 异步等待
get_item(r.html)
if __name__ == '__main__':
result = asession.run(get_html)
from requests_html import AsyncHTMLSession   # 导入异步模块

asession = AsyncHTMLSession()

BASE_URL = "http://edu.51cto.com/courselist/index-p{}.html"

async def get_html():
for i in range(1,3):
r = await asession.get(BASE_URL.format(i)) # 异步等待
get_item(r.html) def get_item(html):
c_list = html.find('.cList',first=True)
if c_list:
items = c_list.find('.cList_Item')
for item in items:
title = item.find("h3",first=True).text # 课程名称
href = item.find('h3>a',first=True).attrs["href"] # 课程的链接地址
class_time = item.find("div.course_infos>p:eq(0)",first=True).text
study_nums = item.find("div.course_infos>p:eq(1)", first=True).text
stars = item.find("div.course_infos>div", first=True).text
course_target = item.find(".main>.course_target", first=True).text
price = item.find(".main>.course_payinfo h4", first=True).text
dict = {
"title":title,
"href":href,
"class_time":class_time,
"study_nums":study_nums,
"stars":stars,
"course_target":course_target,
"price":price
}
print(dict) else:
print("数据解析失败") if __name__ == '__main__':
result = asession.run(get_html)

代码运行之后,控制台就会输出相应的内容,上述代码中有个地方用到了大量的解析HTML,这个你搜索一下官方文档就可以看明白,不进行过多的解释。

5. 写入到mongodb里面

这部分代码就非常非常简单了

结果如下

实际的爬取过程中,也没有发现反爬虫的一些限制,不过咱毕竟是为了研究一下requests-html的用法,所以只能对51CTO网站说一句多有得罪,罪过罪过。

代码上面除了mongodb部分,基本是完整的,自己拷贝一下使用吧。

Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取的更多相关文章

  1. Python爬虫入门教程 24-100 微医挂号网医生数据抓取

    1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做 ...

  2. Python爬虫入门教程 39-100 天津市科技计划项目成果库数据抓取 scrapy

    爬前叨叨 缘由 今天本来没有打算抓取这个网站的,无意中看到某个微信群有人问了一嘴这个网站,想看一下有什么特别复杂的地方,一顿操作下来,发现这个网站除了卡慢,经常自己宕机以外,好像还真没有什么特殊的.. ...

  3. Python爬虫入门教程 33-100 《海王》评论数据抓取 scrapy

    1. 海王评论数据爬取前分析 海王上映了,然后口碑炸了,对咱来说,多了一个可爬可分析的电影,美哉~ 摘录一个评论 零点场刚看完,温导的电影一直很不错,无论是速7,电锯惊魂还是招魂都很棒.打斗和音效方面 ...

  4. Python爬虫入门教程 4-100 美空网未登录图片爬取

    美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...

  5. Python爬虫入门教程 13-100 斗图啦表情包多线程爬取

    斗图啦表情包多线程爬取-写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的.关键技术点 aioht ...

  6. Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分

    1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...

  7. Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分

    1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...

  8. python爬虫入门02:教你通过 Fiddler 进行手机抓包

    哟~哟~哟~ hi起来 everybody 今天要说说怎么在我们的手机抓包 通过 python爬虫入门01:教你在Chrome浏览器轻松抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中 ...

  9. Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy

    爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...

随机推荐

  1. HTC VIVE固定头显位置

    用此方法可以限制HTC VIVE头显定位(即固定头显位置,但是视角是不固定的). UnityEngine.XR.InputTracking.disablePositionalTracking = fa ...

  2. ios6和ios5横竖屏切换

    记录于2013/8/5   在切换横竖屏的时候调用到的一些委托方法: #pragma mark - UIApplicationDelegate //写在Appdelegate中,在具体的某一视图控制器 ...

  3. JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

    多线程 一.线程的概念 1.1 程序.进程.线程 程序:Program 是一个静态的概念 进程:Process 是一个动态的概念 进程是程序的一次动态执行过程,占用特定的地址空间. 每个进程都是独立的 ...

  4. 让java代码在Idea外面运行起来

    今天在写聊天程序,终于写到双方通信的时候,发现idea只能开一个客户端.虽说可以开多线程来实现多开,但是懒得改动代码,所以我就试试能不能把jar包导出来运行.首先我用maven自带的工具打了jar包, ...

  5. cookie设置域名问题,cookie跨域

    今天研究一天发现cookie无法设置除当前域名或者其父域名之外的其他domain. 这个是浏览器出于对cookie的保护造成的,也就是cookie无法跨域设置. 对于子域名也有如下规则,当前域名只能设 ...

  6. 如何使用$.each()与$().each()以及他们的区别

    1.首先,说下$.each(Arry/Object,function(index,val){ //index表示下标,val表示下标对应的值 }) 下面是使用$.each()的几种类型,其中arr2与 ...

  7. nodejs编译遇到的问题

    src\node_contextify.cc:631: Assertion 'args[1]->IsString()' failed. node 10 版本会出现这个问题, 安装natives后 ...

  8. vue创建状态管理(vuex的store机制)

    1:为什么说要是永远状态管理 在使用 Vue 框架做单页面应用时,我们时常会遇到传值,组件公用状态的问题.(子父间传值文章传送门) ,如果是简单的应用,兄弟组件之间通信还能使用 eventBus 来作 ...

  9. Codeforces Round #555 (Div. 3) AB

    A:    http://codeforces.com/contest/1157/problem/A 题意:每次加到10的整数倍之后,去掉后面的0,问最多有多少种可能. #include <io ...

  10. 用 PHP文件引入css样式

    html: <link rel="stylesheet" type="text/css" href="http://www.mysite.com ...