不懂先生

educoder爬虫答案
温馨提示:  建议访者慎做cv工程师,答案只提供参考,这篇文章的意义在于给没做对的同学提供做题...
扫描右侧二维码阅读全文
16
2021/09

educoder爬虫答案

温馨提示:

  建议访者慎做cv工程师,答案只提供参考,这篇文章的意义在于给没做对的同学提供做题思路。不懂先生建议大家跟着自己思路做,不会的话可以评论区留言,编者看到就会回复的。

HTTP基础

第1关 HTTP 标准

1. B
2. B
3. D

第2关 开发者工具的基本使用

1.C
2.B

正则表达式入门

第1关查找第一个匹配的字符串

# coding=utf-8

# 在此导入python正则库
########## Begin ##########
import re

########## End ##########

check_name = input()
# 在此使用正则匹配'张明'的信息,结果存储到is_zhangming中
########## Begin ##########
is_zhangming = re.search(r'张明',check_name)
########## End ##########

if is_zhangming is not None:
    print(is_zhangming.span())
else:
    print(is_zhangming)

第2关基础正则表达式--字符组

# coding=utf-8

import re

input_str = input()

# 编写获取python和Python的正则,并存储到match_python变量中

########## Begin ##########
match_python = re.findall(r'[Pp]ython',input_str)

########## End ##########

print(match_python)

第3关基础正则表达式--区间与区间取反

# coding=utf-8

import re

input_str = input()

# 1、编写获取到数字的正则,并输出匹配到的信息
########## Begin ##########
num = re.findall(r'[\d]',input_str)
print(num)
########## End ##########

# 2、编写获取到不是数字的正则,并输出匹配到的信息
########## Begin ##########
str = re.findall(r'[^0-9]',input_str)
print(str)
########## End ##########



第4关基础正则表达式--快捷方式

# coding=utf-8

import re

input_str = input()

# 1、编写获取到单词的正则,并输出匹配到的信息
########## Begin ##########
word = re.findall(r'\w',input_str)
print(word)

########## End ##########

# 2、编写获取到不是单词的正则,并输出匹配到的信息
########## Begin ##########

yyds = re.findall(r'\W',input_str)
print(yyds)
########## End ##########



第5关字符串的开始与结束

# coding=utf-8

import re

input_str = input()

# 1、编写获取到以educoder开头的正则,并存储到变量a
########## Begin ##########
a=re.search(r'^educoder',input_str)

########## End ##########
if a is not None:
    print(a.span())
else:
    print(a)


# 2、编写获取到以educoder结束的正则,并存储到变量b
########## Begin ##########
b= re.search(r'educoder$',input_str)

########## End ##########
if b is not None:
    print(b.span())
else:
    print(b)


第6关任意字符

# coding=utf-8

import re

input_str = input()

# 编写获取(任意字符)+ython的字符串,并存储到变量a中
########## Begin ##########
a= re.findall(r'.ython',input_str)

########## End ##########
print(a)

第7关可选字符

# coding=utf-8

import re

input_str = input()

# 编写获取she或者he的字符串,并存储到变量a中
########## Begin ##########

a= re.findall(r's?he',input_str)
########## End ##########
print(a)

第8关重复区间

# coding=utf-8

import re

input_str = input()
# 1、基于贪心模式匹配字符串中重复出现2个数字的子字符串,并存储到变量a。

########## Begin ##########
a=re.findall(r'[\d]{2}',input_str)

########## End ##########
print(a)

# 2、基于贪心模式匹配字符串中重复出现4-7个数字的子字符串,并存储到变量b。
########## Begin ##########

b=re.findall(r'[\d]{4,7}',input_str)
########## End ##########
print(b)


第9关开闭区间与速写

# coding=utf-8

import re

input_str = input()
# 1、基于贪心模式匹配字符串中连续出现5个数字以上的子字符串,并存储到变量a。

