爬取车标网图片与数据,以后不要说这什么车你不认识了!#华为云·寻找黑马程序员#

本文主要是介绍爬取车标网图片与数据,以后不要说这什么车你不认识了!#华为云·寻找黑马程序员#,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文化不分边界

人,为什么要读书?举个例子:
当看到天边飞鸟,你会说:“落霞与孤鹜齐飞,秋水共长天一色。”而不是:“卧靠,好多鸟。”;
当你失恋时你低吟浅唱道:“人生若只如初见,何事秋风悲画扇。”而不是千万遍地悲喊:“蓝瘦,香菇!”
今天回家早,陪俩小爷在楼下遛弯,忽然听见一阵马达轰鸣声,嗖~~闪一辆跑车,大大问;“爸爸,这是什么车啊”我:“红色的车…”,小小说:“爸爸肯定不认识,我也知道是红色的车。”气氛有些冷场…
别人看车关注牌子,我看车关注宽敞不,睡着舒服不?可不管怎样不能在孩子面前丢份啊,我决定学习学习车标!

车标网

在网上找了半天车标的数据,最后看到了这个网站:车标网:http://www.chebiaow.com/logo。
车标网
网站将车系按照字母从A-Z进行了排序,然后点击每个车标进入详细信息,那Audi做例子:
奥迪
有用的数据时那些?品牌名称,车标,成立时间,主要车型,官网…
那么今天的爬虫练习呼之欲出,获取车标网下所有的汽车品牌及车标,并入库保存…

数据库操作指南

针对简单的数据,我习惯用python自带的sqlite3进行数据库的存储,简单方便…那么如何管理我们的数据库呢?推荐使用DBUtils!在往期的文章
决战高考,帮你秒变成语之王中,有对DBUtils的详细介绍,这里就不再赘述了…
但本次有一个知识点,我们需要将车标图片,存储在数据库中,那么如何在数据库中存储图片,使用类型BLOB。举一个简单的数据库图片读写例子

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/7/22 23:00
# @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是否正常:
1.jpg

图片下载小技巧

看过了二进制的存储方式,大家肯定说明白了,网站获取到图片链接然后找着上面的例子下载到本地,然后再进行二进制的读取后存储数据库即可,对吗?不对…有什么问题呢?来看一个例子:
Audi图片链接
这里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就已经是二进制数据了,为何还要存储成图片,在转化呢?省去了我们保存图片的多余过程。

网页分析
适配url

针对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即可。

品牌详情

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

整体代码

通过上面的分析,我们开始爬虫,但这个网站真的是相应好慢,没办法添加上Threading的多线程执行吧,整体代码如下:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/7/22 23:08
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : CarLogo.pyimport os
from db_maker import DbMaker as DB
from string import ascii_uppercase as au
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
from sqlite3 import Binary
import threading
import timeclass CarLogo:DATABASE = 'car.db'def __init__(self):self.db = DB()self.path = os.path.dirname(os.path.realpath(__file__))self.images_path = os.path.join(self.path, 'images_path')self.host = "http://www.chebiaow.com"self.headers = {'Connection': 'keep-alive','user-agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ''(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')}def check_dir(self):if not os.path.exists(self.images_path):os.mkdir(self.images_path)def get_response(self, url, params=None):try:r = requests.get(url, headers=self.headers, params=params, timeout=15)except:passsoup = BeautifulSoup(r.text, "lxml")return soupdef create_url(self):_url_format = "http://www.chebiaow.com/logo/{}.html"for uppercase in au:try:soup = self.get_response(_url_format.format(uppercase))_cars = soup.find("ul", {"class": "cb-list"}).findAll('li')for car in _cars:# self.car_info()t = threading.Thread(target=self.car_info, args=(urljoin(self.host, car.div.a['href']),))time.sleep(0.5)t.start()except:passdef car_info(self, url):soup = self.get_response(url)left_index = soup.find("div", {"class": "xq-left"}).findAll('p')name = left_index[0].textimage_byte = requests.get(left_index[1].img['src']).contentright_index = soup.find("ul", {"class": "xq-right"}).findAll('li')founded = right_index[3].span.textmodels = right_index[5].span.textwebsite = right_index[7].span.textprint("Insert Car Logo {}".format(name))_sql = "insert into car_logo(name,image,founded,models,website) values (?,?,?,?,?)"self.db.insert(_sql, (name, Binary(image_byte), founded, models, website))if __name__ == '__main__':m = CarLogo()m.create_url()

最终存储的数据库如下:

