搭建自己的网站,是作为一个码农成功标志之一,
那其他成功标志有啥呢,
嘿…
左手搂着白富美,右手撸着小烧烤,脚底踩着桑塔纳…
嗯~
这么潇洒的人生,就从数据库表设计及数据存储开始吧!

数据库表设计及存储数据

  • 1. 爬取数据
  • 2. 创建数据库
    • 2.1 创建数据库表
    • 2.2 连接数据库
  • 3. 数据存储
  • 4. 彩蛋

1. 爬取数据

有的小朋友会说,鱼叔,你这不是数据库表设计吗,怎么还送套餐是咋的?
哈哈~
买二送一…
我们爬取数据,是为了把数据直接存储到数据库中,这样就省下来造数据的过程~
我们今天爬取的内容,是这个网站

url = https://arxiv.org/list/cs/recent

这里汇集了外国各路大佬的大神级作品,而且还是免费的!
如果看不懂的话,可以谷歌翻译~!
我们看看这个网站长啥样子

老规矩,上代码

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-8-26
"""import requests
import csv
import traceback
from bs4 import BeautifulSoup
from PaperWeb.Servers.utils.requests import get_http_sessiondef gen_paper(skip):try:#url的skip设定参数,每次展示100条数据url = 'https://arxiv.org/list/cs/pastweek?skip={skip}&show=100'#设定headersheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}#设定代理,如果未购买,则不需要填写,proxies  = {'http':"http://127.0.0.1:1092"'https':"http://127.0.0.1:1092"}#引用http代理池,避免资源被耗尽r = get_http_session().get(url,headers=headers,proxies=proxies)#不运用代理,则注释掉proxies=proxies#r = get_http_session().get(url,headers=headers)#判断返回状态if r.status_code !=200:return False,'请求网页失败'#使用lxml,是因为解析速度快soup = BeautifulSoup(r.text,'lxml')#获取论文url的信息all_dt = soup.find_all('dt')#获取论文的标题与作者all_dd = soup.find_all('dd')#使用zip方法,循环获取dd 和dt的内容,for  dt,dd in zip(all_dt,all_dd):#因为class是关键字,所以用_作区分,#获取url,通过class下的a标签的href链接来获取api_url = dt.find(class_ = 'list-identifier').find('a').get('href')root_url = 'https://arxiv.org'full_url = root_url + api_url"""最开始使用contents,是直接获取到title的内容,text获取的内容很多,多而乱"""#获取title,通过class标签下的contents获取,返回listtitle = dd.find(class_ = 'list-title mathjax').contents#对内容进行判断,如果titles的长度>=3,就截取第2部分if len(title) >=3:title = title[2]else:#text,返回的是str,title = dd.find(class_ = 'list-title mathjax').text#论文作者authors = dd.find(class_='descriptor').text#由于一行很多作者,所以要进行切分authors = authors.split(':')[1].replace('\n','')#生成器yield title,full_url,authorsexcept Exception as e:#输出错误日志信息log(traceback.format_exc(),'error','gen_paper.log')error_str =  f'authors:[full_url:[{full_url},{authors}],title:[{title}'log(error_str,'error','gen_paper.log')# #打印错误# print(e)# traceback.print_exc()def log(content,level,filepath):""":param content:输入错误信息内容:param level:错误等级:param filepath:路径:return:"""if level =='error':with open(filepath,'a') as f:f.write(content)elif level =='fail':with open(filepath,'a') as f :f.write(content)def run_main():'''保存到csv文件中:return:'''#定义一个空列表resl = []#循环所有的数据信息,一共有1273条论文,间隔100for i in range(0,1273,100):#这里的i 就是 skip,for full_url,title,authors in gen_paper(i):#添加到list中resl.append([title,full_url,authors])print(title,'done')#打开文件,进行保存with open('paper.csv','w') as f :#打开上面获取到的文件内容cw = csv.writer(f)#写数据到csv中for i in resl:#写一行cw.writerow(i)if __name__ == '__main__':run_main()

这里不过多的对内容进行解析,不太明白的,可以看注释,
个人觉得,嗯~,虽然不是句句有注释,但是也没达到句句没有注释!
在不明白的,看小鱼这篇文章《Python3,多线程爬完B站UP主的视频弹幕及评论》这里面,能解释的,可都解释了!
瞅瞅,这就是运用到的代理

        #设定代理,如果未购买,则不需要填写proxies  = {'http':"http://127.0.0.1:1092"'https':"http://127.0.0.1:1092"}#引用http代理池,避免资源被耗尽,传入三个参数r = get_http_session().get(url,headers=headers,proxies=proxies)

代理是要花银子的,如果不是靠吃爬虫这碗饭的,或者不是发烧友,弄个免费的代理就行,虽然不稳定,但是,也行~
运行结果

我为啥要把展示结果,
是因为要品一品,这爬取的结果,香不香

2. 创建数据库

2.1 创建数据库表

一个是把创建的数据表,在pycharm的工程中写入
如下:
create.sql

--数据表CREATE TABLE 'papers'('id' int(11) NOT NULL AUTO_INCREMENT,'title' varchar(500) NOT NULL DEFAULT ''COMMIT '论文标题','url' varchar(200) NOT NULL DEFAULT ''COMMIT '论文url','authors' varchar(200) NOT NULL DEFAULT ''COMMIT '论文作者','create_time' int(20) NOT NULL DEFAULT 0 COMMIT '创建时间','update_time' int(20) NOT NULL DEFAULT 0 COMMIT '更新时间','is_delete' tinyint(4) NOT NULL DEFAULT 0 COMMIT '是否删除',PRIMARY KEY ('id'),KEY 'title_IDX' ('title') USING BTREE,KEY 'authors_IDX' ('authors') USING BTREE
)ENGINE=InnoDB AUTO_INCREMENT =1 DEFAULT CHARSET=utf8 COMMIT='论文表'

这里展示的是MySQL的基本创建表的内容,不会的,可以看小鱼这篇《SQL基本用法一》
再看不懂的,就看看自己的银行卡余额,自己的左手及右手~
估计就会了!
写完之后,别忘了在数据库执行一下,不然怎么能生成表呢~

2.2 连接数据库

我们创建了数据库,就要通过pymysql把数据库连接起来,这样才能用起来~
继续上代码
mysql.py

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-8-26
"""import pymysql
import logging'''
创建mysql数据库链接
'''class MySQL(object):#创建数据库的基本链接信息def __init__(self,host='localhost',port = 3306,user='root',password = '123456',db='test'):#cursorclass = pymysql.cursors.DictCursor 数据库查询返回dict --> 默认返回值是 tupleself.conn = pymysql.connect(host = host,port = port,user=user,password=password,db=db,charset = 'utf8',cursorclass = pymysql.cursors.DictCursor)#定义loggerself.log = logging.getLogger(__name__)def execute(self,sql,kwargs = None):# 创建mysql数据库链接try:#获取游标cursor = self.conn.cursor()#通过游标获取执行方法cursor.execute(sql,kwargs)#提交插入,删除等操作self.conn.commit()return cursorexcept Exception as e:#记录错误信息self.log.error(f'mysql execute eror:{e}',exc_info=True)raise edef query(self,sql,kwargs = None):#创建查询方法try:cursor = self.execute(sql,kwargs)if cursor:# 返回查询到的所有内容return cursor.fetchall()else:raise Exception(f'sql error:{sql}')except Exception as e:self.log.error(e)raise efinally:#关闭游标cursor.close()def insert(self,sql,kwargs = None):#数据插入try:cursor  = self.execute(sql,kwargs)if cursor:#获取最后行的idrow_id = cursor.lastrowidreturn row_idelse:raise Exception(f'sql error:{e}')except Exception as e:self.log.error(e)raise efinally:cursor.close()def escape_string(self,_):#对数据文件的内容进行转码,防止有一些特殊字符等return pymysql.escape_string(_)db = MySQL(user='root',password='123456',db='papers')

