微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python爬虫和数据可视化

文章目录

Python基础知识

Python基础

变量及类型

  • 变量可以是任何的数据类型,在程序中用一个变量名表示

  • 变量名必须是大小写英文、数字和下划线(_)的组合,且不能以数字开头

  • image-20210526193936597

标识符和关键字

  • 什么是关键字

    python一些具有特殊功能的标示符

    不允许开发者自己定义和关键字相同的名字的标示符

  • 查看关键字:

import keyword
keyword.kwlist

格式化输出

age = 18
print("我的年纪是:%d 岁"%age)
# %s输出字符串  %d输出十进制整数
print("我的名字是%s,我的国籍是%s"%("小张","中国")) #用元组
print("aaa","bbb","ccc")#aaa bbb ccc
print("www","baidu","com",sep=",") #www.baidu.com
print("hello",end="")#不换行
print("python",end="\t")#以	结尾
print("world",end="\n") #以换行符结尾

输入

password = input("请输入密码:")
print("您刚刚输入的密码是:",passward)

image-20210526195224483

image-20210526195112080

image-20210526195504557

import导入包

image-20210526195838568

判断语句和循环语句

条件判断语句

image-20210526195644597

循环语句

image-20210526200003525

name="chengdu"
for x in name:
    print(x,end="\t")
#c	h	e	n	g	d	u

image-20210526201003327

image-20210526201134765

字符串、列表、元组、字典

字符串

Python的核心数据类型

image-20210526201910361

paragraph="""
		这是一个段落
		可以由多行组成
"""
my_str = "Jason said\"I like you\""  #转义字符

推荐使用双引号。

print(r"hello \nchengdu") #在字符串前面加r,表示直接显示原始字符串,不进行转义
#hello\nchengdu

字符串的常见操作

image-20210526203738725

image-20210526203822332

image-20210526203923809

image-20210526204014574

还有很多方法,可以使用时自行搜索

列表

常见操作

image-20210527112924734

image-20210528115957290

a = [1,2]
b = [3,4]
a.append(b)
print(a) # [1,2,[3,4]]

a.extend(b)
print(a) #[1,2,[3,4],3,4]

image-20210528170916125

元组

image-20210528171058213

新增操作类似于连接、新建

删除不是删除元组中的元素,而是删除了整个元组

image-20210528172112839

字典

image-20210528172146319

直接访问键,如果键值不存在会报错;如果使用dict.get("keyName"),找不到的话会认返回None;dict.get("KeyName","Newvalue"),如果找不到键值,会返回一个新的值

常用操作

image-20210528173405906

image-20210528173447593

集合

image-20210528173611387

image-20210528173735142

小结

image-20210528173808240

函数

函数的概念

如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能代码块组织为一个小模块,这就是函数

函数定义和调用

定义函数

函数定义的格式如下:

def 函数名():
    代码

调用函数

函数名()

函数参数

定义带有参数的函数

示例:

def add2num(a, b):
    c = a + b
    print c

调用带有参数的函数

示例:

add2num(11,22)

image-20210528174936380

全局变量和局部变量

什么是局部变量

image-20210528175219771

  • 局部变量,就是函数内部定义的变量
  • 不同的函数,可以定义相同名字的局部变量,但是各用个的不会产生影响
  • 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用

什么是全局变量

如果一个变量,它既能在一个函数中使用,也能在其他的函数中使用,这样的变量就是全局变量

image-20210528175457949

函数使用注意事项

image-20210528175646642

image-20210528175712202

调用函数

image-20210528175753793

作用域

image-20210603155334926

文件操作

文件,就是把一些数据存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力

文件的打开与关闭

image-20210603161028211

f = open('test.txt','w') #打开文件
f.close()  #关闭文件

访问模式

image-20210603165813742

写数据

使用write()可以完成文件写入数据

  • 如果文件不存在那么创建,如果存在那么就先清空,然后写入数据

读数据

  1. read(num)方法,读取指定的字符,开始时定位在文件头部,每执行一次向后移动指定字符数。

image-20210603210710902

  1. readlines()方法,按照行的方式把整个文件中的内容进行一次读取,返回的是一个列表,其中每一行的数据为一个元素

  2. readline()方法,一次只读一行数据

文件的相关操作

有些时候,需要对文件进行重命名删除等一些操作,python的os模块中都有这些功能

文件重命名

os模块中的rename()可以完成对文件重命名操作

rename(需要修改文件名,新的文件名)

删除文件

os模块中的remove()可以完成对文件删除操作

remove(待删除文件名)

创建文件

import os
os.mkdir("张三")

获取当前目录

import os
os.getcwd()

