Python爬虫+Flask,带你创建个网站!

news/2024/5/20 14:16:41/文章来源:https://blog.csdn.net/itcodexy/article/details/109574452


文化不分边界

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

别人看车关注牌子,我看车关注宽敞不,睡着舒服不?可不管怎样不能在人前丢份啊,所以我决定学习学习车标!首先我们爬取车标及其相关信息,然后通过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表示无限制
hostip
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.pyimport sqlite3
from DBUtils.PooledDB import PooledDBclass 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@staticmethoddef db_close(conn, cursor):cursor.close()conn.close()def fetch_one(self, sql, args=None):conn, cursor = self.db_connif not args:cursor.execute(sql)else:cursor.execute(sql, args)record = cursor.fetchone()self.db_close(conn, cursor)return recorddef fetch_all(self, sql, args):conn, cursor = self.db_conncursor.execute(sql, args)record_list = cursor.fetchall()self.db_close(conn, cursor)return record_listdef insert(self, sql, args):conn, cursor = self.db_connrow = 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.pyimport sqlite3db = 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 requests
r =requests.get('http://img.chebiaow.com/thumb/cb/allimg/1303/1-1303061Z600520,c_fill,h_138,w_160.jpg')
r.content
b'\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 base64
f=open('723.png','rb') #二进制方式打开图文件
ls_f=base64.b64encode(f.read()) #读取文件内容,转换为base64编码
f.close()
print(ls_f)
  1. base64字符串转化为图片

import base64
bs='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代码:

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

Flask后台代码:

from flask import Flask, render_template
import base64
import requestsapp = 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.pyfrom flask import Flask, render_template, g
import sqlite3
import random
import base64app = Flask(__name__)
DATABASE = 'static/db/car.db'
app.secret_key = 'Breeze Python'def connect_db():return sqlite3.connect(DATABASE)@app.before_request
def before_request():g.db = connect_db()@app.teardown_request
def 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打造实时截图识别OCR

Python+Matplotlib 制作排序算法的动画

Python项目:让你的文字会说话

利用Python开发智能阅卷系统

Scrapy 爬取二手房信息,进行可视化数据分析

END

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_727096.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jiathis:社交化数据分析 帮助网站提高流量

随着微博的兴起&#xff0c;社会化营销逐渐走进我们的生活&#xff0c;不管是杜蕾斯微博事件还是最近在小米大战360&#xff0c;都是在社会化平台上面进行&#xff0c;而 如何方便的将网站内 容分享至社会化媒体&#xff0c;&#xff0c;大部分博主会选择工具&#xff0c;但选择…

珍藏已久的OS学习网站,拿出来分享给大家!

平常经常看推荐各种资源教程的&#xff0c;感觉有很多文章稂莠不齐&#xff0c;这次我来推荐点硬核的网站&#xff0c;包你有收获。一般很少有人推荐操作系统的网站吧。。。。。。这几个网站来源于我平常的学习总结&#xff0c;也有一些是来源于网上优秀的回答&#xff0c;希望…

哪个云服务器网站不用备案,有不需要备案的云服务器

有不需要备案的云服务器 内容精选换一换不想看文字&#xff0c;请直接戳视频链接。可以不做备案吗&#xff1f;根据《互联网信息服务管理办法》等相关规定&#xff0c;使用中国大陆节点服务器开办的网站&#xff0c;必须先办理网站备案&#xff0c;备案成功并获取通信管理局下发…

吴翰清澄清:从没黑过阿里网站!

前几日吴翰清辟谣网络传闻的“黑入阿里网站”、“马云下死命令留他”、“500万年薪”等信息&#xff0c;称这些均是假新闻。吴翰清微博全文&#xff1a;“这是个假新闻&#xff01;请不要再消费我和阿里来赚流量了。我再澄清一次&#xff1a;1、我从没黑过阿里网站。2、宣传黑客…

idea 一直索引_长宁区360SEO优化服务,搜索引擎优化_上海持硕信息技术有限公司...

首页 > 新闻中心发布时间&#xff1a;2020-11-01 02:58:47 导读&#xff1a;上海持硕信息技术有限公司为您提供长宁区360SEO优化服务,搜索引擎优化的相关知识与详情&#xff1a; 在你的栏目页拥有较多的内容页时&#xff0c;就应该考虑相关推荐和指引性的链接导向&#xff0…

三年前红遍众筹网站,这款出自MIT的家庭机器人终于开卖了

本文来自AI新媒体量子位&#xff08;QbitAI&#xff09;图里这个产品你大概见过&#xff0c;但想不起来它的名字。 它是一个“家用社交机器人”&#xff0c;名叫Jibo&#xff0c;有黑白两色。现在说来&#xff0c;它的功能似乎和巨头标配的智能音箱有点重叠&#xff1a;能够作为…

建立网站需要什么条件_建立网站时需要了解的网站建设知识

网站建设的重点是最重要的。 根据不同客户的需求&#xff0c;此重要性具有不同的定义。 但是对于人们的直观定位而言&#xff0c;页面的美观度是一个不可忽视的重要因素。 网页设计彰显创造力。 许多人追求目标。 网页设计确实是网站建设中非常重要的一点&#xff0c;也是人们看…