这里用到的是pymysql这个库,不会使用的,看小鱼这篇文章《Python3链接Mysql数据库》

3. 数据存储

我们把爬取的数据,存储到数据库中。
同样,直接上代码

csv_to_mysql.py

# -*- coding: utf-8 -*-
"""
@ auth : carl_DJ
@ time : 2020-8-26
"""import csv
import time
from PaperWeb.libs.mysql import dbdef get_csv_info(path = 'paper.csv')#打开csv文件csvfile = open(path,'r')reader = csv.reader(csvfile)for item in reader:yield itemdef get_insert_sql():#把数据插入到数据库items = []#获取时间_time = int(time.time())for item in get_csv_info():#对csv文件中的字符进行转码item = [db.escape_string(_) for _ in item]#添加到对应的list中,创建数据库时列表字段items.append(f"('{item[0]}',{item[1]},{item[2]},{_time},{_time})")#获取values值values = ','.join(items)#执行sql 语句的插入sql = f'''INSERT INTO Paper ('title','url','authors','create_time','updata_time')Values{values}'''row_id = db.insert(sql)print(f'{row_id}条数据插入完成')

执行完之后,则就可以去数据库,看结果!
要是不完美,小鱼觉得那是不可能的~
要是完美,也不枉费小鱼肝到十二点的成果!

录完课 ,做总结,
喝点咖啡,溜溜娃,
娃睡了,我也开始肝代码。

4. 彩蛋

这个网站搭建完成,小鱼接下来的目标有两个:
1.会写一些python数据分析的博文;
2.小鱼分享 自己四面阿里,终拿offer的经历及面试题

哈哈,这提前剧透了~

