实操题
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()