专栏首页Python3爬虫100例教程Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取

Python爬虫入门教程 19-100 51CTO学院IT技术课程抓取

写在前面

从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,如果时间充足的情况下,会对他们进行一些简单的分析,好了,平台大概有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部分,基本是完整的,自己拷贝一下使用吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python爬虫入门教程 3-100 美空网数据爬取

    从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做“美空网”网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在...

    梦想橡皮擦
  • Python爬虫入门教程 22-100 CSDN学院课程数据抓取

    今天又要抓取一个网站了,选择恐惧症使得我不知道该拿谁下手,找来找去,算了,还是抓取CSDN学院吧,CSDN学院的网站为 https://edu.csdn.net...

    梦想橡皮擦
  • Python爬虫入门教程 9-100 河北阳光理政投诉板块

    之前几篇文章都是在写图片相关的爬虫,今天写个留言板爬出,为另一套数据分析案例的教程做做准备,作为一个河北人,遵纪守法,有事投诉是必备的技能,那么咱看看我们大河北...

    梦想橡皮擦
  • react native使用WebView加载本地html部署方案

    十里桃花舞丶
  • 前端跨域知识简介

    前端跨域知识简介 灵感 差不多2年前,由于业务需要,了解各种各样不同的跨域方式。但由于各种方式千奇百怪,我觉得有必要将各种方法封装起来,方便使用,弄了个简单的跨...

    李成熙heyli
  • 为了不复制粘贴,我被逼着学会了JAVA爬虫

    受疫情影响一直在家远程办公,公司业务进展的缓慢,老实讲活并没有那么多,每天吃饭、睡觉、逛技术社区、写博客,摸鱼摸得爽的很。早上本来还想在来个回笼觉,突然部门经理...

    程序员内点事
  • 为了不复制粘贴,我被逼着学会了JAVA爬虫

    受疫情影响一直在家远程办公,公司业务进展的缓慢,老实讲活并没有那么多,每天吃饭、睡觉、逛技术社区、写博客,摸鱼摸得爽的很。早上本来还想在来个回笼觉,突然部门经理...

    程序员内点事
  • Pytest系列(12)- 测试结果生成HTML报告插件之pytest-html的详细使用

    https://www.cnblogs.com/poloyy/category/1690628.html

    小菠萝测试笔记
  • Http协议时无状态的,没有记忆功能,连接--传送--断开

    private 字段十+,然后输出到页面上,然后重复刷新页面。服务器不记的上次给了浏览器什么,否则服务器的压力会太大。

    静心物语313
  • Frame在自动化中的处理

    在自动化中,如果一个元素定位不到,那么最大可能是在iframe中,我们先了解frame。frame是html中的框架,在html中,所谓框架就是可以在同一个浏...

    无涯WuYa

扫码关注云+社区

领取腾讯云代金券