改变认目录

import os
os.chdir("../")

获取目录列表

import os
os.listdir("./")

删除文件

import os
os.rmdir("张三")

错误与异常

异常是预料到的,可以针对进行处理的

try:
    xxxx
except Exception as e:
try:
    xxxxx
except Exception as e:
 	xxxxx
finally:
    xxxxx

还可以嵌套

Python爬虫

任务介绍

image-20210605142832039

爬虫初识

image-20210605144955036

image-20210605150802555

image-20210605151923422

基本流程

image-20210605152032353

准备工作

image-20210605152824836

分析页面

image-20210605173113241

编码规范

image-20210605173512798

引入模块

image-20210605204559604

获取数据

image-20210605205328319

urllib

http://httpbin.org/ 这个网站可以测试你的请求得到了什么相应

# -*- codeing = utf-8 -*-
# @File : testUrllib.py
# @Software: PyCharm
import urllib.request

response = urllib.request.urlopen("http://www.baidu.com") #HTTPResponse
#print(response.read())#网页的源代码
#print(response.read().decode('utf-8'))#用utf-8的形式解析

#获取一个post请求 (模拟用户真实登录请求
import urllib.parse #解析器
#data = bytes(urllib.parse.urlencode({"hello":"world"}),encoding='utf-8')
#response = urllib.request.urlopen("http://httpbin.org/post",data=data)
#print(response.read().decode("utf-8"))

#get请求
#response = urllib.request.urlopen("http://httpbin.org/get")
#print(response.read().decode("utf-8"))

#超时怎么办?
#超时处理:try....catch
#如果连接出现死链接等情况,需要用到超时处理

# try:
#     response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)
#     print(response.read().decode("utf-8"))
# except urllib.error.URLError as e:
#     print("time out!")


# response = urllib.request.urlopen("http://www.baidu.com")
# print(response.status) #状态码 #当被人发现是爬虫时会返回418
# print(response.getheaders())
# print(response.getheader("Server")) #拿到具体的一个头信息

#通过在headers中加入网页的所有真实键值对 来模拟浏览器
#url = "https://www.douban.com"
#url = "http://httpbin.org/post"
# headers = {
#  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
# }
# data = bytes(urllib.parse.urlencode({'name':'eric'}),encoding="utf-8")
# req = urllib.request.Request(url=url, data=data, headers=headers, method="POST") #对象封装
# response = urllib.request.urlopen(req) #将封装的对象进行传输
# print(response.read().decode("utf-8"))

url = "https://www.douban.com"
headers = {
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36"
}
req = urllib.request.Request(url=url, headers=headers) #对象封装
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

解析内容

image-20210608151356185

标签解析

image-20210608164610122

补充BeautifulSoup

得到网页中某一个指定内容的匹配工具

# -*- codeing = utf-8 -*-
# @File : testBs4.py
# @Software: PyCharm

# BeautifulSoup4将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归为4种
# -Tag  -NavigableString   -BeautifulSoup   -Commet

from bs4 import BeautifulSoup

file = open("./baidu.html","rb")
html = file.read().decode("utf-8")
bs = BeautifulSoup(html,"html.parser")     #指定解析器来解析html文档

#print(bs.title) #<title>百度一下,你就知道 </title>
#print(bs.a)   #<a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
#print(type(bs.head))  #<class 'bs4.element.Tag'>

# 1. Tag   标签及其内容:拿到它所找到的第一个内容

#print(bs.title.string)   #百度一下,你就知道

# 2. NavigableString   标签里的内容(字符串)

#print(bs.a.attrs) #拿到标签里的所有属性值以字典形式保存

# 3. BeautifulSoup   表示整个文档
#print(type(bs))
#print(bs.name)  #[document]
#print(bs.attrs)
#print(bs)   #整个文档

# 4. Comment   #一个特殊的NavigableString,输出内容不包含注释符号
# print(bs.a.string)
# print(type(bs.a.string))

#--------------------------

#文档的遍历

#print(bs.head.contents) #head标签内的内容,按照列表元素进行组装
#print(bs.head.contents[1])
#更多内容搜索BeautifulSoup文档

#文档的搜索
# (1)find_all()
# 字符串过滤:会查找与字符串完全匹配的内容
# t_list = bs.find_all("a")

import re
# 正则表达式搜索:使用search()方法来匹配内容
#t_list = bs.find_all(re.compile("a"))

# 方法:传入一个函数方法),根据函数的要求来搜索
# def name_is_exists(tag):
#     return tag.has_attr("name")
#
# t_list = bs.find_all(name_is_exists)
#
# for item in t_list:
#     print(item)