########## Begin ##########
a=re.findall(r'[\d]{5,}',input_str)
########## End ##########
print(a)

# 2、匹配字符串中都为数字的子字符串,并存储到变量b。
########## Begin ##########
b = re.findall(r'[\d]+',input_str)
########## End ##########
print(b)

python正则表达式分组

import re
def re_group(input_data):
    result=[]
    #*********** Begin **********#
    p = "1[345789]\d{9}"
    result = re.findall(p, input_data)
    #*********** End **********#

    return result

python正则表达式断言

第1关先行断言

import re

a = input()

#*********** Begin **********#
result = re.findall(r'[\w]{1,}(?=ing)',a)
#*********** End **********#
print(result)

第2关后发断言

import re

a = input()

#*********** Begin **********#
result = re.findall(r'(?<=go)[\w]{1,}',a)
#*********** End **********#
print(result)

python正则表达式标记

import re
def re_mark(input_data):
    result=[]
    #*********** Begin **********#
    result = re.findall(r'^[study].*?.com',input_data,re.M|re.I)
    #*********** End **********#

    return result

python正则表达式替换

import re

def re_sub(str):

    #*********** Begin **********#
    after_Replacement = re.sub("123|mn|[a-f]|7","",str)
    #*********** End **********#
    return after_Replacement

python正则表达式编译

import re

def re_telephone(str):
    #*********** Begin **********#
    p = re.compile(r'\d{1,}')
    re_group = re.findall(p,str)
    re_group = tuple(re_group)
    #*********** End **********#
    return re_group

python正则表达式综合练习

第1关提取日志内容

import re

def re_Regex():
    #*********** Begin **********#
    # 读取数据文件
    with open('./test_one/src.txt', 'r') as f:
    # 根据日志数据编写正则表达式提取数据内容
        string = r'cs_item_sk[\s=]*(\d*?1+)\s+.+?true\s*(\d+)$'
        pattern = re.compile(string)
    # 提取cs_item_sk的数值以1结尾的并且布尔值为true的所需的日志内容
        for line in f.readlines():
            line = line.strip()
            m = pattern.search(line)
            if m is not None:
                print(m.groups())
    #*********** End **********#

第2关组合密码匹配

import re
def re_test2(input_data):
    result=[]
    #*********** Begin **********#
    result = re.findall(r'^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&*.?]+$)[a-zA-Z\d!@#$%.?^&*]+$',input_data,re.M)
    #*********** End **********#

    return result

第3关网页内容解析

我不会,如果你会的话请在评论区回复答案,有福同享,谢谢
本题答案已完善,供稿人为:冷冷的 ,下面是代码

import re

def parse_one_page(html):
    #*********** Begin **********#
        pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"'
            +'.*?name.*?a.*?>(.*?)</a>.*?star.*?>[^\u4e00-\u9fff]+(.*?)[^\u4e00-\u9fff]+</p>'
            +'.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>'
            +'.*?fraction.*?>(.*?)</i>.*?</dd>',
            re.S)    
        res = re.findall(pattern, html)
        print(res)
    #*********** End **********#

爬虫实战-求是网周刊文章爬取

第1关获取新闻url

import requests
import re


def geturls():
    # ********** Begin ********** #
    url = 'http://www.qstheory.cn/dukan/qs/2014/2019-01/01/c_1123924172.htm'
    headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36 Edg/92.0.902.84'
    }
    response = requests.get(url=url,headers=headers).text
    # print(response)
    urls = re.findall('<a\shref="(.*?)"\starget="_blank"><strong>',response)
    
    # ********** End ********** #

    return urls


if __name__ == "__main__":
    urls = geturls()
    for x in urls:
        print(x)

第2关获取文章内容

import requests
from lxml import etree


headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36"
}



