python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...

知识不分边界......

人,为什么要读书?举个例子:

当看到天边飞鸟,你会说:“落霞与孤鹜齐飞,秋水共长天一色。”而不是:“卧靠,好多鸟。”;

当你失恋时你低吟浅唱道:“人生若只如初见,何事秋风悲画扇。”而不是千万遍地悲喊:“蓝瘦,香菇!”

今天回家早,陪俩小爷在楼下遛弯,忽然听见一阵马达轰鸣声,嗖~~闪一辆跑车,大大问;“爸爸,这是什么车啊?” 我:“红色的车…”小小说:“爸爸肯定不认识,我也知道是红色的车。”气氛有些冷场…

别人看车关注牌子,我看车关注宽敞不,睡着舒服不?可不管怎样不能在孩子面前丢份啊,我决定学习学习车标!

车标网

1cc3fa1f8056b9a1ebdb40912c0fd94f.png

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

419574fb7007b7933c4cbdec65226626.png

有用的数据是哪些?品牌名称,车标,成立时间,主要车型,官网…

那么今天的爬虫练习呼之欲出,获取车标网下所有的汽车品牌及车标,并入库保存…

数据库操作指南

针对简单的数据,我习惯用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.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是否正常:

6cfecd33fb49dde9f77038154ca9c56a.png

图片下载小技巧

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

f6f04e7fc105969f24e478c7755abd28.png

这里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)

获取品牌链接

637382115ed24663761055e7365dad9b.png

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

品牌详情

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

69ca5dc7f878b59a41cf12aa2ca9d4f6.png

整体代码

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

# -*- coding: utf-8 -*-

# @Author : 王翔

# @JianShu : 清风Python

# @Date : 2019/7/22 23:08

# @Software : PyCharm

# @version :Python 3.7.3

# @File : CarLogo.py

import 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 time

class 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:

pass

soup = BeautifulSoup(r.text, "lxml")

return soup

def 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:

pass

def car_info(self, url):

soup = self.get_response(url)

left_index = soup.find("div", {"class": "xq-left"}).findAll('p')

name = left_index[0].text

image_byte = requests.get(left_index[1].img['src']).content

right_index = soup.find("ul", {"class": "xq-right"}).findAll('li')

founded = right_index[3].span.text

models = right_index[5].span.text

website = right_index[7].span.text

print("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()

最终存储的数据库如下:

eb862656621e0f6f1db8c3cd9f8fe39f.png

由于图片是BLOB类型的二进制文件,所以大家看到的是星星,感觉网站的车标是不不够,怎么才140多种(虽然我能认识的不到20种…)

这个中兴看了半天还以为是搞错了,没想到是同名的…

1cdde6648888ad4627712451bc2af389.png

OK,今天的内容就到这里,整理好数据库,哪天闲了做一个车标的测试题,当然大家可以按照之前我的使用爬虫+Flask获取世界国旗数据和孩子一起学习那边文章引申着自己写一个车标的练习题。

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

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

相关文章

电化学仿真的基础知识笔记

1 概述 电化学反应是一种特殊的化学反应,其能量转移形式为化学能和电能之间互相转换。根据能量转换方向,可分为两类: 原电池(Galvanic cells):将化学能转化为电能,对外放电电解槽(…

mysql以秒为单位限制资源_MYSQL中限制资源的使用

今天看到手册,不小心看到了这里,自己做了几个例子。从MYSQL4.x开始,MYSQL就增加了以每个用户为基础,限制MYSQL服务器的资源利用。自己查看MYSQL.USER 表就会发现里面最后几个字段:mysql> select version();--------…

漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析

From: http://blog.csdn.net/touch_2011/article/details/6767673 1、序言 这是《漫谈经典排序算法系列》第一篇,该篇从最简单的选择排序算法谈起,由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排序的本质及其基本思想。 各种排序算…

React开发(168):...dva调用不成功的原因

注意三对三对应关系 否则无法调用成功

深入react技术栈(2):JSX语法

JSX的由来 DOM元素 组件元素 JSX基本语法 XML基本语法 元素类型 、我们讲到两种不同的元素:DOM元素和组件元素 在JSX里面有对应 注释 元素属性 Boolean属性 展开属性 自定义属性 javascript属性表达式 属性值使用表达式 用{}表示 HTML转义 文章参考深入react学习技术栈

深入react技术栈(3):React组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 终于说出最为关心的react组件了。在react形成之前,组件封装都是在摸索之中 组件的演变 class定义组件的样式 这样可以方便的定义class前缀 一达到定义一系列主题的意义 初始化过程十分简洁 实例化传入几个参数给…

深入react技术栈(4):React数据流

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 state props 子组件props 组件props function prop 与父组件通信 propTypes 文章参考深入react学习技术栈

学会用taro封装一个组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识 前言 大家好 我是歌谣 今天要说得是用taro封装一个组件 核心是学会弹性布局 直接上代码 组件部分 子组件 import Taro, { Component } from "tarojs/taro"; import { Text, View, Image…

java druid sqlite_springboot整合druid抛出dbType not support : sqlite异常

最近在搞springboot,将springboot和mybaits整合后没一点毛病,但想自己弄个sql监控,就准备使用阿里的druid来做连接池,毕竟是国产又是大厂出品,号称最牛X的连接池。整合过程就不说了,百度上大把的&#xff0…

深入react技术栈(6):React和DOM

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 React DoM findDoMNode render React得不稳定方法 Refs React之外得DoM操作 文章参考深入React技术栈

Firefox无法启动,提示Profile is yet in use by another Firefox

From: http://hi.baidu.com/nxhujiee/blog/item/e997ba356c837896a71e1224.html 由于突然断电导致电脑非正常关机,重启之后发现Firefox无法启动,提示Profile is yet in use by another Firefox 经过在网上搜索,发现了解决办法 确认没有firefo…

深入react技术栈(5):React生命周期

我是歌谣 放弃很容易 但是坚持一定很酷 微信搜一搜前端小歌谣 React生命周期 挂载和卸载过程 组件得挂载 组件得卸载 数据更新过程 整体流程 文章参考深入学习React技术栈

戴尔看好Ubuntu超越Windows的十个优势

戴尔近日总在对比Linux开源系统(主要是Ubuntu)与Windows的功能,列举了Ubuntu比 Windows的独特之处,例如,预装了免费办公软件OpenOffice,启动速度快,可以获取1000多款免费软件等。当然了&#xf…

深入react技术栈(7):组件化实例:Tab栏组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 文章参考深入React技术栈

记一次曲折的jsp手工半盲注入

作者:YoCo Smart 来自:习科信息技术 ***作战营 ::{ Silic Group Hacker Army }:: site:http://blackbap.org 前些日子(似乎很久很久以前),小X在群里发了一个太平洋汽车网站的注入,jsp的,安敏似乎…

Linux目录结构介绍-http://yangrong.blog.51cto.com/6945369/1288072

1、树状目录结构图 2、/目录 目录 描述 / 第一层次结构的根、整个文件系统层次结构的根目录。 /bin/ 需要在单用户模式可用的必要命令(可执行文件);面向所有用户,例如:cat、ls、cp,和/usr/bin类似。 …