#print(t_list)

# (2)kwargs   参数
#t_list = bs.find_all(id = "head")  #找到id=head中的所有内容
#t_list = bs.find_all(class_ = True) #在内容中有class的及其子内容
# t_list = bs.find_all(href="http://news.baidu.com")

# for item in t_list:
#     print(item)

# (3)text   参数
#t_list = bs.find_all(text="hao123")
#t_list = bs.find_all(text=["hao123","地图","贴吧"])
#t_list = bs.find_all(text = re.compile("\d")) #应用正则表达式来查找包含特定文本的内容


# (4)limit   参数
# t_list = bs.find_all("a",limit=3)  #限定获取个数

# for item in t_list:
#     print(item)


#css选择器
#t_list = bs.select('title')   #通过标签来查找

#t_list = bs.select(".mnav")    #用类名来查找

#t_list = bs.select("#u1")      #用id来查找

#t_list = bs.select("a[class='bri']")   #用属性来查找

# 通过子标签来查找
#t_list = bs.select("head > title")   #找到head中的title

t_list = bs.select(".mnav ~ .bri")  #兄弟节点

print(t_list[0].get_text())

# for item in t_list:
#     print(item)

正则提取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TShmy8TX-1623934455139)(C:/Users/Administrator/AppData/Roaming/Typora/typora-user-images/image-20210608164700742.png)]

补充re模块

image-20210607203008529

image-20210608102918568

image-20210608103355205

image-20210608110556070
# -*- codeing = utf-8 -*-
# @Time : 2021/6/8 11:52
# @Author : TangSiyu
# @File : testRe.py
# @Software: PyCharm

# 正则表达式:字符串模式(判断字符串是否符合一定的标准)

import re
#创建模式对象

pat = re.compile("AA") #此处的AA,是正则表达式,用来去验证其他的字符串
#m = pat.search("CBA") #search字符串被校验的内容
#m = pat.search("ABCAA")
#m = pat.search("ABCAADDCCAAA") #只会找到第一个匹配的位置

# 没有模式对象
# m = re.search("asd","Aasd")  #前面的字符串是规则(模版),后面的是被校验的对象
# print(m)

#print(re.findall("a","ADFaDFGAa")) #前面字符串是规则(正则表达式),后面是被校验的字符串
#print(re.findall("[A-Z]","ADFaDFGAa"))
#print(re.findall("[A-Z]+","ADFaDFGAa"))

#sub
#print(re.sub("a","A","abcdcasd"))   #找到a用A来替换,在第三个字符串中查找

#建议在正则表达式中,被比较的字符串前面加上r,不用担心转义字符的问题
# a = r"\adgae-\'"
# print(a)

保存数据

Excel表存储

image-20210608164827484

补充利用xlwt库来存储excel表格

# -*- codeing = utf-8 -*-
# @File : testXwlt.py
# @Software: PyCharm

import xlwt

# workbook = xlwt.Workbook(encoding="utf-8")    #创建workbook对象
# worksheet = workbook.add_sheet('sheet1')     #创建工作表
# worksheet.write(0,0,'hello')       #写入数据,第一个参数“行”,第二个参数“列”,写入内容
# workbook.save('student.xls')     #保存数据表

#写入九九乘法表
workbook = xlwt.Workbook(encoding="utf-8")    #创建workbook对象
worksheet = workbook.add_sheet('sheet1')     #创建工作表
x = 1
while x <= 9:
    for i in range(x):
        worksheet.write(x-1, i, "{}×{}={}".format(x,i+1,(x*(i+1))))
    x += 1

workbook.save('九九乘法表.xls')     #保存数据表

使用数据库存储

补充sqlite

常见操作

# -*- codeing = utf-8 -*-
# @File : testsqlite.py
# @Software: PyCharm

import sqlite3
# # 1.连接数据库
# conn = sqlite3.connect("test.db")  #打开或创建数据库文件
#
# print("成功打开数据库")
# # 2.创建数据表
# c = conn.cursor() #获取游标
#
# sql = '''
#     create table company
#         (id int primary key not null,
#         name text not null,
#         age int not null,
#         address char(50),
#         salary real);
# '''
#
# c.execute(sql)   #执行sql语句
# conn.commit()    #提交数据库操作
# conn.close()     #关闭数据库连接
#
# print("成功建表")

# 3.插入数据

