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

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

文化不分边界

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

车标网

在网上找了半天车标的数据,最后看到了这个网站:车标网: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/274397

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

MyBatis-plus处理存储json数据过程

《MyBatis-plus处理存储json数据过程》文章介绍MyBatis-Plus3.4.21处理对象与集合的差异:对象可用内置Handler配合autoResultMap,集合需自定义处理器继承F... 目录1、如果是对象2、如果需要转换的是List集合总结对象和集合分两种情况处理,目前我用的MP的版本

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php