def parsepage(urls):
    mainbody = []   # 保存新闻内容
    # ********** Begin ********** #
    for url in urls:
        http = url.split('c_')[0]
        page_text = requests.get(url=url, headers=headers)
        page_text.encoding = 'utf-8'
        tree = etree.HTML(page_text.text)
    # 获取图片的url
        img_urls = tree.xpath('/html/body/section/div/div/div/div/div[1]/div[1]/div//img/@src')
        if len(img_urls) != 0:
            imgurls = []
            for img_url in img_urls:
                img_url = str(img_url)
                imgurl = http + img_url
                imgurls.append(imgurl)
        # print(imgurls)
        else:
            imgurls = ""  # 留空
    # 获取标题并去除首尾空格
        title = tree.xpath('/html/body/section/div/div/div/div/h1/text()')[0]
        title = str(title).replace("\r\n","")

    # 获取作者并去除首尾空格
        author = tree.xpath('/html/body/section/div/div/div/div/span[2]/text()')[0]
        author =str(author).replace("\r\n","")

    # 获取正文并去除首尾空格
        p_text = tree.xpath('/html/body/section/div/div/div/div/div[1]/div[1]/div//font/text()|/html/body/section/div/div/div/div/div[1]/div[1]/div//p/text()')
        p_text=  ','.join(p_text)
        p_text = str(p_text).replace('\u3000','')
        p_text = str(p_text).replace(',', '')
        dic = {
            'title': title,
            'author': author,
            'content': p_text,
            'imgurl': imgurls
        }
        mainbody.append(dic)
    # ********** End ********** #

    return mainbody


Xpath基础

第1关XPath 路径表达式

1.选取bookstore元素的所有子节点
********** Begin *********
bookstore
*********** End **********

2.选取所有拥有名为 lang 的属性的 title 元素
********** Begin *********
//title[@lang]
*********** End **********

3.选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性和值为good的class属性
********** Begin *********
//title[@lang='eng' and @class="good"] 
*********** End **********

4.选取属于 bookstore 子元素的book元素下的所有文本内容
********** Begin *********
/bookstore/book/text()
*********** End **********

5.选取属于 bookstore 子元素的第一个 book 元素
********** Begin *********
/bookstore/book[1]
*********** End **********

第2关XPath 轴定位

1.选取所有属于当前节点的子元素的 book 节点
********** Begin *********
child::book
*********** End **********

2.选取当前节点的 lang 属性
********** Begin *********
attribute::lang
*********** End **********

3.选取当前节点的所有 price 孙节点
********** Begin *********
child::*/child::price
*********** End **********

第3关XPath 解析

# 导入lxml库
from lxml import etree

# 读取lll.html文件并转化为元素树对象
parse = etree.HTMLParser(encoding='utf-8')
tree = etree.parse('src/step3/lll.html', parse)

# 补充xpath表达式,获取所有书的名称
# ********** Begin ********* #       
print(tree.xpath('//title/text()'))
# *********** End ********** #

# 补充xpath表达式,获取所有书的价格
# ********** Begin ********* #       
print(tree.xpath('//price/text()'))
# *********** End ********** #

# 填写代码, 获取价格低于30的书名
# ********** Begin ********* #       
books = tree.xpath('//book')
for i in books:
    price = i.xpath('./price/text()')[0]
    pri = float(price)
    if pri < 30:
        print(i.xpath('./title/text()')[0])
# *********** End ********** #


requests爬虫

第1关requests 基础

import requests


def get_html(url):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return:html
    '''
    
    # ***************** Begin ******************** #

    # 补充请求头
    headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/"
                  "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
    }
    # get请求网页
    html = requests.get(url = url,headers=headers).text
    # 获取网页信息文本
    
    # ***************** End ******************** #
    return html

第2关requests 进阶

import requests


def get_html(url):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return html 网页的源码
    :return sess 创建的会话
    '''
    
    # ***************** Begin ******************** #
    
    # 补充请求头
    headers={
        'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/'
                  '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
        "Cookie": "BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; "
              "PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR"
              "VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
              "AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; "
              "H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; "
              "H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0"
    }
    # 创建Session, 并使用Session的get请求网页
    sess = requests.session()
    # 获取网页信息文本
    html = sess.get(url,headers= headers).text
    # ****************** End ********************* #
    return html, sess