# conn = sqlite3.connect("test.db")  #打开或创建数据库文件
# print("成功打开数据库")
#
# c = conn.cursor() #获取游标
#
# sql1 = '''
#     insert into company(id,name,age,address,salary)
#     values (1,'张三',32,'成都',8000);
# '''
#
# sql2 = '''
#     insert into company(id,name,age,address,salary)
#     values (2,'李四',30,'重庆',15000);
# '''
#
# c.execute(sql1)   #执行sql语句
# c.execute(sql2)
# conn.commit()    #提交数据库操作
# conn.close()     #关闭数据库连接
#
# print("成功插入数据")

# 4.查询数据

conn = sqlite3.connect("test.db")  #打开或创建数据库文件
print("成功打开数据库")

c = conn.cursor() #获取游标

sql = "select id,name,address,salary from company"

c.execute(sql)   #执行sql语句

for row in c:
    print("id = ",row[0])
    print("name = ",row[1])
    print("address = ",row[2])
    print("salary = ", row[3],"\n")

conn.close()     #关闭数据库连接

print("查询数据完毕")

数据可视化

Flask入门

关于Flask

image-20210608231101601

image-20210608232135508

为什么要用Web框架?

web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛。这对程序员的要求会越来越高。如果采用成熟,稳健的框架,那么一些基础的工作,比如,网络操作、数据库访问、会话管理等都可以让框架来处理,那么程序开发人员可以把精力放在具体的业务逻辑上面。使用Web框架开发Web应用

总结一句话:避免重复造轮子

Flask框架的诞生

Flask诞生于2010年,是Armin ronacher(人名)用Python语言基于Werkzeug工具箱编写的轻量级Web开发框架。它主要面向需求简单的小应用。

Flask本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login),都需要用第三方的扩展来实现。比如可以用Flask-extension加入ORM、窗体验证工具,文件上传、身份验证等。Flask没有认使用的数据库,你可以选择MysqL,也可以用Nosql。其 Wsgi 工具箱采用 Werkzeug(路由模块)模板引擎则使用 Jinja2

可以说Flask框架的核心就是Werkzeug和Jinja2

Werkzeug进行请求的路由转发

Jinja2进行界面框架渲染

Python最出名的框架要数Django,此外还有Flask、Tornado等框架。虽然Flask不是最出名的框架,但是Flask应该算是最灵活的框架之一,这也是Flask受到广大开发者喜爱的原因。

image-20210608234415376

补充flask

image-20210608234901982

此时没有开启debug模式,每次修改都需要重启服务器

如何在pycharm中开启debug模式?

image-20210609163104227

app.py

from flask import Flask, render_template,request #渲染模板
import datetime

app = Flask(__name__)


#解析路由,通过用户访问的路径,匹配响应的函数
# @app.route('/')   #匹配/路径   #用户访问方式
# def hello_world():
#     #return 'Hello World!'
#     return '你好!欢迎光临'

# debug模式开启


@app.route("/index")
def hello():
    return "你好"

#通过访问路径,获得用户的字符串参数
@app.route("/user/<name>")   #拿到指定内容
def welcome(name):
    return "你好,%s"%name

#通过访问路径,获得用户的整形参数
@app.route("/user/<int:id>")    #此外还有float类型
def welcome2(id):
    return "你好,%d 号的会员"%id

#路由路径不能重复,用户通过唯一路径访问特定的函数


#返回给用户渲染后的html网页文件
# @app.route("/")
# def index2():
#     return render_template("index.html")  #渲染文件


#向页面传递一个变量
@app.route("/")
def index2():
    time = datetime.date.today()    #普通变量
    name = ["小张","小王","小赵"]     #列表类型
    task = {"任务":"打扫卫生","时间":"3个小时"}    #字典类型
    return render_template("index.html",var = time, list = name, task=task)


#表单提交
@app.route('/test/register')
def register():
    return render_template("test/register.html")


#接收表单提交的路由,需要指定methods为post
@app.route('/result',methods=['POST','GET'])
def result():
    if request.method == 'POST':
        result = request.form   #将表单内容形成一个字典传给result
        return render_template("test/result.html",result=result)



if __name__ == '__main__':
    app.run()

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    今天是{{ var }},欢迎光临。<br/> <!-- 两个大括号可以使用普通变量类型-->
    今天值班的有:<br/>
    {% for data in list %}      <!--控制语句变量要使用大括号嵌套%,并且要有for循环结束语句endfor-->
        <li>{{ data }}</li>
    {% endfor %}

    任务:<br/> <!--如何在页面打印表格  以及如何迭代字典-->
        <table border="1">
            {% for key,value in task.items() %}   <!--[(key,value),(key,value)]-->
                <tr>
                    <td>{{ key }}</td>
                    <td>{{ value }}</td>
                </tr>
            {% endfor %}
        </table>