为啥又要写 阿里面试的经历
因为,最近有小伙伴要准备阿里的面试,问了我一些关于阿里面试的问题,与其逐一的说,不如整理出来,share更多人!

这样小鱼我也省下更多的时间,做更多事情!!

好了,最后借用王二的一句话,结束今天的技术分享:

如果不是生活所迫,谁愿意才华一身!

Python3,网站搭建之数据库表设计及数据存储!文末的彩蛋,我酸了~相关推荐

  1. mysql数据库表设计——如何对图片进行存储

    业务场景:当我们进行头条文章接口的设计时,需要存储封面图片的字段. 文章和图片关系 ----> 一对多 方案一:传统的表设计 设计一张表,专门保存文章和封面图片之间的关系 id article_ ...

  2. 省市联动的数据库表设计和数据

    关于省市联动的表结构和数据 链接:https://pan.baidu.com/s/1X4QyyTiF96vkAENLZs6n-Q 提取码:8dzq 下载到桌面以后,可以用工具来导入数据库 找到自己下载 ...

  3. python讲1020逆序输出_手把手带你学 Python3(九)| 快速实现数据处理的不二工具(文末有彩蛋)...

    ", line 1, in TypeError: 'int' object is not callable #当然实际代码绝对不能这么写,这里是为了说明函数名也是变量.要恢复abs函数,请重 ...

  4. mysqlfront无法连接到数据库,文末有彩蛋

    NO1:说说zookeeper是什么? ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现(Chubby是不开源的),它是集群的管理者,监视 ...

  5. 美多商城项目:商品数据库表设计、准备商品数据、首页广告、商品列表页

    一.商品数据库表设计 1.1 SPU和SKU 在电商中对于商品,有两个重要的概念:SPU和SKU 1. SPU介绍 SPU = Standard Product Unit (标准产品单位) SPU是商 ...

  6. 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区

    数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...

  7. 网上书城项目的需求分析、数据库表设计及前端界面的编写(项目进度一)

    转载请标明出处:https://blog.csdn.net/men_ma/article/details/106847165. 本文出自 不怕报错 就怕不报错的小猿猿 的博客 网上书城项目的需求分析. ...

  8. 数据库表设计3:微信、QQ第三方多账号登陆

    前言:相比于本地注册,第三方登录一般来说比较方便快捷.因为显著降低了用户的注册或登录成本,从而减少由于本地注册的繁琐性而带来的隐形用户流失,最终提高注册转化率.现在几乎大部分的 App 都支持使用多个 ...

  9. 数据库表设计的几个原则

    前言:数据库设计在平时的工作是必不可少的,良好的表设计可以让我们查询效率更高,加快网站访问速度,提升用户体验,并且方便于我们查询数据.本篇博客就来聚焦一下,如何设计出高可复用,优良的表结构,从而在实际 ...

最新文章

  1. 程序员都该懂点 HTTP
  2. 计算机组成原理 输入输出系统,计算机组成原理(第七章输入输出系统
  3. html轮廓位置,html – 具有边框/轮廓的六边形
  4. [基础题] 3、设计一个交通工具抽象类,提供抽象方法--驾驶
  5. 掌握Android中的进程和线程
  6. FFMPEG视音频编解码零基础学习方法
  7. web前端(八)——ajax与jsonp
  8. 你关注过浏览器最小字体为多大吗?
  9. [bzoj2434][AC自动机][树状数组]阿狸的打字机
  10. 机器学习笔记1-What is Machine Learning
  11. 2020年短视频元年火爆来袭
  12. MATLAB对水下目标去噪声代码,水下目标噪声与背景噪声的建模与仿真
  13. 分散染料对涤纶织物染色步骤
  14. java timeunit_java – 了解TimeUnit
  15. Side Window Filtering 论文笔记
  16. 如何快速记忆C语言运算符,C语言运算符快速记忆法
  17. 在Ubuntu中配置中文输入法
  18. 正则表达式匹配字母或中文
  19. 数字电路实验四:智力抢答器预实验报告
  20. 实现HMTL网页的全屏幕显示或模态显示 (JS代码)

热门文章

  1. 成都物韵电子商务有限公司代运营入驻电商平台需要注意哪些问题?
  2. 盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)
  3. 淘宝商品信息爬取,实现词云,并进行饼状图绘制及效果图
  4. python中yacs/yaml库的使用
  5. 从程序员到项目经理(9):程序员加油站 --要执着但不要固执
  6. python语言浮点数可以不带小数部分吗_关于Python语言的浮点数类型,以下选项中描述错误的是 ( )_学小易找答案...
  7. Python中五个不常见的隐晦用法小结
  8. windows下配置npm淘宝镜像
  9. 红米4c语言设置在哪里设置方法,红米怎么设置移动3G网络?红米3G网络设置图文教程...
  10. java运行过程中c盘越来越大_系统盘C盘变红怎样彻底清理 Win10系统盘Dism++清理实战教学...