实操题

1.Redis数据库操作

阅读下列说明及运行结果, 打开“考生文件夹\10002”文件夹中的素材,阅读代码,在空(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表示注册,2表示登录):")
        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链家爬虫

阅读下列说明及运行结果, 打开“考生文件夹\10004”文件夹中的素材,阅读代码,在空(1)至(10)处填写正确代码,操作完成后保存素材。

该题是关于selenium的题目,包含lianjia.py文件,题目主要考察通过selenium抓取链家二手房的数据并存入CSV文件等操作。

【运行结果】

代码补全后,运行lianjia.py文件,结果如下图所示。

生成的CSV文件如下图所示。

问题

打开“考生文件夹\10004”文件夹中的“lianjia.py”文件,根据注释提示,在空(1)至(10)处补全代码,完成后保存该文件。

【注意】除删除(1)至(10)填入正确的内容外,不能修改或删除素材中其它任何内容。

1.正确答案:webdriver.Chrome()
2.正确答案:get
3.正确答案:'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()
        # 这里要设置窗口最大化,不然待会点不到下一页这个按钮
        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="#">&#xe65e;</a>
                <a href="#">&#xe608;</a>
                <a href="#">&#xf012a;</a>
                <a href="#">&#xe68e;</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>&#xe662;</span>STANDARD标准</li>
            <li class="two"><span>&#xe662;</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"]/strong').text
            # 获取商品评论
            item['comment'] = li.find_element_by_xpath('.//div[@class="p-commit"]/strong/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()
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