urllib爬虫

第1关urllib基础

import urllib.request
def request(url):
    '''
    一个参数
    :param url:请求网址
    :return:返回一个请求的字符串。编码为utf-8
    '''
    # *************** Begin *************** #
    response = urllib.request.urlopen(url)
    return response.read().decode("utf-8")
    # *************** End ***************** #

第2关urllib进阶

注意:本题形参headers不加到请求内(咱也不知道给这个参数是干嘛的
import urllib.request
import http.cookiejar
def request(url,headers):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return:html
    '''
    
    # ***************** Begin ******************** #
    cookie = http.cookiejar.CookieJar()
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)
    r = opener.open(url)
    
    # ***************** End ******************** #
    html = r.read().decode('utf-8')
    return html

学习通爬取百度热点新闻(新添加了文件读取编码方式采用utf-8中文编码,多语言兼容)

# -*-coding:utf-8 -*-
# 作者:不懂先生
# 日期: 2021/9/18
import requests
from lxml import etree
import os
filename = open("D:/代码/python/爬虫/爬虫实战/educoder/baidunews.txt","a",encoding="utf-8")
url = 'https://news.baidu.com/'
response = requests.get(url=url).text
tree = etree.HTML(response)
# 打开网页的用etree.HTML  打开本地的用etree.parse()
a_lists = tree.xpath('//*[@id="pane-news"]//ul//li//a')
print(len(a_lists))
for i in a_lists:
    page_detail_hrefs = i.xpath('./@href')[0]
    page_detail_names = i.xpath('./text() | b/text()')[0]
    # print(page_detail_hrefs,page_detail_names)
    print('新闻名称:{name} ,新闻链接:{url}'.format(name=page_detail_names,url=page_detail_hrefs), file=filename)
filename.close()

效果如下:

64053-9g8t7cortr.png
30044-gf7zs4dtzin.png
05675-bgiklzmytds.png

网页数据解析

第1关:XPath解析网页

import urllib.request

from lxml import etree

def get_data(url):
    '''
    :param url: 请求地址
    :return: None
    '''
    response=urllib.request.urlopen(url=url)
    html=response.read().decode("utf-8")
    # *************** Begin *************** #
    parse = etree.HTML(html)
    item_list = parse.xpath("//div[@class='left']/ul/li/span/a/text()")
    # *************** End ***************** #

    print(item_list)

第2关:BeautifulSoup解析网页

import requests
from bs4 import BeautifulSoup

def get_data(url, headers):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return data:list类型的所有古诗内容
    '''
    # ***************** Begin ******************** #
    data = []
    text = requests.get(url).text
    soup=BeautifulSoup(text,'html.parser')
    detail_text = soup.find_all("p")[:-1]
    for i in detail_text:
        data.append(i.string)
    # ****************** end ********************* #
    return data

JSON数据解析

import urllib.request
from lxml import etree
import http.cookiejar
import json

def request_sess(url,headers):
    cj=http.cookiejar.CookieJar()
    opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    request = urllib.request.Request(url=url, headers=headers)
    r=opener.open(fullurl=request)
    html = r.read().decode('utf-8')
    return html

def save_data(path):
    '''
    :param path: 文件保存路径
    :return: 无
    '''
    url='http://127.0.0.1:8080/index'
    headers={
        'User-Agent':'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
    }
    # ********** Begin ************** #

    # 输出 JSON 数据中的 key 值为 code 对应的数据
    json_str = request_sess(url=url,headers=headers)
    b=json.loads(json_str)
    data = b['code']
    print(data)

    # 将爬取下来的 JSON 数据保存到本地
    b = str(b).replace("'",'"')
    with open(path, 'w',encoding="utf-8") as fp:
        fp.write(b)
    # ********** End ************** #a

爬虫实战——网页抓取及信息提取

第1关:利用URL获取超文本文件并保存至本地

# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib

# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'  # 录取分数网页URL


def step1():
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 1.将网页内容保存到data
    webpage = req.urlopen(url)  # 按照类文件的方式打开网页
    data = webpage.read()  # 一次性读取网页的所有数据
    # data = data.decode('utf-8') 
# 2.将data以二进制写模式写入以学号命名的 “nudt.txt” 文件
    with open('./nudt.txt','wb') as fp:
        fp.write(data)


#********** End **********#

第2关:提取子链接

# -*- coding: utf-8 -*-

import urllib.request as req


# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/index.html'  # 录取分数网页URL
webpage = req.urlopen(url)  # 按照类文件的方式打开网页
data = webpage.read()       # 一次性读取网页的所有数据

data = data.decode('utf-8')  # 将byte类型的data解码为字符串(否则后面查找就要另外处理了)


def step2():
# 建立空列表urls,来保存子网页的url
    urls = []
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 从data中提取2016到2012每一年分数线子网站地址添加到urls列表中
    years = [2016, 2015, 2014, 2013, 2012]
    for year in years:
        index = data.find("国防科技大学%s年录取分数统计" % year)
        href = data[index - 80:index - 39]  # 根据单个特征串提取url子串
# 注意提取的超链href是相对URL,需要加上站点域名
        website = 'http://www.gotonudt.cn'
        urls.append(website + href)

#********** End **********#
    return urls

第3关:网页数据分析

# -*- coding: utf-8 -*-
import urllib.request as req
import re

# 国防科技大学本科招生信息网中2016年录取分数网页URL:
url = 'http://www.gotonudt.cn/site/gfkdbkzsxxw/lqfs/info/2017/717.html'

webpage = req.urlopen(url)      # 根据超链访问链接的网页
data = webpage.read()           # 读取超链网页数据
data = data.decode('utf-8')     # byte类型解码为字符串

# 获取网页中的第一个表格中所有内容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0]           # 取网页中的第一个表格
# 数据清洗,将表中的&nbsp,\u3000,和空格号去掉
firsttable = firsttable.replace('&nbsp;', '')
firsttable = firsttable.replace('\u3000', '')
firsttable = firsttable.replace(' ', '')


def step3():
    score = []
# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
#********** Begin *********#
# 1.按tr标签对获取表格中所有行,保存在列表rows中:
    rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)

