最近想了解一下在线教育的课程的如何去选择,课程的质量如何?所以试着去爬了一下腾讯课堂,只爬了IT互联网这一项。

通过分析发现要想爬取到评论需要是个步骤:

  1. 解析学习方向,如下图所示:


通过开发者工具审查元素,发现标签在<dl class="sort-menu sort-menu1 clearfix">

然后去写解析代码:

·    # _pattern表示解析href的正则表达式def get_menu_link(self, url, _pattern):headers = {'user-agent': self.round_header()}start = time.perf_counter()res = self.s.get(url, headers=headers)if res is None:returncontent = res.textmenu_pattern = re.compile(r'<dl class="sort-menu sort-menu1 clearfix">(.*?)</dl>', re.S)menu = re.findall(menu_pattern, content)link_paternt = re.compile(_pattern, re.S | re.M)if len(menu) != 0:links = re.findall(link_paternt, menu[0])end = time.perf_counter()_time = end - startprint('{0}解析成功,共耗时:{1:f}s'.format(url, _time))for item in links:item = item.replace('&amp;', '&')link = 'https://ke.qq.com{0}'.format(item)yield linkelse:end = time.perf_counter()_time = end - startprint('{0}解析失败!!!,共耗时:{1:f}s'.format(url, _time))return None
  1. 解析学习方向下的分类,如下图所示(发现与第一步相似):

  1. 到这里就要解析课程信息了,全部课程都在<ul class="course-card-list" auto-test="">下,如图所示:


解析代码如下:

 def get_course_list(self, url):headers = {'user-agent': self.round_header()}start = time.perf_counter()res = self.s.get(url, headers=headers)if res is None:returncontent = res.textcourse_card_list_pattern = re.compile(r'<ul class="course-card-list.+?">\s+(.+)\s+</ul>', re.S)course_card_list = re.findall(course_card_list_pattern, content)course_list_pattern = re.compile(r'<li class="course-card-item.*?">.*?<h4 class="item-tt">\s+'+ r'<a href="(.*?)" target="_blank" class="item-tt-link.*?">(.*?)</a>\s+</h4>.*?<div '+ r'class="item-line.*?middle">\s+<span class="line-cell.*?">\s+(.*?)\s+</span>\s+<span '+ r'class="item-source">.*?class="item-source-link.*?">(.*?)</a>\s+.*?<div '+ r'class="item-line.*?bottom">\s+<span class="line-cell item-price free">(.*?)</span>\s+</div>\s+</li>',re.S)if len(course_card_list) != 0:#这里只获取了前三个course_list = re.findall(course_list_pattern, course_card_list[0])[0:3]end = time.perf_counter()_time = end - startprint('解析成功,共耗时:{0}s'.format(_time))for item in course_list:yield {'url': 'https:{0}'.format(item[0]),'courseName': item[1],'num': item[2],'source': item[3],'fee': item[4]}else:end = time.perf_counter()_time = end - startprint('在该链接下没有找到课程列表,共耗时:{0}s'.format(_time))return None
  1. 最后到了获取评论,发现是动态获取的,所以要去分析发送请求中的参数


好了,参数都分析好了,接着看代码:

 def get_comment(self, url, params, headers):res = self.get(url, params=params, headers=headers)if res is None:return#解析json成Python对象result = json.loads(res.text).get('result')return {'total_page': result.get('total_page'),'comments': result.get('items'),'total_num': result.get('total_num')}# 获取cidcid = re.search(r'/(\d+)', _url).group(1)# 获取19位随机数r = eval('{0:.18f}'.format(random.random())[0:19])params = {'cid': cid,'count': 10,'page': 0,'filter_rating': 0,'bkn': '','r': r}headers = {'user-agent': t.round_header(),'referer': _url,'cookie': 'pgv_info=ssid=s6819497920; ts_last=ke.qq.com/course/144558; pgv_pvid=1821056816; ts_uid=7896600315; _pathcode=0.9075570219139721; tdw_auin_data=-; tdw_data={"ver4":"4","ver6":"","refer":"","from_channel":"","path":"eh-0.9075570219139721","auin":"-","uin":null,"real_uin":null}; tdw_first_visited=1; Hm_lvt_0c196c536f609d373a16d246a117fd44=1543998342; Hm_lpvt_0c196c536f609d373a16d246a117fd44=1543998342; tdw_data_new_2={"auin":"-","sourcetype":"","sourcefrom":"","uin":"","visitor_id":"53087919"}'}__url = 'https://ke.qq.com/cgi-bin/comment_new/course_comment_list'print('获取cid:{0}的评论'.format(cid), end='\t')comments = t.get_comment(__url, params, headers=headers)coures.update(comments)

到这里整个爬虫就写完了,全部代码如下:

