实操题
1.Redis数据库操作
阅读以下说明和操作结果, 打开考生文件夹\文件夹中的材料,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存。
该题是关于Python操作Redis包括数据库的标题pyredis.py文件,题目主要通过Python连接Redis数据库和数据相关操作。
首先,命令行需要打开redis的服务,打开cmd,输入命令redis-server,敲回车。然后操作补充后的操作pyredis.py文件。
【操作结果】
【】
打开考生文件夹\10002”文件夹中的“pyredis.py根据注释,在空(1)至(10)处补充代码,完成后保存文件。
除删除(1)至(10)填写正确内容外,不能修改或删除材料中的任何其他内容。
1.正确答案:ConnectionPool 2.正确答案:Redis 3.正确答案:password 4.正确答案:get 5.正确答案:% 6.正确答案:self.register 7.正确答案:self.r 8.正确答案:!= 9.正确答案:== 10.正确答案:self.regis_login()
pyredis.py
import redis class RegisterLogin: def __init__(self): # 创建连接池对象,连接数据库1 pool = redis.ConnectionPool(host='127.0.0.1', port=6379, db=1, decode_responses=True) # 创建连接对象 self.r = redis.Redis(connection_pool=pool) def register(self, user_name, password): """注册逻辑""" self.r.set(user_name, password) print("注册成功") def regis_login(self): # 键盘输入要做的操作,1表示注册,2表示登录 op = input("请输入您要做的操作(1表示注册,表示登录):") if op == '1': # 输入用户名 user = input("请输入用户名:") # 根据输入用户名 check_user = self.r.get(user) # 若发现有内容,说明别人已经注册了 if check_user: print("用户%s已存在" % user) else: # 输入密码 passwd = input("请输入密码:") # 将用户名和密码进行注册 self.register(user, passwd) elif op == '2': # 输入用户名 u = input("请输入用户名:") # 输入密码 p = input("请输入密码:") # 根据用户名查询密码 select_p = self.r.get(u) # 若发现结果为None,表示不存在用户名 if select_p is None: print("不存在用户名") # 如果发现的密码不等于输入的密码,说明当前输入的密码错误 elif select_p != p: print("密码错误") # 如果查到的密码等于输入的密码,则登录成功 elif select_p == p: print("登录成功") else: print("操作不正确") def run(self): self.regis_login() if __name__ == "__main__": rl = RegisterLogin() rl.run()
2.selenium链家爬虫
阅读以下说明和操作结果, 打开考生文件夹\文件夹中的材料,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存。
该题是关于selenium题目,包括lianjia.py文件,题目主要通过selenium抓取链家二手房数据并存入CSV文件等操作。
【操作结果】
补充代码后,运行lianjia.py结果如下图所示。
生成的CSV如下图所示。
【】
打开考生文件夹\文件夹中的10004lianjia.py根据注释,在空(1)至(10)处补充代码,完成后保存文件。
除删除(1)至(10)填写正确内容外,不能修改或删除材料中的任何其他内容。
1.正确答案:webdriver.Chrome() 2.正确答案:get 三、正确答案:w' 4.正确答案:writeheader() 5.正确答案:switch_to 6.正确答案:execute_script 7.正确答案:split('|') 8.正确答案:append 9.正确答案:writerows 10.正确答案:click()
lianjia.py
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions from selenium.webdriver.common.by import By import csv class LianJiaSpider: def __init__(self): self.url = "https://cd.lianjia.com/" # 创建浏览器对象 self.browser = webdriver.chrome() # 这里要设置窗口最大化,否则,您将无法点击下一页的按钮 &bsp; self.browser.maximize_window() # 发送请求 self.browser.get(self.url) # 以写模式打开文件,得到文件对象 self.f = open('lianjia.csv', 'w', encoding='utf-8', newline='') # 得到字典写入的writer self.writer = csv.DictWriter(self.f, ["name", 'area', 'layout', 'square', 'direction', 'deco', 'floor', 'year', 'structure', 'total_price', 'per_price']) # 写入表头 self.writer.writeheader() def __del__(self): self.browser.close() def get_html(self): self.browser.find_element_by_link_text('二手房').click() # 切换窗口 self.browser.switch_to.window(self.browser.window_handles[1]) def parse_one_page(self): # 等待下一页那个元素刷新出来 WebDriverWait(self.browser, 10).until(expected_conditions.presence_of_element_located((By.XPATH, '//div[@class="page-box house-lst-page-box"]/a[last()]'))) # 这里将页面拉到底部,否则点不到下一页这个按钮 self.browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 拿到所有房屋的li节点 li_list = self.browser.find_elements_by_xpath('//ul[@class="sellListContent"]/li') print(li_list) data = [] for li in li_list: try: item = {} # 名字 item['name'] = li.find_element_by_xpath('.//div[@class="positionInfo"]/a[1]').text # 商圈 item['area'] = li.find_element_by_xpath('.//div[@class="positionInfo"]/a[2]').text # 房屋信息 house_info = li.find_element_by_xpath('.//div[@class="houseInfo"]').text # 处理房屋信息 house_info_list = house_info.split('|') # 户型 item['layout'] = house_info_list[0].strip() # 面积 item['square'] = house_info_list[1].strip() # 朝向 item['direction'] = house_info_list[2].strip() # 装修 item['deco'] = house_info_list[3].strip() # 楼层 item['floor'] = house_info_list[4].strip() # 年代 item['year'] = house_info_list[5].strip() # 结构 item['structure'] = house_info_list[6].strip() # 总价 total_price = li.find_element_by_xpath('.//div[@class="totalPrice totalPrice2"]').text item['total_price'] = total_price.replace('\n', '').strip() print(total_price) # 均价 item['per_price'] = li.find_element_by_xpath('.//div[@class="unitPrice"]/span').text.strip() print(item) data.append(item) except Exception: continue # 将数据存入CSV文件 self.writer.writerows(data) def get_all_page(self): self.get_html() while True: # 解析一页数据 self.parse_one_page() # 如果找不到下一页,就退出 if self.browser.page_source.find("下一页") == -1: return # 找到下一页这个按钮 next_btn = self.browser.find_element_by_xpath('//div[@class="page-box house-lst-page-box"]/a[last()]') # 点击该按钮 next_btn.click() def run(self): self.get_all_page() if __name__ == "__main__": spider = LianJiaSpider() spider.run()
3.个人存款计算器
阅读下列说明及运行结果, 打开“考生文件夹\10001”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Python基础语法的题目,包含deposit_calc.py文件,题目主要考察时间模块、运算符、if语句、类型转换等操作。
【运行结果】
【】
打开“考生文件夹\10001”文件夹中的“deposit_calc.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:center 2.正确答案:%% 3.正确答案:split 4.正确答案:mktime 5.正确答案:not 6.正确答案:int 7.正确答案:+= 8.正确答案:* 9.正确答案:dates 10.正确答案:format
deposit_calc.py
# 导入时间模块 import time # 初始化年利率值为0.05 rate = 0.05 # 居中输出软件标题 print("个人存款计算器".center(15)) print("-" * 20) # 居左输出储蓄方式 print("储蓄方式:活期".ljust(20)) # 输出起存日期 print("起存日期:" + time.strftime('%Y-%m-%d')) # 输出年利率 print("利率为:%.2f%%" % (rate * 100)) # 输入预计取款日期 days = input("取款日期(格式为2020-8-12):") # 遇错处理程序,判断输入日期是否符合日期格式 try: # 判断预计取款日期格式是否符合要求 time.strptime(days, "%Y-%m-%d") # 通过'-'分割取款日期 s_day = days.split('-') # 构造9个元素的时间元组 m_time = (int(s_day[0]), int(s_day[1]), int(s_day[2]), 0, 0, 0, 0, 0, 0) # 将时间元组转换成秒数 u_time = time.mktime(m_time) # 计算预计取款日期到当前日期的天数差 remain = int((u_time - time.time()) / 3600 / 24) # 取款日期大于1天,进行信息提示 if remain > 1: # 输入存款金额,单位为元 money = input("存入金额(元):") # 如果输入的存款金额如果不是数值型字符串 if not money.isdigit(): # 提示“输入非数字字符,将退出系统!” print('输入非数字字符,将退出系统!') else: # 将输入的存款金额转为整型 money = int(money) # 初始化本金与利息和为存入金额 sum = money # 如果存款时间少于365天 if remain < 365: # 计算利息 leave = remain * money * rate / 365 # 计算本金与利息和 sum += leave # 存款时间大于等于365天 else: # 计算年数和剩余的天数 year, dates = divmod(remain, 365) # 计算整年的利息和收益 for i in range(year): # 计算利息 leave = sum * rate # 计算本金与利息和 sum += leave # 计算小于1年的收益 else: # 计算利息 leave = dates * sum * rate / 365 # 计算收益 sum += leave # 输出修饰符 print("-" * 20) print("所得利息:", format(sum - money, '.2f')) print("本息合计:", format(sum, '.2f')) else: print("取款日期不能早于现在的时间,将退出系统!") # 输入日期格式不符合要求,输出提示信息 except: print("日期设置超出允许范围,将退出系统!")
4.Scrapy爬取股票信息
阅读下列说明及运行结果, 打开“考生文件夹\10007”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Scrapy爬虫框架的题目,包含项目文件夹stockstar,题目主要考察Scrapy框架相关操作。
【运行结果】
代码编辑完成后,直接运行run.py文件,便可启动爬虫抓取数据。
【】
打开“考生文件夹\10007\stockstar\stockstar\spider”文件夹中的stock.py文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:scrapy.Spider 2.正确答案:name 3.正确答案:start_urls 4.正确答案:css 5.正确答案:StockstarItem() 6.正确答案:load_item() 7.正确答案:yield 8.正确答案:page 9.正确答案:response 10.正确答案:Request
stock.py
# -*- coding: utf-8 -*- import scrapy from stockstar.items import StockstarItem, StockstarItemLoader class StockSpider(scrapy.Spider): # 爬虫名 name = 'stock' allowed_domains = ['quote.stockstar.com'] # 初始url start_urls = ['http://quote.stockstar.com/stock/ranklist_a_3_1_1.html'] def parse(self, response): # 从当前请求url中获取页码 page = int(response.url.split("_")[-1].split(".")[0]) # 通过css选择器获取该页股票的tr节点列表 item_nodes = response.css('#datalist tr') # 遍历每一个tr节点 for item_node in item_nodes: # 根据item文件所定义的字段内容,进行字段内容的抓取 item_loader = StockstarItemLoader(item=StockstarItem(), selector=item_node) item_loader.add_css("code", "td:nth-child(1) a::text") item_loader.add_css("abbr", "td:nth-child(2) a::text") item_loader.add_css("Circulation_market_value", "td:nth-child(3)::text") item_loader.add_css("Total_market_value", "td:nth-child(4)::text") item_loader.add_css("Circulating_share_capital", "td:nth-child(5)::text") item_loader.add_css("Total_share_capital", "td:nth-child(6)::text") # 将提取的数据load出来,使并赋值给变量stock_item stock_item = item_loader.load_item() # 数据交给管道 yield stock_item if item_nodes: # 获取下一页的页码 next_page = page + 1 # 拼接下一页的url next_url = response.url.replace("{0}.html".format(page), "{0}.html".format(next_page)) # 将拼接的url交给调度器 yield scrapy.Request(url=next_url, callback=self.parse)
5.护肤品首页
阅读下列说明及运行结果, 打开“考生文件夹\100011”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Django框架的题目,包含Skin文件夹和skin.sql文件,题目主要考察Django框架视图、模板、模型等相关操作。注意,在操作前需要进行数据库还原,首先创建一个名为skin的数据库,然后使用Navicate可视化工具右键--->运行SQL文件,选中skin.sql文件进行数据库还原操作。
【运行结果】
补全代码后,进入到项目文件夹(与manage.py同级),在cmd命令行输入python manage.py runserver,然后在浏览器输入http://127.0.0.1:8000/index,可见到以下页面。
【】
打开“考生文件夹\100011\Skin\app1”文件夹中的“views.py”文件和“考生文件夹\100011\Skin\templates”文件夹中的index.html文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:all() 2.正确答案:shop_cates 3.正确答案:shopkind_set 4.正确答案:order_by 5.正确答案:request 6.正确答案:data_dic 7.正确答案:foo.0 8.正确答案:name 9.正确答案:new_shop.name 10.正确答案:new_shop.desc
views.py
from django.shortcuts import render from django.http import HttpResponse, JsonResponse from app1.models import * def create_data(request): """数据插入逻辑""" cates = ['护肤','彩妆','香氛','男士专区','热门搜索'] kinds_all = [['洁面', '爽肤水', '精华', '乳液'], ['BB霜', '卸妆', '粉底液'], ['女士香水', '男士香水', '中性香水'], ['爽肤水','洁面','面霜','精华'],['洗面奶','去黑头','隔离','面膜']] # 插入大类和小类 for i, cate in enumerate(cates): shop_cate = ShopCate() shop_cate.name = cate shop_cate.desc = cate shop_cate.save() # 拿到一个大类对应的所有小类 kinds = kinds_all[i] # 将大类对应的小类插入数据库 for kind in kinds: shop_kind = ShopKind() shop_kind.name = kind shop_kind.desc = kind shop_kind.kind_cate = shop_cate shop_kind.save() # 插入商品详情表 shop_details = [('fresh skin 薏仁水', '化妆水/爽肤水单品', 'pic1.jpg'), ('蜂蜜原液天然滋养','美白护肤套装','pic2.jpg'), ('纯情诱惑一抹惊艳','告别暗淡唇','pic3.jpg')] d_kind = ShopKind.objects.get(id=1) for shop_detail in shop_details: sd = ShopDetail() sd.name = shop_detail[0] sd.desc = shop_detail[1] sd.img = shop_detail[2] sd.detail_kind = d_kind sd.save() # 试装表 try_decos = [('试装1', 'try1.jpg','try4.jpg'), ('试装2', 'try2.jpg','try5.jpg'),('试装3', 'try3.jpg','try6.jpg')] for try_deco in try_decos: td = TryDeco() td.name = try_deco[0] td.img1 = try_deco[1] td.img2 = try_deco[2] td.save() # 评测表 evas = [('YOUKA','cp1.jpg','th1.png'),('SELF','cp2.jpg','th2.png'),('ONLY','cp3.jpg','th3.png'), ('PCLADY','cp4.jpg','th4.png'),('ileehoo','cp5.jpg','th5.png'),('SIBU','cp6.jpg','th6.png'), ('妆品网','cp7.jpg','th7.png'),('AILI','cp8.jpg','th8.png')] for eva in evas: ev = Evalution() ev.name = eva[0] ev.img1 = eva[1] ev.img2 = eva[2] ev.save() return HttpResponse('插入数据成功') def index(request): # 要为模板传递数据,数据通过Model从数据库查询 # 查询出ShopCate类中的所有商品 shop_cates = ShopCate.objects.all() # 左边的商品,取0-3的切片 left_datas = shop_cates[:3] # 右边的商品,取3-末尾的切片 right_datas = shop_cates[3:] left = [] for left_data in left_datas: # 由该大类查询出它对应的全部的小类 left_kinds = left_data.shopkind_set.all() # [['大类1', ['小类1-1', '小类1-2']], [], []] left.append([left_data, left_kinds]) right = [] for right_data in right_datas: # 由该大类查询出它对应的全部的小类 right_kinds = right_data.shopkind_set.all() # [['大类1', ['小类1-1', '小类1-2']], [], []] right.append([right_data, right_kinds]) # 从ShopDetail类中,查询最新单品(先查询出所有商品,再按日期降序排序) new_shops = ShopDetail.objects.all().order_by('-launch_date')[:3] # 查询试装表所有的数据 try_decos = TryDeco.objects.all() # 查询评测表所有的数据 evas = Evalution.objects.all() # 构造所有数据的字典 data_dic = {"left": left, 'right': right, 'new_shops': new_shops, 'try_decos': try_decos, 'evas': evas} # 将数据返给index.html return render(request, 'index.html', data_dic) def register_check(request): """注册校验""" username = request.POST.get('username') password = request.POST.get('password') email = request.POST.get('email') tel = request.POST.get('tel') print(username) print(password) print(email) print(tel) res = User.objects.filter(name=username) if res: msg = '用户%s已存在,无法注册' % username else: User.objects.create(name=username, password=password, email=email, tel=tel) msg = '注册成功,用户名是:%s,邮箱是:%s,电话是:%s' % (username, email, tel) return JsonResponse({'res': msg})
index.html
<!doctype html> <html> {% load static %} <head> <meta charset="utf-8"> <title>电商网页制作</title> <link rel="stylesheet" href="{% static 'css/index.css' %}"> <script src="/static/js/jquery-1.12.4.min.js"></script> </head> <body> <!-- videobox bigan --> <div class="videobox"> <header> <div class="con"> <section class="left"></section> <section class="right"> <a href="#">登录</a> <a href="#">注册</a> </section> </div> </header> <nav> <ul> <li class="left"> <a class="one" href="#"> <img src="/static/images/sanxian.png" alt=""> <span>选项</span> <img src="/static/images/sanjiao.png" alt=""> </a> <aside> <span></span> {# 左边的数据 #} <ol class="zuo"> {% for foo in left %} <!-- 大类名字--> <li class="con">{ { foo.0.name }}</li> {% for l_k in foo.1 %} <!-- 小类名字--> <li>>{ { l_k.name }}</li> {% endfor %} {% endfor %} </ol> {# 右边的数据 #} <ol class="you"> {% for foo in right %} <!-- 大类名字--> <li class="con">{ { foo.0.name }}</li> {% for l_k in foo.1 %} <li>>{ { l_k.name }}</li> {% endfor %} {% endfor %} </ol> <img src="/static/images/tu1.jpg" alt=""> </aside> </li> <li class="center"> <form> <input type="text" value="请输入商品名称、品牌或编号"> </form> </li> <li class="right"> <a href="#"></a> <a href="#"></a> <a href="#">󰄪</a> <a href="#"></a> </li> </ul> </nav> <video src="/static/video/home_loop_720p.mp4" autoplay="ture" loop="ture" ></video> <audio src="/static/audio/home.ogg" autoplay="ture" loop="ture"></audio> <div class="pic"> <p>Select the right resolution for your PC and dive in! (请为您的电脑选择正确的分辨率)</p> <ul> <li class="one"><span></span>STANDARD标准</li> <li class="two"><span></span>HD高清</li> </ul> </div> </div> <!-- videobox end --> <!-- new bigan --> <div class="new"> <header> <img src="/static/images/new.jpg" alt=""> </header> <p>补水保湿 提亮肤色 低敏配方 收缩毛孔 滋养容颜</p> {#拿到最新单品渲染到页面上#} <ul> {% for new_shop in new_shops %} <li style="background: url('/static/images/{ { new_shop.img }}')"> <hgroup> <!-- h2标签,显示商品名--> <h2>{ { new_shop.name }}</h2> <!-- h2标签,显示商品描述--> <h2>{ { new_shop.desc }}</h2> <h2></h2> <h2></h2> </hgroup> </li> {% endfor %} </ul> </div> <!-- new end --> <!-- try bigan --> <div class="try"> <header> <img src="/static/images/shizhuang.jpg" alt=""> </header> <p>美化容貌 增添自信 突出个性 </p> {# 试装渲染到页面上 #} <ul> {% for try_deco in try_decos %} <li> <img class="zheng" src="/static/images/{ { try_deco.img1 }}" alt=""> <img class="fan" src="/static/images/{ { try_deco.img2 }}" alt=""> </li> {% endfor %} </ul> </div> <!-- try end --> <!-- text bigan --> <div class="text"> <header> <img src="/static/images/cp.jpg" alt=""> </header> <p>评测 我们更专业 用户更放心</p> <ul> {% for eva in evas %} <li> <img class="tu" src="/static/images/{ { eva.img1 }}" alt=""> <img class="tihuan" src="/static/images/{ { eva.img2 }}" alt=""> </li> {% endfor %} </ul> </div> <!-- text end --> <footer> <div class="logo"></div> <div class="message"> <form> <ul class="left"> <li> <p><label for="">姓名:</label></p> <input type="text" name="name" id="name"> </li> <li> <p>邮箱:</p> <input type="email" name="email" id="email"> </li> <li> <p>电话:</p> <input type="tel" pattern="^\d{11}$" title="请输入11位数字" name="tel" id="tel"> </li> <li> <p>密码:</p> <input type="password" name="password" id="password"> </li> <li> <input class="but" type="button" value="" id="btn"> </li> </ul> <div class="right"> <p>提示信息:</p> <textarea id="txt"></textarea> </div> </form> </div> </footer> <div class="banquan"> <a href="#">fresh skin 美肤科技有限公司</a> </div> </body> <script> $(function () { $('#btn').click(function () { username = $('#name').val(); password = $('#password').val(); email = $('#email').val(); tel = $('#tel').val(); //发送ajax $.ajax({ 'url': 'register_check', 'type': 'post', 'data': {'username': username, 'password': password, 'email': email, 'tel': tel, csrfmiddlewaretoken: '{ { csrf_token }}'}, 'dataType': 'json', 'success': function(data){ $('#txt').val(data.res) } }) }) }) </script> </html>
6.使用Django开发个人博客
阅读下列说明及运行结果,打开“考生文件夹\个人博客”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Django的题目,包含项目文件夹gin,题目主要考察Django框架中ORM、分页等知识点。
数据库使用的是Django自带的sqlite3,无需进行数据库配置。补全代码后,执行数据库迁移,在命令行输入命令python manage.py makemigrations 和 python manage.py migrate,接着通过python manage.py createsuperuser命令创建一个管理员账户,然后通过命令python manage.py runserver 运行服务
【】
运行项目后,访问 http://127.0.0.1:8000/admin,使用刚才创建的管理员账户登录后台添加文章
添加文章内容,文章素材在项目gin目录的‘data’文件夹中
添加所有文章后访问http://127.0.0.1:8000/blog/index博客首页如图所示
点击文章标题后可以进入文章详情页面
【】
打开“考生文件夹\个人博客\gin\blog”素材中的 “views.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:GET 2.正确答案:order_by 3.正确答案:-publisher_date 4.正确答案:Paginator 5.正确答案:num_pages 6.正确答案:page 7.正确答案:has_previous 8.正确答案:has_next 9.正确答案:last 10.正确答案:split
views.py
from django.shortcuts import render from django.core.paginator import Paginator from blog.models import Article # Create your views here. def index(request): # 获取page页面参数,并赋值给page变量 page = int(request.GET.get("page", 1)) # 查询所有文章并按照发布时间进行倒叙排序,并把结果赋值给articles变量 articles = Article.objects.all().order_by("-publisher_date") # 把所有文章进行分页,每页有两篇文章,分页对象赋值给paginator变量 paginator = Paginator(articles, 2) # 获取总页数,并保存在page_num变量中 page_num = paginator.num_pages # 获取当前页面的所有文章,保存在current_page_articles变量中 current_page_articles = paginator.page(page) # 计算上一页页码,保存到pre_page变量中 pre_page = page-1 if current_page_articles.has_previous() else page # 计算下一页页码,保存到next_page变量中 next_page = page+1 if current_page_articles.has_next() else page # 获取最新的三篇文章,保存到new_articles变量中 new_articles = articles[:3] # 模板渲染,并把模板需要的参数传递到模板中 return render(request, "blog/index.html", { "article_list": current_page_articles, "page_num": range(1, page_num+1), "previous_page": pre_page, "next_page": next_page, "new_articles": new_articles }) def article_detail(request, article_id): # 根据文章id查询出文章,保存到article变量中 article = Article.objects.get(article_id=article_id) # 获取最后一篇文章的id,保存到max_article_id变量中 max_article_id = Article.objects.last().article_id # 把文章内容按换行符进行分割,保存到section_list变量中 section_list = article.article_content.split("\n") # 模板渲染,并把模板需要的参数传递到模板中 return render(request, "blog/detail.html", { "curr_article": article, "section_list": section_list, "pre_article_id": article_id-1 if article_id > 1 else article_id, "next_article_id": article_id+1 if article_id < max_article_id else article_id })
7.成语填填乐
阅读下列说明及运行结果, 打开“考生文件夹\10008”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Python基础语法的题目,包含idiom_blank.py文件,题目主要考察随机数模块、if语句、循环等操作。
【运行结果】
【】
打开“考生文件夹\10008”文件夹中的“idiom_blank.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:while 2.正确答案:choice 3.正确答案:randint 4.正确答案:bank 5.正确答案:input 6.正确答案:num 7.正确答案:break 8.正确答案:continue 9.正确答案:word[bank] 10.正确答案:else
idiom_blank.py
import random # 初始化要填词的成语 words = ["春暖花开", "十字路口", "千军万马", "白手起家", "张灯结彩", "风和日丽", "万里长城", "人来人往", "自由自在", "瓜田李下", "助人为乐", "白手起家", "红男绿女", "春风化雨", "马到成功", "拔苗助长", "安居乐业", "走马观花", "念念不忘", "落花流水", "张灯结彩", "一往无前", "落地生根", "天罗地网", "东山再起", "一事无成", "山清水秀", "别有洞天", "语重心长", "水深火热", "鸟语花香", "自以为是"] # 初始化回答正确和回答错误的题的数量 right = 0 wrong = 0 # 记录积分的变量count初始值为20 count = 20 print('直接填写答案,回车进入下一关。什么也不填忽略本成语!!') while True: # 从成语列表中随机选择一条成语 word = random.choice(words) # 在成语中随机选择填空位置 bank = random.randint(0, 3) # 产生带空格的成语 new = word[:bank] + "___" + word[bank + 1:] # 输出带空格的成语 print(new) # 输入空格中需要填入的字 num = input("输入:") # 输入q表示终止答题 if num == 'q': # 打印终止答题 print("终止答题") # 退出循环 break # 直接输入回车表示此题略过 if not num: # 打印过 print("过!") # 结束本次循环重新开始下一次循环 continue # 如果填入的词正确 elif num.strip(" ") == word[bank]: # 积分加2分 count += 2 # 正确题数+1 right += 1 # 打印正确,你真棒! print("正确,你真棒!") # 否则表示答错 else: # 积分减去2分 count -= 2 # 错误题数+1 wrong += 1 # 打印回答错误,正确答案是 print("错了,正确答案:", word[bank]) print("选手答对:%d题,答错:%d题,正确率为:%.2f%%,最后得分为:%d" % (right, wrong, right * 100 / (right + wrong), count))
8.基于MongoDB的腾讯招聘数据存储
阅读下列说明及运行结果,打开“考生文件夹\腾讯招聘”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于MongoDB数据库的题目,包含一个Tencent.py文件,题目主要考察使用Python操作MongoDB数据库、使用MongoDB数据库存储爬取到的数据等知识点。
答题之前先确保MongoDB服务已启动
【】
运行Tencent.py文件后在MongoDB客户端中查询数据库和保存的职位信息,效果如下所示。
【】
打开“考生文件夹\腾讯招聘”素材中的“Tencent.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:get 2.正确答案:headers 3.正确答案:loads 4.正确答案:decode 5.正确答案:format 6.正确答案:start_url 7.正确答案:extend 8.正确答案:page 9.正确答案:MongoClient 10.正确答案:insert_many
Tencent.py
import json import time import requests import pymongo """ base_url是腾讯招聘算法工程师api接口地址 pageIndex代表页数,pageIndex代表页数 这两个参数根据用户需要自定义传参 """ base_url = "https://careers.tencent.com/tencentcareer/api/post/Query?" \ "categoryId=40001005&pageIndex={}&pageSize={}" # 请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" " AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50" } def parse_url(url, req_head): """ 获取单页数据 :param url: 连接地址 :param req_head: 请求头 :return: 职位列表 """ # 每次发送请求休眠2s time.sleep(2) # 发送请求 response = requests.get(url, headers=req_head).content # 解析json数据 json_data = json.loads(response.decode())["Data"] # 获取职位数据列表 data = json_data["Posts"] return data def get_collection(page_start=1, page_size=200): """ 循环获取职位数据 :return: 所有的职位数据 """ # 创建一个空列表用来保存所有的职位数据 collections = [] page = page_start while True: # 生成url,并赋值给start_url变量 start_url = base_url.forma(page, page_size) # 调用相关函数获取每一页数据 data = parse_url(start_url, headers) if data: # 如果有数据把数据添加到collections列表中 collections.extend(data) page += 1 else: break return collections def mongo_connect(db_name, collection_name): """ 获取mongo数据库操作对象 :param db_name: 数据库名 :param collection_name: 集合名 :return: 数据集对象 """ client = pymongo.MongoClient("mongodb://localhost:27017/") collection = client[db_name][collection_name] return collection if __name__ == '__main__': # 调用函数获取数据 data_collections = get_collection() # 获取数据集对象 db = mongo_connect("tencent", "jobs") # 把职位信息保存到MongoDB中 db.insert_many(data_collections) # 保存完成提示信息 print("保存成功^_^")
9.Django登录注册
阅读下列说明及运行结果, 打开“考生文件夹\10006”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Django的题目,包含项目文件夹Login,题目主要考察Django框架的视图、模板、模型等操作。
【运行结果】
首先创建数据库login,补全代码后,执行数据库迁移,在命令行输入命令python manage.py makemigrations 和 python manage.py migrate,然后通过命令python manage.py runserver 运行服务,在浏览器中输入127.0.0.1:8000,在点击“登录/注册”按钮,可以看到以下登录注册页面。
【】
打开“考生文件夹\10006\Login\login_register”文件夹中的models.py文件和views.py文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:Model 2.正确答案:CharField 3.正确答案:render 4.正确答案:request.POST 5.正确答案:and 6.正确答案:filter 7.正确答案:JsonResponse 8.正确答案:create 9.正确答案:2 10.正确答案:passwd
models.py
from django.db import models class User(models.Model): # 字段user,字符串类型,最大长度100 user = models.CharField(max_length=100) # 字段passwd,字符串类型,最大长度100 passwd = models.CharField(max_length=100)
views.py
from django.shortcuts import render from django.http import JsonResponse from .models import User # Create your views here. def index(request): # 显示首页页面 return render(request, 'login_register/index.html') def login_register_ajax(request): # 显示ajax登录页面 return render(request, 'login_register/login_register_ajax.html') def register_ajax_check(request): """ajax注册校验""" # 获取用户名 username = request.POST.get('username') # 获取密码 password = request.POST.get('password') # 如果用户名和密码均不为空 if username and password: # 以用户名为条件进行查询 result = User.objects.filter(user=username) # 如果查到了结果,说明该用户已经存在 if result: # 返回0 return JsonResponse({'res': 0}) else: # 如果没有查到,说明没有这个用户,此时代表可以注册,此时将用户名和密码写入数据库 User.objects.create(user=username, passwd=password) # 写入成功,向前端返回1的信号 return JsonResponse({'res': 1}) else: # 用户名或密码为空 return JsonResponse({"res": 2}) def login_ajax_check(request): """ajax登录校验""" # 获取用户名 username = request.POST.get('username') # 获取密码 password = request.POST.get('password') # 以用户名为条件去查询 user = User.objects.filter(user=username) # 查到了结果,需要比对密码是否正确 if user: # 如果用户密码和输入密码一致 if user[0].passwd == password: # 返回1 return JsonResponse({'res': 1}) else: return JsonResponse({'res': 0}) # 没查到结果,说明用户名不正确 else: return JsonResponse({"res": 0})
10.Selenium京东爬虫
阅读下列说明及运行结果, 打开“考生文件夹\10004”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
该题是关于Selenium控制浏览器并抓取数据的题目,包含selenium_jd.py文件,题目主要考察通过Selenium进行元素定位、控制浏览器跳转、提取页面数据等操作。
【运行结果】
【】
打开“考生文件夹\10004”文件夹中的“selenium_jd.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。
除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。
1.正确答案:Chrome() 2.正确答案:get 3.正确答案:send_keys 4.正确答案:click() 5.正确答案:execute_script 6.正确答案:find_elements_by_xpath 7.正确答案:+= 8.正确答案:page_source 9.正确答案:click() 10.正确答案:quit()
selenium_jd.py
from selenium import webdriver import time class JdSpider: def __init__(self): # 创建谷歌浏览器对象 self.browser = webdriver.Chrome() # 向京东首页'https://www.jd.com/'发送请求 self.browser.get('https://www.jd.com/') def search_html(self): # 通过id找到搜索框,输入商品龙泉武士 self.browser.find_element_by_id('key').send_keys('龙泉武士') # 找到确定按钮并点击 self.browser.find_element_by_class_name('button').click() # 休眠2秒 time.sleep(2) def get_one_page(self): # 将进度条拉到页面底端 self.browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') time.sleep(2) # 一个商品就是一个li节点,找通过xpath找到到页面中所有的商品对应的li节点 li_list = self.browser.find_element_by_xpath('//div[@id="J_goodsList"]/ul/li') item = {} num = 0 # 遍历li节点 for li in li_list: # 获取商品名字 item['name'] = li.find_element_by_xpath('.//div[@class="p-name p-name-type-2"]/a/em').text # 获取商品价格 item['price'] = li.find_element_by_xpath('.//div[@class="p-price"]/label').text # 获取商品评论 item['comment'] = li.find_element_by_xpath('.//div[@class="p-commit"]/label/a').text # 获取商品商家 item['shop'] = li.find_element_by_xpath('.//div[@class="p-shop"]/span/a').text print(item) num += 1 print("数量为:%d" % num) def get_all_pages(self): # 如果页面上没有找到'pn-next disabled'表示不是最后一页,此时不中断循环 while self.browser.page_source.find('pn-next disabled') == -1: # 获取当前页面数据 self.get_one_page() # 通过class_name找到下一页的按钮然后点击 self.browser.find_element_by_class_name('pn-next').click() time.sleep(4) print("*" * 50) print("抓取结束") # 退出浏览器 self.browser.quit() def run(self): self.search_html() self.get_all_pages() if __name__ == "__main__": spider = JdSpider() spider.run()
11.MySQL数据库操作
阅读下列说明及运行结果图,打开“考生文件夹\10001”中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。
这是Python操作MySQL数据库题目,包含pystu.py和studb.sql数据库文件。该题目是利用Python语言对MySQL数据库中数据表信息进行增删改查操作。首先需要通过studb.sql进行数据库还原。首先执行创建数据库 create database studb;然后选中该数据库 use studb;最后执行source C:\code\studb.sql,其中“C:\code\studb.sql”是你的studb.sql的路径。
studb数据库中stuinfo表结构如下所示:
*运行结果】**
打开“考生文件夹\10001”文件夹中的文件“pystu.py”,按注释要求在空(1)至(10)处填入正确的内容,完成后保存文件“pystu.py”,第(2)(3)(4)(5)(6)(7)(8)统一使用大写。
除删除(1)至(10)填入正确的内容外,不能修改或删除其它任何内容。
1.正确答案:connect 2.正确答案:SELECT VERSION() 3.正确答案:INSERT INTO 4.正确答案:DELETE FROM 5.正确答案:LIKE 6.正确答案:UPDATE 7.正确答案:WHERE 8.正确答案:SELECT 9.正确答案:fetchall 10.正确答案:close()
pystu.py
import pymysql # 数据库连接 Db = pymysql.connect(host='localhost', user='root', password='123456', db='studb', charset='utf8', cursorclass=pymysql.cursors.DictCursor) # 指定游标类型为字典格式返回数据。 cur = Db.cursor() # 查询MySQL版本 SQL = "SELECT VERSION()" res = cur.execute(SQL) ver = cur.fetchone() print("读取版本号:%s" % ver) # 插入一条数据(要求:姓名为侯美汐,性别为女(1表示男,0表示女),出生日期为2001-5-3,住址为广东中山中路,班级为2班。 SQL = "INSERT INTO stuinfo (name,sex,birthday,address,class) values('侯美汐',0,'2001-5-3','广东中山中路',2)" res = cur.execute(SQL) Db.commit() print("插入数据执行成功,插入了%d条数据" % res) # 删除姓名中含“小”的数据。 SQL = "DELETE FROM stuinfo where name LIKE '%小%'" res = cur.execute(SQL) Db.commit() print("删除数据执行成功,删除了%d条数据" % res) # 修改数据(要求:将侯美汐的姓名改为侯妤汐,住址改为四川成都天府大道。 SQL = "UPDATE stuinfo set name='侯妤汐',address='四川成都天府大道' WHERE name='侯美汐'" res = cur.execute(SQL) Db.commit() print("修改数据执行成功,修改了%d条数据" % res) # 查询所有学生的姓名、出生日期和住址信息。 SQL = "SELECT name,birthday,address from stuinfo" res = cur.execute(SQL) # 获取所有查询结果 data = cur.fetchall() print("查询数据结果为:%s" % data) # 关闭游标对象 cur.close() # 关闭数据库连接对象 Db.close()