写在前面
从今天开始的几篇文章,我将就国内目前比较主流的一些在线学习平台数据进行抓取,若是时间充足的状况下,会对他们进行一些简单的分析,好了,平台大概有51CTO学院
,CSDN学院
,网易云课堂
,慕课网
等平台,数据统一抓取到mongodb
里面,若是对上述平台形成了困扰,请见谅,毕竟我就抓取那么一小会的时间,不会对服务器有任何影响的。html
<div align="center"> <img src="https://user-gold-cdn.xitu.io/2018/12/28/167f2246327f56e8?w=300&h=300&f=jpeg&s=7155" width=200 /> </div> python
1. 目标网站
今天的目标网站是 http://edu.51cto.com/courselist/index.html?edunav
数据量大概在1W+,还不错 git
2. 分析页面须要的信息
下图标注的框框,就是咱们须要的信息了 github
若是查看源码,咱们还能获得其余有价值的隐藏信息,也同时的抓取到,另外,今天的主题不是下载图片,因此针对课程缩略图,我只保留一个图片连接到mongodb
里面,就不作单独的处理了。ajax
在开发者工具中,继续检索有用信息。发现一个独家
这个信息看似有用唉,能够作保留。mongodb
3. 分析爬取方式
分析完毕就是要爬取操做了,看一下这个网站是不是ajax动态加载的,若是不是,那么就采用最笨的办法爬取。 查阅网站源代码以后,发现没有异步数据。 采用URL拼接的方式爬取便可。服务器
URL规律以下,由于数据相对变化不大,末尾的页码是417,因此URL直接生成就能够了。session
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学院
完整的练个手async
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网站说一句多有得罪,罪过罪过。
<div align="center"> <img src="https://user-gold-cdn.xitu.io/2018/12/28/167f224663d1445c?w=198&h=198&f=jpeg&s=8360" /> </div>
代码上面除了mongodb
部分,基本是完整的,本身拷贝一下使用吧。