文化不分边界

人,为什么要读书?举个例子:
当看到天边飞鸟,你会说:“落霞与孤鹜齐飞,秋水共长天一色。”而不是:“卧靠,好多鸟。”;
当你失恋时你低吟浅唱道:“人生若只如初见,何事秋风悲画扇。”而不是千万遍地悲喊:“蓝瘦,香菇!”

别人看车关注牌子,我看车关注宽敞不,睡着舒服不?可不管怎样不能在人前丢份啊,所以我决定学习学习车标!首先我们爬取车标及其相关信息,然后通过Flask来做一个车标学习网站

先来看看实现效果:


车标网数据爬虫

在网上找了半天车标的数据,最后看到了这个网站:

车标网  http://www.chebiaow.com/logo。


网站将车系按照字母从A-Z进行了排序,然后点击每个车标进入详细信息,那Audi做例子:


有用的数据是哪些?品牌名称、车标图片、成立时间、主要车型、官网。
那么让我们开始通过爬虫,获取车标网下所有的汽车品牌及车标,最终入库保存吧,开始!

数据库操作指南

针对简单的数据,我习惯用python自带的sqlite3进行数据库的存储,简单方便….那么如何管理我们的数据库呢?推荐使用DBUtils!

安装:pip install DBUtils

DBUtils is a suite of tools providing solid, persistent and pooled connections to a database that can be used in all kinds of multi-threaded environments like Webware for Python or other web application servers. The suite supports DB-API 2 compliant database interfaces and the classic PyGreSQL interface.

简而言之,DBUtils是一套为数据库提供可靠,持久和池式连接的工具,可用于各种多线程环境。我们一般使用DBUtils.PooledDB来创建一批连接池进行并发处理。常用参数如下:

参数 说明
creator 使用链接数据库的模块(sqllite3、pymysql…)
maxconnections 连接池允许的最大连接数,0和None表示不限制连接数
mincached 初始化时,链接池中至少创建的空闲的链接,0表示不创建
maxcached 链接池中最多闲置的链接,0和None不限制
blocking 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错
maxusage 一个链接最多被重复使用的次数,None表示无限制
host ip
user 用户名
password 密码
database 数据库名
charset 字符集(Mysql用的比较多,SQLite没有)

因为之前都是拿DBUtils链接Mysql数据库的,这次默认就直接改成sqlite3,结果简单配置下,封装上常用的方法…一跑程序挂了!Why?
SQLite本身无法应对多个线程并发访问,由一个线程创建并访问的sqlite的数据库,无法允许另外一个线程进行访问,找解决办法呗,最终找到通过设置check_same_thread=False,使SQLite支持多线程并发(但并发的效果很一般)。

# -*- coding: utf-8 -*-# @Author   : 王翔# @微信号   : King_Uranus# @公众号    : 清风Python# @GitHub   : https://github.com/BreezePython# @Date     : 2019/12/15 20:27# @Software : PyCharm# @version  :Python 3.7.3# @File     : db_maker.py

import sqlite3from DBUtils.PooledDB import PooledDB