import requests as req
import sys
import io
import time
import re
import random
import json
import csv
from utils.spider import Spiderclass Ten(Spider):def __init__(self, url):Spider.__init__(self, url)self.url = urlself.s = req.Session()self.flag = 1def get_menu_link(self, url, _pattern):headers = {'user-agent': self.round_header()}start = time.perf_counter()res = self.s.get(url, headers=headers)if res is None:returncontent = res.textmenu_pattern = re.compile(r'<dl class="sort-menu sort-menu1 clearfix">(.*?)</dl>', re.S)menu = re.findall(menu_pattern, content)link_paternt = re.compile(_pattern, re.S | re.M)if len(menu) != 0:links = re.findall(link_paternt, menu[0])end = time.perf_counter()_time = end - startprint('{0}解析成功,共耗时:{1:f}s'.format(url, _time))for item in links:item = item.replace('&amp;', '&')link = 'https://ke.qq.com{0}'.format(item)yield linkelse:end = time.perf_counter()_time = end - startprint('{0}解析失败!!!,共耗时:{1:f}s'.format(url, _time))return Nonedef get_course_list(self, url):headers = {'user-agent': self.round_header()}start = time.perf_counter()res = self.s.get(url, headers=headers)if res is None:returncontent = res.textcourse_card_list_pattern = re.compile(r'<ul class="course-card-list.+?">\s+(.+)\s+</ul>', re.S)course_card_list = re.findall(course_card_list_pattern, content)course_list_pattern = re.compile(r'<li class="course-card-item.*?">.*?<h4 class="item-tt">\s+'+ r'<a href="(.*?)" target="_blank" class="item-tt-link.*?">(.*?)</a>\s+</h4>.*?<div '+ r'class="item-line.*?middle">\s+<span class="line-cell.*?">\s+(.*?)\s+</span>\s+<span '+ r'class="item-source">.*?class="item-source-link.*?">(.*?)</a>\s+.*?<div '+ r'class="item-line.*?bottom">\s+<span class="line-cell item-price free">(.*?)</span>\s+</div>\s+</li>',re.S)if len(course_card_list) != 0:course_list = re.findall(course_list_pattern, course_card_list[0])[0:3]end = time.perf_counter()_time = end - startprint('解析成功,共耗时:{0}s'.format(_time))for item in course_list:yield {'url': 'https:{0}'.format(item[0]),'courseName': item[1],'num': item[2],'source': item[3],'fee': item[4]}else:end = time.perf_counter()_time = end - startprint('在该链接下没有找到课程列表,共耗时:{0}s'.format(_time))return Nonedef get_comment(self, url, params, headers):res = self.get(url, params=params, headers=headers)if res is None:returnresult = json.loads(res.text).get('result')return {'total_page': result.get('total_page'),'comments': result.get('items'),'total_num': result.get('total_num')}def save(self, data):fieldnames = ['url', 'courseName', 'num', 'source', 'fee', 'total_num', 'total_page', 'comments']file_name = 'mooc.csv'with open(file_name, 'a+', newline='', encoding='utf-8') as f:w = csv.DictWriter(f, fieldnames)if self.flag == 1:w.writeheader()self.flag = 0w.writerow(data)if __name__ == "__main__":# it 互联网# 第一步先解析互联网下的分类URL# 第二步解析一级菜单下的分类# 第三步解析二级菜单下的前三个课程链接# 第四步解析课程中的评论url = 'https://ke.qq.com/course/list?mt=1001'list_no = []t = Ten(url)# 1.link_paternt = r'<dd class="">\s+<\w+></\w+>\s+<a href="(.*?)" title=".*?">.*?</a>\s+</dd>'print('--------开始爬取--------')links = t.get_menu_link(url, link_paternt)if links is not None:for item in links:# 2.option_pattern = r'<dd class="">\s+<a href="(.*?)" title=".*?">.*?</a>\s+</dd>'options = t.get_menu_link(item, option_pattern)time.sleep(2)if options is not None:for option in options:print('开始解析{}'.format(option), end=' ====>> ')# 3course_list = t.get_course_list(option)time.sleep(2)if course_list is None:list_no.append(option)continueelse:for coures in course_list:_url = coures.get('url')# 4cid = re.search(r'/(\d+)', _url).group(1)r = eval('{0:.18f}'.format(random.random())[0:19])params = {'cid': cid,'count': 10,'page': 0,'filter_rating': 0,'bkn': '','r': r}headers = {'user-agent': t.round_header(),'referer': _url,'cookie': 'pgv_info=ssid=s6819497920; ts_last=ke.qq.com/course/144558; pgv_pvid=1821056816; ts_uid=7896600315; _pathcode=0.9075570219139721; tdw_auin_data=-; tdw_data={"ver4":"4","ver6":"","refer":"","from_channel":"","path":"eh-0.9075570219139721","auin":"-","uin":null,"real_uin":null}; tdw_first_visited=1; Hm_lvt_0c196c536f609d373a16d246a117fd44=1543998342; Hm_lpvt_0c196c536f609d373a16d246a117fd44=1543998342; tdw_data_new_2={"auin":"-","sourcetype":"","sourcefrom":"","uin":"","visitor_id":"53087919"}'}__url = 'https://ke.qq.com/cgi-bin/comment_new/course_comment_list'print('获取cid:{0}的评论'.format(cid), end='\t')comments = t.get_comment(__url, params, headers=headers)coures.update(comments)t.save(coures)

