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

    技术2022-07-11  150

    **最近上网课,老师有些练习题在长江雨课堂布置,为了好复习我用了2小时写了个简单的爬虫,将习题爬取放到了mysql中下面开始讲讲我的思路。 首先这个需要账号登录 ,那就必须需要在爬取的时候带上cookie, 获取的方法很简单,直接登录常见雨课用f12打开开发者工具,随便点击一个数据,查看resquest headers ,并且复制cookie,后面写程序有用。 下面我们开始点开练习题界面,进入之后,打开开发者工具,全局搜素几个题目的字,找到了一个数据包 遮住的是课程id,以及试题的id。 发现数据包是一个json数据 找到底下的problem_result值 然后查看slide的值 如图查看一直找到一个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()

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

    Processed: 0.010, SQL: 9