python获取网站信息_关于python模拟登陆抓取网站信息

我想用requests实现在www.lu.com模拟登陆后抓取一些产品信息&#xff0c;通过chrome的抓包工具我抓到了登陆时的form data和header(变量header)&#xff0c;以及访问需要抓取的页面时的header(变量listheader),但运行完程序后我输入r.url发现返回的地址是https://list.lu.com/n…

怎么避免后台被搜索_企业网站seo关键词优化怎么做?

关键词没有排名一切皆无。企业网站seo关键词优化到位一切皆有&#xff0c;怎么做好企业网站的关键词排名是困扰大部分seo从业者的问题。搜索引擎是一套程序&#xff0c;会按照程序的设定来判断一个网站的排序结果&#xff0c;从这个角度来讲&#xff0c;任何网站的优化点都是一…

python隐藏手机号码程序_Python网站手机号码解密的一种方法

黄页88网站反爬措施对手机号进行了一些加密处理。这里介绍一下怎么解密手机号码的方法。首先&#xff0c;我们看一下网站显示的手机号是这样的&#xff1a;显示的手机号使用ctrl c复制粘贴后变成了这样&#xff1a;复制后的手机号码而实际上&#xff0c;用Python爬虫获取到的内…

为什么大型网站前端使用PHP,后台逻辑却用Java?

来自&#xff1a;知乎链接&#xff1a;https://www.zhihu.com/question/20314377黄良懿&#xff0c;做做架构&#xff0c;写写代码前两周参加完 ThinkInLamp 的 PHP 架构师大会&#xff0c;听鸟哥一上午的分享&#xff0c;感慨很多&#xff0c;PHP 业界虽然方向不明荒废了两三年…

作为程序员,我都逛了哪些技术网站?(收藏篇)

一、在线教程首先列出一些在线教程网站&#xff0c;这些在线教程网站通常都比较适合入门&#xff0c;可以作为开发学习路上的第一个阶梯&#xff0c;也可以作为工作中的在线文档。1、菜鸟教程地 址&#xff1a;https://www.runoob.com/简 介&#xff1a;在线教程网站&#xff0…

九度搜索引擎点击优化_企业网站为什么要做SEO优化

点击上方“蓝字”&#xff0c;发现更多精彩~~~随着互联网的发展&#xff0c;企业都意识到了网络营销的前景是多么广大&#xff0c;都想从中赚取高额的利润。想要做出名堂来就需要你的网站被搜索引擎所收录&#xff0c;也只有被收录后才有可能被用户看到你的网站&#xff0c;来的…

网站翻译功能

功能分两块&#xff1a;1、获取页面上要翻译的内容&#xff1b; 2、将内容从自定义的资源包中匹配&#xff1b; 我的网站翻译就是在创建html页面的时候&#xff0c;重写其中的一个方法&#xff0c; 第一步&#xff1a;获取页面上要翻译的内容&#xff1a; 在MVC中由这么一个类&…

CDN网站加速的工作流程

2019独角兽企业重金招聘Python工程师标准>>> CDN的全称是Content Delivery Network&#xff0c;即内容分发网络。 CDN的通俗理解就是网站加速&#xff0c;CPU负载均衡&#xff0c;可以解决跨运营商&#xff0c;跨地区&#xff0c;服务器负载能力过低&#xff0c;带宽…

常用网站攻击方式

2019独角兽企业重金招聘Python工程师标准>>> 常用网站攻击方式 需要积累 转载于:https://my.oschina.net/u/3697586/blog/1934239

SEO手册:外链建设,必备的四大要素!

我们知道外链&#xff0c;也许并不是SEO的全部&#xff0c;但通过链接&#xff0c;搜索引擎可以很好的统计目标网站链接的数量以及权威度&#xff0c;从而进一步判断&#xff0c;目标页面针对特定关键词&#xff0c;在搜索结果中的合理位置。同时&#xff0c;它也是每次百度算法…

网站部署到域名

2019独角兽企业重金招聘Python工程师标准>>> 在服务伤处买一个域名&#xff0c;在自己的服务器部署好项目&#xff0c;把域名解析到自己的服务器的IP&#xff0c; 配置nginx.conf server { listen 80; server_name www.XXX.com location / { proxy_pass http://IP:…

struts2架构网站漏洞修复详情与利用漏洞修复方案

2019独角兽企业重金招聘Python工程师标准>>> struts2从开发出来到现在&#xff0c;很多互联网企业&#xff0c;公司&#xff0c;平台都在使用apache struts2系统来开发网站&#xff0c;以及应用系统&#xff0c;这几年来因为使用较多&#xff0c;被攻击者挖掘出来的…

[Python]自动、使用镜像网站自动和手动安装Numpy

[Python]自动、使用镜像网站自动和手动安装Numpy直接安装numpy模块使用镜像网站安装numpy自行下载numpy之后安装使用pycharm自动安装直接安装numpy模块 在cmd输入直接pip install numpy 若出现报错&#xff1a;ou are using pip version 18.1, however version 20.2.2 is avai…