爬取腾讯课堂的课程评论相关推荐

  1. 谷歌爬虫ua_Python爬虫,实战爬取腾讯视频评论!

    文章目录: 一.前提条件 二.分析思路 三.代码编写 四.结果展示 一.前提条件 安装了Fiddler了(用于抓包分析) 谷歌或火狐浏览器 如果是谷歌浏览器,还需要给谷歌浏览器安装一个SwitchyO ...

  2. 网络爬虫---抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享)

    抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 文章目录 抓包分析,用抓包分析爬取腾讯视频某视频所有评论(Fiddler工具包的分享) 一.抓包分析 1.下载工具并安装 ...

  3. Python+Scrapy爬取腾讯新闻首页所有新闻及评论

    前言 这篇博客写的是实现的一个爬取腾讯新闻首页所有的新闻及其所有评论的爬虫.选用Python的Scrapy框架.这篇文章主要讨论使用Chrome浏览器的开发者工具获取新闻及评论的来源地址. Chrom ...

  4. Python爬虫 爬取腾讯视频评论内容

    Python爬虫 爬取腾讯视频评论内容 腾讯视频评论内容在源码里是不可见,所以要使用抓包分析. 可安装fiddler代理服务器实现. 下面爬了腾讯视频评论内容(不包括回复),及发表评论者的id.昵称和 ...

  5. python实现qq登录腾讯视频_Python爬取腾讯视频评论的思路详解

    一.前提条件 安装了Fiddler了(用于抓包分析) 谷歌或火狐浏览器 如果是谷歌浏览器,还需要给谷歌浏览器安装一个SwitchyOmega插件,用于代理服务器 有Python的编译环境,一般选择Py ...

  6. Python 爬取腾讯电视剧评论

    定向爬取腾讯电视剧评论 本例思路:打开评论页面,通过fiddler提取加载评论页面的网址,对比分析url,构造内容和用户pattern,然后爬取输出. 1,打开电视剧如果爱页面https://v.qq ...

  7. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  8. Python网络爬虫:爬取腾讯招聘网职位信息 并做成简单可视化图表

    hello,大家好,我是wangzirui32,今天我们来学习如何爬取腾讯招聘网职位信息,并做成简单可视化图表,开始学习吧! 文章目录 1. 网页分析 2. 获取json数据 3. 转换为Excel ...

  9. Python爬虫---爬取腾讯动漫全站漫画

    Python爬虫---爬取腾讯动漫全站漫画 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源 ...

最新文章

  1. inno setup插件可选安装代码_代码检测工具(sonar docker方式安装)
  2. 微服务下的APM全链路监控
  3. sql server 2008安装需要一直重启。但重启后又没有达到效果。
  4. nodejs 定时 mysql_nodejs 使用 mysql
  5. 计算机设备安全隐患排查,安全安全隐患排查实施方案
  6. 夜间灯光遥感数据下载方法
  7. 关于人工智能不会使大脑变懒惰的议论文_模拟人类大脑 :人工智能的救赎之路 ?...
  8. Javascript文件加载:LABjs和RequireJS
  9. 网站搜索优化SEO概念与方法
  10. 计算机格式按键在哪儿,键盘开关按键在哪里
  11. 人月到底有多少神话色彩
  12. Aspose.Words for .NET使用教程:如何使用脚注和尾注并设置每页行字数
  13. 输入一个整数,若为奇数则输出其平方根,否则输出其立方根(分别用单分支、双分支和条件运算实现)
  14. 痞子衡嵌入式:我被邀请做贸泽电子与非网联合推出的《对话工程师》节目嘉宾...
  15. 万字长文测评:3款口碑炸裂的BI数据分析工具,最好用的其实是……
  16. javacv 视频转音频(提取视频中音频)
  17. Spark 入门简介
  18. base64图片格式转换
  19. 177本名著浓缩成了177句话!经典收藏!太有道理了!
  20. 安装vue cli失败,显示this package has been deprecated in favour的解决办法

热门文章

  1. 15000 字的 MySQL 速查手册
  2. Windows10设置暗色主题
  3. C++程序设计原理与实践 习题答案 第二十六章 第26章习题答案
  4. Monitor模式和AP模式下获取WiFi的CSI信号
  5. Python案例3—计算基础代谢率V_1.0
  6. 《算法导论3rd第一章》算法在计算中的作用
  7. ue4加载本地图片_UE4 读取本地图片
  8. dos批处理脚本自动添加网络IP打印机-简单亲测可用
  9. PSAM卡之常用APDU指令错误码【转】
  10. 微信中禁止网页下拉出现网页由XXX提供