数据库展示
由于图片是BLOB类型的二进制文件,所以大家看到的是星星,感觉网站的车标是不不够,怎么才140多种(虽然我能认识的不到20种…)
这个中兴看了半天还以为是搞错了,没想到是同名的…
中兴汽车

The End

OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。
整理好数据库,哪天闲了做一个车标的测试题,当然大家可以按照之前我的使用爬虫+Flask获取世界国旗数据和孩子一起学习那边文章引申着自己写一个车标的练习题。
公众号后台回复车标,即可获得整理好的数据库,供大家联系使用。
期待你关注我的公众号**清风Python**,如果你觉得不错,希望能动动手指转发给你身边的朋友们。

这篇关于爬取车标网图片与数据,以后不要说这什么车你不认识了!#华为云·寻找黑马程序员#的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583892

相关文章

随想录 Day 69 并查集 107. 寻找存在的路径

随想录 Day 69 并查集 107. 寻找存在的路径 理论基础 int n = 1005; // n根据题目中节点数量而定,一般比节点数量大一点就好vector<int> father = vector<int> (n, 0); // C++里的一种数组结构// 并查集初始化void init() {for (int i = 0; i < n; ++i) {father[i] = i;}

JAVA读取MongoDB中的二进制图片并显示在页面上

1:Jsp页面: <td><img src="${ctx}/mongoImg/show"></td> 2:xml配置: <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001

【服务器运维】MySQL数据存储至数据盘

查看磁盘及分区 [root@MySQL tmp]# fdisk -lDisk /dev/sda: 21.5 GB, 21474836480 bytes255 heads, 63 sectors/track, 2610 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytesSector size (logical/physical)

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

【新闻】AI程序员要来了吗?阿里云官宣

内容提要 6 月 21 日,在阿里云上海 AI 峰会上,阿里云宣布推出首个AI 程序员。 据介绍,这个AI程序员具备架构师、开发工程师、测试工程师等多种岗位的技能,能一站式自主完成任务分解、代码编写、测试、问题修复、代码提交整个过程,最快分钟级即可完成应用开发,大幅提升研发效率。 近段时间以来,有关AI的实践应用突破不断,全球开发者加速研发步伐。有业内人士坦言,随着大模型性能逐渐提升,AI应

在服务器上浏览图片

@StarSky 2018-10-26 15:09 字数 15971 阅读 28 https://www.zybuluo.com/StarSky/note/1294871 来源 2018-09-27 线上服务器安装 imgcat Tool   2018-09-27 线上服务器安装 imgcat 0. 准备文件:iterm2_shell_integration.bash1. 在有权限

数据时代的数字企业

1.写在前面 讨论数据治理在数字企业中的影响和必要性,并介绍数据治理的核心内容和实践方法。作者强调了数据质量、数据安全、数据隐私和数据合规等方面是数据治理的核心内容,并介绍了具体的实践措施和案例分析。企业需要重视这些方面以实现数字化转型和业务增长。 数字化转型行业小伙伴可以加入我的星球,初衷成为各位数字化转型参考库,星球内容每周更新 个人工作经验资料全部放在这里,包含数据治理、数据要

如何在Java中处理JSON数据?

如何在Java中处理JSON数据? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨在Java中如何处理JSON数据。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,在现代应用程序中被广泛使用。Java通过多种库和API提供了处理JSON的能力,我们将深入了解其用法和最佳

华为---OSPF的DR与BDR(六)

9.6 OSPF的DR与BDR 9.6.1 原理概述 在OSPF的广播类型网络和NBMA类型网络中,如果网络中有n台路由器,若任意两台路由器之间都要建立邻接关系,则需要建立n×(n-1)/2个邻接关系,即当路由器很多时,则需要建立和维护的邻接关系就很多,两两之间需要发送的报文也就很多,这会造成很多内容重复的报文在网络中传递,浪费了设备的带宽资源。因此在广播和NBMA类型网络中,OSPF协议定义

两个基因相关性CPTAC蛋白组数据

目录 蛋白数据下载 ①蛋白数据下载 1,TCGA-选择泛癌数据  2,TCGA-TCPA 3,CPTAC(非TCGA) ②蛋白相关性分析 1,数据整理 2,蛋白相关性分析 PCAS在线分析 蛋白数据下载 CPTAC蛋白组学数据库介绍及数据下载分析 – 王进的个人网站 (jingege.wang) ①蛋白数据下载 可以下载泛癌蛋白数据:UCSC Xena (xena