class DB_Maker:    def __init__(self):        self.POOL = PooledDB(            check_same_thread=False,            creator=sqlite3,  # 使用链接数据库的模块            maxconnections=10,              mincached=2,              maxcached=5,              blocking=True,              maxusage=None,              ping=0,            database='database.db',        )        self.check_db()

    def check_db(self):        sql = "SELECT name FROM sqlite_master where name=?"        if not self.fetch_one(sql, ('idiom',)):            self.create_table()

    def create_table(self):        print("create table ...")        sql = """create table idiom (                        [id]            integer PRIMARY KEY autoincrement,                        [name]         varchar (10),                        [speak]      varchar (30),                        [meaning]      varchar (100),                        [source]      varchar (100),                        [example]      varchar (100),                        [hot]      int(10)                    )"""        self.fetch_one(sql)

    def db_conn(self):        conn = self.POOL.connection()        cursor = conn.cursor()        return conn, cursor

    @staticmethod    def db_close(conn, cursor):        cursor.close()        conn.close()

    def fetch_one(self, sql, args=None):        conn, cursor = self.db_conn        if not args:            cursor.execute(sql)        else:            cursor.execute(sql, args)        record = cursor.fetchone()        self.db_close(conn, cursor)        return record

    def fetch_all(self, sql, args):        conn, cursor = self.db_conn        cursor.execute(sql, args)        record_list = cursor.fetchall()        self.db_close(conn, cursor)        return record_list

    def insert(self, sql, args):        conn, cursor = self.db_conn        row = cursor.execute(sql, args)        conn.commit()        self.db_close(conn, cursor)

本次有一个知识点,我们需要将车标图片,存储在数据库中,那么如何在数据库中存储图片,使用类型BLOB。举一个简单的数据库图片读写例子

# -*- coding: utf-8 -*-# @Author   : 王翔# @微信号   : King_Uranus# @公众号    : 清风Python# @GitHub   : https://github.com/BreezePython# @Date     : 2019/12/15 20:27# @Software : PyCharm# @version  :Python 3.7.3# @File     : show.py

import sqlite3

db = sqlite3.connect('Car.db')cur = db.cursor()cur.execute("CREATE TABLE if not exists image_save (image BLOB);")

with open('Audi.jpg', 'rb') as f:    cur.execute("insert into image_save values(?)", (sqlite3.Binary(f.read()),))    db.commit()

cur.execute('select image from image_save limit 1')b = cur.fetchone()[0]

with open('1.jpg', 'wb') as f:    f.write(b)

我们创建一个image_save的测试表,然后将图片读取为二进制字节的方式,通过sqlite3.Binary将二进制文件存储至数据库。
那么同样的,我们将BLOB类型的图片读取出来后,进行写入,即可达到效果,来看看这个1.jpg是否正常:


图片下载小技巧

看过了二进制的存储方式,大家肯定说明白了,网站获取到图片链接然后找着上面的例子下载到本地,然后再进行二进制的读取后存储数据库即可,对吗?不对…有什么问题呢?来看一个例子:


这里Audi图片的链接地址,我们通过requests来下载看看….

import requestsr =requests.get('http://img.chebiaow.com/thumb/cb/allimg/1303/1-1303061Z600520,c_fill,h_138,w_160.jpg')r.contentb'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01...'

可以看到我们通过requests.get获取到的content就已经是二进制数据了,为何还要存储成图片,在转化呢?省去了我们保存图片的多余过程。

网页分析

针对A-Z的车标排序,网站的url匹配关系很简单:

from string import ascii_uppercase as au# ascii_uppercase代表A-Z,当然你可以不引入模块自己生成也OK...for uppercase in au:    "http://www.chebiaow.com/logo/{}.html".format(au)

可以看到在包含cb-list方法的ul下匹配所有li中的第一个a标签,然后拼接base_url即可。

进入品牌详情界面后,我们针对左右栏目的设置,分别获取所需标红的内容


最终存储的数据库如下:


由于图片是BLOB类型的二进制文件,所以大家看到的是星星,最终获取网站258份车辆信息(虽然我能认识的不到20种…)
这个中兴看了半天还以为是搞错了,没想到是同名的…

万法同源

一直觉得可能自己不太适合搞技术,更适合在天桥底下支个摊子说书。技术的东西从来没人关注,扯东扯西的文章莫名的火。之前的一篇文章MarkDown添加图片的三种方式不管是在技术为主的CSDN还是娱乐为主的简书,都莫名的火爆,看图:


其实文章没什么含量,就是介绍了下markdown添加图片的方式,唯一新奇的可能就是使用了base64的图片二进制转化。![avatar]\(data:image/png;base64,iVBORw0......)

  1. 使用python将图片转化为base64字符串

import base64f=open('723.png','rb') #二进制方式打开图文件ls_f=base64.b64encode(f.read()) #读取文件内容,转换为base64编码f.close()print(ls_f)
  1. base64字符串转化为图片

import base64bs='iVBORw0KGgoAAAANSUhEUg....' # 太长了省略imgdata=base64.b64decode(bs)file=open('2.jpg','wb')file.write(imgdata)file.close()

通过request.get(url).content获取的二进制字符串,直接存储至SQLite数据库的BLOB字段中。如果我们需要显示图片,直接通过open函数的写入数据即可生成原始的图片。但是,如果我不想写入图片,而希望直接展示在web界面上呢?也可以通过markdown添加图片的方式,使用base64的编码来实现!

Flask展示图片例子

我们先不通过读取数据库,而是直接获取requests.get(url).content的方式测试Flask的图片展示。
HTML代码:

html><html lang="en"><head>    <meta charset="UTF-8">    <title>Titletitle>head><body><img src="data:;base64,{{ img }}">body>html>

Flask后台代码:

from flask import Flask, render_templateimport base64import requests

app = Flask(__name__)

@app.route("/show")def show_image():    r = requests.get('http://img.chebiaow.com/thumb/cb/allimg/1303/1-1303061Z600520,c_fill,h_138,w_160.jpg')    image = base64.b64encode(r.content).decode('ascii')    return render_template('index.html', img=image)

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

图片展示OK,使用这种方式,我们就没必要将图片文件先从数据库中读取生成后,再通过url_for('static',filename='x.png')的方式进行显示了。

完善车标app

我们就把这些数据库信息配合Flask完成一个简单的车标学习简单网站吧,来看看实现效果:


后台Flask代码:

# -*- coding: utf-8 -*-# @Author   : 王翔# @JianShu  : 清风Python# @Date     : 2019/7/25 1:37# @Software : PyCharm# @version  :Python 3.7.3# @File     : app.py

from flask import Flask, render_template, gimport sqlite3import randomimport base64

app = Flask(__name__)DATABASE = 'static/db/car.db'app.secret_key = 'Breeze Python'

def connect_db():    return sqlite3.connect(DATABASE)

@app.before_requestdef before_request():    g.db = connect_db()

@app.teardown_requestdef teardown_request(exception):    if hasattr(g, 'db'):        g.db.close()

def query_db(query, args=()):    cur = g.db.execute(query, args)    rv = [dict((cur.description[idx][0], value)               for idx, value in enumerate(row)) for row in cur.fetchall()]    if not query.startswith('select'):        g.db.commit()    return rv[0] if rv else None

@app.route('/car')@app.route('/')def index():    id = random.randint(1, 141)    car_info = query_db('select name,image,founded,models,website from car_logo where id={}'.format(id))    car_info['image'] = base64.b64encode(car_info['image']).decode('ascii')    print(car_info)    return render_template('index.html', car=car_info)

if __name__ == '__main__':    app.run(host='0.0.0.0', port=7000)

前台HTML代码就不再这里展示了…
复制打开下面链接,下载整套爬虫与Flask代码及数据库信息。

https://pan.baidu.com/s/19r04Nz-0UlZhMmDWSDAbmg

-END-

往期精彩Python自动化用这些知识点就够了!Python爬取拉勾网python职位数据如何用 Python 处理 B 站下载视频?小白入门Python数据科学全教程50个关于IPython的使用技巧,快收藏!如何用Python和数据分析鉴别网络刷单 ?使用Python伪装黑客,批量获取网站密码!用Python打造实时截图识别OCRPython+Matplotlib 制作排序算法的动画Python项目:让你的文字会说话利用Python开发智能阅卷系统Scrapy 爬取二手房信息,进行可视化数据分析

END

关注【程序IT圈】,更多的Python好文输出

python sqlite3 带密码_Python爬虫+Flask,带你创建个网站!相关推荐

  1. 如何用python爬股票数据_python爬虫股票数据,如何用python 爬虫抓取金融数据

    Q1:如何用python 爬虫抓取金融数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为 ...

  2. 爬虫python可以干嘛_python爬虫可以用来做什么?

    1.收集数据 python爬虫程序可用于收集数据.这也是最直接和最常用的方法.由于爬虫程序是一个程序,程序运行得非常快,不会因为重复的事情而感到疲倦,因此使用爬虫程序获取大量数据变得非常简单和快速. ...

  3. python爬取物流信息_python爬虫快递查询系统(源码)

    import requests import json def get_express_type(postid): '''根据快递单号来智能判断快递类型''' url = 'http://www.ku ...

  4. python如何解析网页_Python爬虫入门第一课:如何解析网页

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于肥宅与画家 ,作者AntzUhl 我们编写网络爬虫最主要的目 ...

  5. python的实现原理_python爬虫实现原理

    前言 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前: 一.爬虫是什 ...

  6. python django restful框架_python+django+rest框架配置创建方法

    安装好所需要的插件和包: python.django.pip等版本如下: 采用Django REST框架3.0 1.在python文件夹下D:\python\Lib\site-packages\dja ...

  7. python sqlite3 带密码_Python实现ATM提款机系统

    原文在此 https://mp.weixin.qq.com/s?__biz=MzU2NTc1MTc5MQ==&mid=2247484014&idx=1&sn=6f43e5833 ...

  8. python发送邮件带附件_Python发送邮件(带附件)

    import smtplib                           #发送邮件模块 from email.mime.text import MIMEText    #定义邮件内容 fro ...

  9. python教程自带数据库_python教程自带数据库 | Python学哪个数据库

    python使用数据库 增条数据import pymysql #返回Connection #host="localhost" con = pymysql.connect(host= ...

最新文章

  1. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  2. mysqladmin flush-hosts 解决方法
  3. PyQt5 Pyinstaller时出现错误Cannot find PyQt5 plugin directories
  4. 22-1图的遍历的源代码
  5. 内存泄露valgrind
  6. python-笔记(二)数据类型
  7. Marlin 溫度感應器 數值轉換對應表
  8. [2018.03.13 T1] 比赛(contest)
  9. LabelImg使用方法
  10. android 图片轮播控
  11. OpenMV 从入手到跑TensorFlow Lite神经网络进行垃圾分类
  12. 磁珠 符号_(整理)贴片磁珠规格
  13. Honeywell EPKS通用中文操作手册
  14. 如何克服焦虑,不安,紧张
  15. 判断字符串中是否仅包含英文字母、数字和汉字
  16. linux opengl配置编译,Linux下OpenGL的安装与cmake编译OpenGL程序
  17. 2021北京信息科技大学光电学院调剂复试经历
  18. 校区多,客情管理难?看中进教育使用明道云的新解法
  19. 使用Clover引导黑苹果
  20. 蓝汛通过工信部ISMS测试 彰显行业带头者作用

热门文章

  1. 上周热点回顾(12.24-12.30)
  2. Python编程:从入门到实践 9-6~9-8
  3. D3QN算法的网络结构是如何计算并输出的,输出的是什么
  4. 深拷贝和浅拷贝开发常用方法总结
  5. linux初入门问题零碎(ubuntu)
  6. python3写txt_科学网—python3 fasta txt seq contig等纯文本文件的读取 写入 - 靳泽星的博文...
  7. c语言函数调用与ebp,esp的关系
  8. 如何将ff新鲜事进行删除或卸载?
  9. InsightFace-Paddle实现人脸比对 | 不用建立索引的那种 (一)
  10. CSS / 圆角边框+阴影+浮动