# 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:
    scorelist = []
    for row in rows:
        items = []
        tds = re.findall(r'<td.*?>(.*?)</td>', row, re.S)
        for td in tds:
            rightindex = td.find('</span>')        # 返回-1表示没有找到
            leftindex = td[:rightindex].rfind('>')
            items.append(td[leftindex+1:rightindex])
        scorelist.append(items)


# 3.将由省份,分数组成的7元列表(分数不存在的用\代替)作为元素保存到新列表score中,不要保存多余信息
    for record in scorelist[3:]:
        record.pop()
        score.append(record)
#********** End **********#
    
    return score

以下答案来自 ؟¿زذ正则表达式

数据持久化(非数据库)

第1关数据持久化(非数据库)

import os
import requests
from bs4 import BeautifulSoup
from lxml import etree

url = 'http://127.0.0.1:8080/imgs/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
}
response = requests.get(url, headers=headers)

#********** Begin **********#
# 解析网页
html = etree.HTML(response.text)
img_srcs = html.xpath("//div[@class='box']/div/a/img/@src")
for img_src in img_srcs:
    name = img_src.split('/')[-1].split('.')[0]

# 请求图片地址
    img_url = "http://127.0.0.1:8080" + img_src
    img = requests.get(img_url)

# 判断保存图片的文件夹是否存在,若不存在就创建文件夹
    dir_path = 'step1/images'
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)
    img_path = dir_path + '/' + name + '.jpg'  