</body>
</html>

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="{{ url_for('result') }}" method="post">
    <p>姓名:<input type="text" name="姓名"></p>
    <p>年龄:<input type="text" name="年龄"></p>
    <p>性别:<input type="text" name="性别"></p>
    <p>地址:<input type="text" name="地址"></p>
    <p><input type="submit" value="提交"></p>
</form>

</body>
</html>

result.html

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="{{ url_for('result') }}" method="post">
    <p>姓名:<input type="text" name="姓名"></p>
    <p>年龄:<input type="text" name="年龄"></p>
    <p>性别:<input type="text" name="性别"></p>
    <p>地址:<input type="text" name="地址"></p>
    <p><input type="submit" value="提交"></p>
</form>

</body>
</html>

http://www.cssmoban.com/ 网站模板下载

https://www.iconfont.cn/ 阿里的开源的图标库,可以下载任意图标

ECharts应用

https://echarts.apache.org/zh/index.html Eharts 网站

完全可以根据需求来在线定制

补充ECharts

一个网页中可以有多张图表,但多张图的命名要不同

教程:https://echarts.apache.org/v4/zh/tutorial.html#ECharts%20%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5%E6%A6%82%E8%A7%88

<!DOCTYPE html>
<html lang="en">
<head>
    <Meta charset="UTF-8">
    <!-- 引入 ECharts 文件 -->
    <script src="echarts.min.js"></script>
    <title>ECharts</title>
</head>
<body>

    <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
    <div id="main" style="width: 600px;height:400px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));

        // 指定图表的配置项和数据
        var option = {
            title: {
                text: 'ECharts 入门示例'
            },
            tooltip: {},
            legend: {
                data:['销量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: [5, 20, 36, 10, 10, 20]
            }]
        };

        // 使用刚指定的配置项和数据显示图表。
        myChart.setoption(option);
    </script>
</body>
</html>

应用时,可以在实例标签下使用可视化工具,直接得到对应代码

image-20210615203355980

然后把左边代码复制到自己html文件中的 <script> 标签内的var option配置项部分

WordCloud应用

WordCloud示例

安装

https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud 页面下载所需的whl文件,注意选择对应的版本

#-*- codeing = utf-8 -*-
#@File : testCloud.py
#@Software: PyCharm

import jieba    #分词
from matplotlib import pyplot as plt    #绘图,数据可视化
from wordcloud import WordCloud     #词云
from PIL import Image       #图片处理
import numpy as np      #矩阵运算
import sqlite3      #数据库

#准备词云所需的字
con = sqlite3.connect('movie.db')
cur = con.cursor()
sql = 'select instroduction from movie250'
data = cur.execute(sql)
text = ""
for item in data:
    text = text + item[0]
#print(text)
cur.close()
con.close()


#分词
cut = jieba.cut(text)
string = ' '.join(cut)
print(len(string))


img = Image.open(r'./static/assets/img/tree.jpg')   #打开遮罩图片
img_array = np.array(img)   #将图片转换为数组
wc = WordCloud(
    background_color='white',
    mask=img_array,
    font_path="msyh.ttc"    #字体c:/windows/fonts
)
wc.generate_from_text(string)


#绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off')     #是否显示坐标轴

#plt.show()      #显示生成的词语图片
#输出词云文件
plt.savefig(r'./static/assets/img/word.jpg',dpi=500) #dpi清晰度

whl文件,注意选择对应的版本

#-*- codeing = utf-8 -*-
#@File : testCloud.py
#@Software: PyCharm

import jieba    #分词
from matplotlib import pyplot as plt    #绘图,数据可视化
from wordcloud import WordCloud     #词云
from PIL import Image       #图片处理
import numpy as np      #矩阵运算
import sqlite3      #数据库

#准备词云所需的字
con = sqlite3.connect('movie.db')
cur = con.cursor()
sql = 'select instroduction from movie250'
data = cur.execute(sql)
text = ""
for item in data:
    text = text + item[0]
#print(text)
cur.close()
con.close()


#分词
cut = jieba.cut(text)
string = ' '.join(cut)
print(len(string))


img = Image.open(r'./static/assets/img/tree.jpg')   #打开遮罩图片
img_array = np.array(img)   #将图片转换为数组
wc = WordCloud(
    background_color='white',
    mask=img_array,
    font_path="msyh.ttc"    #字体c:/windows/fonts
)
wc.generate_from_text(string)


#绘制图片
fig = plt.figure(1)
plt.imshow(wc)
plt.axis('off')     #是否显示坐标轴

#plt.show()      #显示生成的词语图片
#输出词云文件
plt.savefig(r'./static/assets/img/word.jpg',dpi=500) #dpi清晰度

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