长江雨课堂练习题的爬取,并存到mysql中(仅限选择题,填空题有需要的可以自己补全)

**最近上网课,老师有些练习题在长江雨课堂布置,为了好复习我用了2小时写了个简单的爬虫,将习题爬取放到了mysql中下面开始讲讲我的思路。
首先这个需要账号登录 ,那就必须需要在爬取的时候带上cookie,
获取的方法很简单,直接登录常见雨课用f12打开开发者工具,随便点击一个数据,查看resquest headers ,并且复制cookie,后面写程序有用。
在这里插入图片描述
下面我们开始点开练习题界面,进入之后,打开开发者工具,全局搜素几个题目的字,找到了一个数据包
数据包
遮住的是课程id,以及试题的id。
发现数据包是一个json数据
发现数据包是一个json数据找到底下的problem_result值
找到底下的problem_result值然后查看slide的值
然后查看slide的值如图查看一直找到一个html标签的值,发现里面就有题目,由此判断
如图查看一直找到一个html标签的值,发现里面就有题目,由此判断这就是我们需要爬取的信息。写爬虫必须在请求头中加入cookie,我们刚才保存到cookie就可以使用(ps:时间长了cookie可能失效,可以按原来的方法获取新值)
这个爬虫的最麻烦的就是json数据吧里面的东西太多,需要一步一步解析然后取出自己想要的值。
headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36', 'cookie': '' }
cookie自己写,这个是我们需要请求的url
https://changjiang.yuketang.cn/v2/api/web/cards/detlist/{}?classroom_id={}
括号内写自己的课程id以及练习题的号码
下来就是解析数据

response=requests.get(url,headers=headers).json()
    for i in response['data']['problem_results']:#分每个题目解析
        try:
            bro=i['slide']['ProblemBodys'][0]['Paragraphs'][0]['Lines'][0]['Html']#题目在html里面需要用到xpath来提取文本
            #前面需要写from lxml import etree 引入这个方法
          	question=str(etree.HTML(bro).xpath('//*//span/text()')[0])#提取到题目
            # print(question)
            # print(i['answer'])#这是为了一步一步解析数据
            answer=str(i['answer'])#这是题目的答案提取
            # print(i['slide']['Problem']['Bullets'][0]['Contents'][0]['Paragraphs'][0]['Lines'][0]['Html'])
            xuanxiang=''#题目选项四个选项需要拼接
            for q in i['slide']['Problem']['Bullets']:
                tree = q['Contents'][0]['Paragraphs'][0]['Lines'][0]['Html']#答案寻找方法和找题目的方法一样,需要自己逐步的试验
                y = etree.HTML(tree).xpath('//*//span/text()')[0]
                # print(q['Label'],question)
                xuanxiang=xuanxiang+q['Label']+':'+y#将答案凭借成字符串
            # print(xuanxiang)

现在我们已经提取出了题目和选项以及答案,接下来就是将她存到数据库中
先需要创建一个表存放数据

 CREATE TABLE `mt` (\n  `id` int NOT NULL AUTO_INCREMENT,\n  `question` varchar(128) DEFAULT NULL,\n  `answer` varchar(12) DEFAULT NULL,\n  `xuanxiang` varchar(256) DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `question` (`question`)\n) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8

我创建的表名叫mt
接下来就是写sql语句

insert into mt (question,answer,xuanxiang) values(%s,%s,%s)

将数据写入表中

cursor.execute(sql,(question,answer,xuanxiang))
db.commit()

在写入过程中遇到一个问题就是keyerror ,我发现填空题的和选择题不一样,但是方法是一样的,这就懒得写了,为了避免keyerror,这里用到了try except
练习题id获取方法一样对https://changjiang.yuketang.cn/v2/web/studentLog/{}括号里面写课程id,这里就不做叙述了 ,我这用了Session这个方法,不用也可以,但是我懒得改了
下面是全部代码

import requests
from lxml import etree
import pymysql
db=pymysql.connect(host='localhost',user='root',password='123456',db='mrsoft')
cursor=db.cursor()

sql="""insert into mt (question,answer,xuanxiang) values(%s,%s,%s)"""


session=requests.Session()
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'cookie': '这自己写'
}
response=requests.get('https://changjiang.yuketang.cn/v2/api/web/logs/learn/{这里写课程id}?actype=-1&page=0&offset=20&sort=-1',headers=headers).json()
list=[]
for a in response['data']["activities"]:
    list.append(a['courseware_id'])
for u in list:
    url='https://changjiang.yuketang.cn/v2/api/web/cards/detlist/{}?classroom_id=2661154'.format(u)
response=requests.get(url,headers=headers).json()
    for i in response['data']['problem_results']:#分每个题目解析
        try:
            bro=i['slide']['ProblemBodys'][0]['Paragraphs'][0]['Lines'][0]['Html']#题目在html里面需要用到xpath来提取文本
            #前面需要写from lxml import etree 引入这个方法
          	question=str(etree.HTML(bro).xpath('//*//span/text()')[0])#提取到题目
            # print(question)
            # print(i['answer'])#这是为了一步一步解析数据
            answer=str(i['answer'])#这是题目的答案提取
            # print(i['slide']['Problem']['Bullets'][0]['Contents'][0]['Paragraphs'][0]['Lines'][0]['Html'])
            xuanxiang=''#题目选项四个选项需要拼接
            for q in i['slide']['Problem']['Bullets']:
                tree = q['Contents'][0]['Paragraphs'][0]['Lines'][0]['Html']#答案寻找方法和找题目的方法一样,需要自己逐步的试验
                y = etree.HTML(tree).xpath('//*//span/text()')[0]
                # print(q['Label'],question)
                xuanxiang=xuanxiang+q['Label']+':'+y#将答案凭借成字符串
            # print(xuanxiang)
        except KeyError:
            continue
            # bro = i['slide']['shapes'][0]['Paragraphs'][0]['Lines'][0]['Html']
        cursor.execute(sql,(question,answer,xuanxiang))
        db.commit()
db.close()

最后自己查看自己的表发现数据都写进去了,这个简单的爬虫也就完成了


版权声明:本文为mengxiaoxiang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。