# 保存图片
    with open(img_path, 'wb')as file:
        file.write(img.content)
#********** End **********#

MySQL常用操作

第1关创建数据表并插入数据


##########  创建emp表  ##########
create table emp(
    empno int(4) not null,
    ename char(9),
    job char(10),
    mgr int(4),
    sal int(7),
    comm int(7),
    deptno int(2) not null

);


##########  向emp表中插入数据  ##########
insert into emp(empno,ename,job,mgr,sal,comm,deptno) values(1011,"Elon","cameraman",001,8000,18207471234,30),(1111,"Donny","waiter",003,4000,18207475678,40);


第2关删除、修改表中的数据

##########  删除 Elon 的信息  ##########
delete from emp where ename='Elon';

##########  修改 Donny 的信息  ##########

update emp set deptno=20 where ename='Donny';

第3关简单查询语句

##########  查询在20号部门工作的雇员姓名和工资   ##########

select ename,sal,deptno from emp where deptno=20;
##########  查找以“s”开头的雇员姓名和所在部门编号  ##########

select ename,deptno from emp where ename like 's%';
##########  按工资升序排列20号部门的雇员  ##########
select ename,sal,deptno from emp where deptno=20 order by sal ASC;

##########  查询所有部门中工资大于2800的雇员  ##########
select ename,sal from emp where sal>2800;

第4关深入学习查询语句

##########  查询工种是职员或分析员的雇员姓名  ##########
select ename,job from emp where job in ('clerk','analyst');

##########  查询在 sales 部门中哪些工种是 account 部门中没有  ##########
SELECT job FROM emp WHERE deptno=10 AND job NOT IN (SELECT job FROM emp WHERE deptno=30);
##########  查询工资高于3000的雇员信息  ##########
SELECT ename,sal,emp.deptno,loc,dname FROM emp,dept WHERE emp.deptno=dept.deptno AND sal>3000;

MySQL数据库编程

第1关python数据库编程之创建数据库

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute('create database my_db default character set utf8 collate utf8_general_ci')

    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

第2关python数据库编程之创建数据表

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,连接数据库my_db,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        db='my_db',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute('''create table user (id int(16) AUTO_INCREMENT PRIMARY KEY,username varchar(32) not null,password varchar(32) not null)ENGINE = MyISAM''')
    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

第3关python数据库编程之插入数据

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,连接数据库my_db,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        db='my_db',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute("insert into user (username, password) values('teble', 'teble')")
    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

第4关python数据库编程之查询数据

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,连接数据库my_db,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        db='my_db',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute("select id, username, password from user ORDER BY id DESC")
    for data in cursor.fetchall():
        print(data)
    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

第5关python数据库编程之修改数据

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,连接数据库my_db,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        db='my_db',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute("update user set username = 'root',password='root' where id = '1'")
    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

第6关python数据库编程之删除数据

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql


# 连接mysql,连接数据库my_db,创建连接并返回连接对象
def connect():
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    conn = pymysql.connect(
        host='127.0.0.1',
        port=3306,
        user='root',
        db='my_db',
        passwd='123123',
        charset='utf8'
    )
    return conn
    # *********  End  ********* #


def test():
    # 创建连接,并且返回连接对象
    conn = connect()
    # 创建游标对象
    cursor = conn.cursor()
    # 请在这里补充代码,完成本关任务,注意缩进格式为4个空格
    # ********* Begin ********* #
    cursor.execute("delete from user where id = '2'")
    # *********  End  ********* #
    # 关闭游标
    cursor.close()
    # 关闭连接
    conn.close()

Python--进程和线程

第1关Python多进程-求素数个数

