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

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

文化不分边界

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

车标网

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

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性