import math
from multiprocessing import cpu_count
from multiprocessing import Pool
# 判断数字是否为质数
#********** Begin *********#
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
#********** End *********#
# 计算给定区间含有多少个质数
#********** Begin *********#
def howMany(T):
    sum = 0;
    for i in range(T[0], T[1] + 1):
        if isPrime(i):
            sum += 1
    return sum
#********** End *********#
# 对整个数字空间N进行分段CPU_COUNT
#********** Begin *********#
def separateNum(N, CPU_COUNT):
    list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
    list[0][0] = 1
    if list[CPU_COUNT - 1][1] < N:
        list[CPU_COUNT - 1][1] = N
    return list
#********** End *********#
if __name__ == '__main__':
    N = int(input())
    # 多进程
    CPU_COUNT = cpu_count()  ##CPU内核数 本机为8
    pool = Pool(CPU_COUNT)
    sepList = separateNum(N, CPU_COUNT)
    result = []
    for i in range(CPU_COUNT):
        result.append(pool.apply_async(howMany, (sepList[i], )))
    pool.close()
    pool.join()
    ans = 0
    list = [res.get() for res in result]
    print(sum(list), end = '')

第2关Python多线程-求合数个数

import threading
import math
ans = 0
lock = threading.Lock()
# 判断数字是否为质数
#********** Begin *********#
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
#********** End *********#
#********** Begin *********#
# 计算给定区间含有多少个质数
def howMany(T):
    sum = 0;
    for i in range(T[0], T[1] + 1):
        if isPrime(i):
            sum += 1
    lock.acquire()
    try:
        global ans
        ans += sum
    finally:
        lock.release()
#********** End *********#
#********** Begin *********#
# 对整个数字空间N进行分段CPU_COUNT
def seprateNum(N, CPU_COUNT):
    list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
    list[0][0] = 1
    if list[CPU_COUNT - 1][1] < N:
        list[CPU_COUNT - 1][1] = N
    return list
#********** End *********#
if __name__ == '__main__':
    N = int(input())
    threadNum = 32
    t = []
    sepList = seprateNum(N, threadNum)
    for i in range(0, threadNum):
        t.append(threading.Thread(target = howMany, args = (sepList[i], )))
        t[i].start()
    for i in range(0, threadNum):
        t[i].join()
    print(N - 1 - ans, end = '')

第3关Python-ThreadLocal变量

import threading

x = 10
data = threading.local()
def action():
    global x
    data.num = x
    for i in range(1000000):
        data.num += 1
        data.num -= 1
    x = data.num
x = int(input())
thread = []
for i in range(10):
    thread.append(threading.Thread(target = action))
    thread[i].start()
for i in range(10):
    thread[i].join()
print(x,end = '')

第4关Python-进程 VS 线程

import math
from multiprocessing import cpu_count
from multiprocessing import Pool

N = int(input())
a = list(map(int, input().split()))


def howMany(T):
    ans = 0;
    for i in range(T[0] - 1, T[1]):
        ans = max(ans, a[i])
    return ans
# 对整个数字空间N进行分段CPU_COUNT
def seprateNum(N, CPU_COUNT):
    list = [[i * (N // CPU_COUNT) + 1, (i + 1) * (N // CPU_COUNT)] for i in range(0, CPU_COUNT)]
    list[0][0] = 1
    if list[CPU_COUNT - 1][1] < N:
        list[CPU_COUNT - 1][1] = N
    return list
    
    
if __name__ == '__main__':
# 多进程
#********** Begin *********#
    CPU_COUNT = cpu_count()
    pool = Pool(CPU_COUNT)
    sepList = seprateNum(N, CPU_COUNT)
    result = []
    for i in range(CPU_COUNT):
        result.append(pool.apply_async(howMany, (sepList[i], )))
    pool.close()
    pool.join()
    ans = 0
    list = [res.get() for res in result]
    print(max(list), end = '')



#********** End *********#

第5关Python-分布式进程

B
Last modification:January 27th, 2022 at 04:38 pm

Leave a Comment