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

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

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

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

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

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

车标网

在网上找了半天车标的数据,最后看到了这个网站:车标网:http://www.chebiaow.com/logo。

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

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

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

数据库操作指南

针对简单的数据,我习惯用python自带的sqlite3进行数据库的存储,简单方便….那么如何管理我们的数据库呢?推荐使用DBUtils!在往期的文章

决战高考,帮你秒变成语之王中,有对DBUtils的详细介绍,这里就不再赘述了…

但本次有一个知识点,我们需要将车标图片,存储在数据库中,那么如何在数据库中存储图片,使用类型BLOB。举一个简单的数据库图片读写例子

  1. # -*- coding: utf-8 -*-
  2. # @Author : 王翔
  3. # @JianShu : 清风Python
  4. # @Date : 2019/7/22 23:00
  5. # @Software : PyCharm
  6. # @version :Python 3.7.3
  7. # @File : show.py
  8. import sqlite3
  9. db = sqlite3.connect('Car.db')
  10. cur = db.cursor()
  11. cur.execute("CREATE TABLE if not exists image_save (image BLOB);")
  12. with open('Audi.jpg', 'rb') as f:
  13. cur.execute("insert into image_save values(?)", (sqlite3.Binary(f.read()),))
  14. db.commit()
  15. cur.execute('select image from image_save limit 1')
  16. b = cur.fetchone()[0]
  17. with open('1.jpg', 'wb') as f:
  18. f.write(b)

我们创建一个image_save的测试表,然后将图片读取为二进制字节的方式,通过sqlite3.Binary将二进制文件存储至数据库。

那么同样的,我们将BLOB类型的图片读取出来后,进行写入,即可达到效果,来看看这个1.jpg是否正常:

图片下载小技巧

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

这里Audi图片的链接地址,我们通过requests来下载看看….

  1. import requests
  2. r =requests.get('http://img.chebiaow.com/thumb/cb/allimg/1303/1-1303061Z600520,c_fill,h_138,w_160.jpg')
  3. r.content
  4. b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01...'

可以看到我们通过requests.get获取到的content就已经是二进制数据了,为何还要存储成图片,在转化呢?网页分析

适配url

针对A-Z的车标排序,网站的url匹配关系很简单:

  1. from string import ascii_uppercase as au
  2. # ascii_uppercase代表A-Z,当然你可以不引入模块自己生成也OK...
  3. for uppercase in au:
  4. "http://www.chebiaow.com/logo/{}.html".format(au)

获取品牌链接

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

品牌详情

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

整体代码

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

  1. # -*- coding: utf-8 -*-
  2. # @Author : 王翔
  3. # @JianShu : 清风Python
  4. # @Date : 2019/7/22 23:08
  5. # @Software : PyCharm
  6. # @version :Python 3.7.3
  7. # @File : CarLogo.py
  8. import os
  9. from db_maker import DbMaker as DB
  10. from string import ascii_uppercase as au
  11. import requests
  12. from bs4 import BeautifulSoup
  13. from urllib.parse import urljoin
  14. from sqlite3 import Binary
  15. import threading
  16. import time
  17. class CarLogo:
  18. DATABASE = 'car.db'
  19.  
  20. def __init__(self):
  21. self.db = DB()
  22. self.path = os.path.dirname(os.path.realpath(__file__))
  23. self.images_path = os.path.join(self.path, 'images_path')
  24. self.host = "http://www.chebiaow.com"
  25. self.headers = {
  26. 'Connection': 'keep-alive',
  27. 'user-agent': ('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 '
  28. '(KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36')
  29. }
  30.  
  31. def check_dir(self):
  32. if not os.path.exists(self.images_path):
  33. os.mkdir(self.images_path)
  34.  
  35. def get_response(self, url, params=None):
  36. try:
  37. r = requests.get(url, headers=self.headers, params=params, timeout=15)
  38. except:
  39. pass
  40. soup = BeautifulSoup(r.text, "lxml")
  41. return soup
  42.  
  43. def create_url(self):
  44. _url_format = "http://www.chebiaow.com/logo/{}.html"
  45. for uppercase in au:
  46. try:
  47. soup = self.get_response(_url_format.format(uppercase))
  48. _cars = soup.find("ul", {"class": "cb-list"}).findAll('li')
  49. for car in _cars:
  50. # self.car_info()
  51. t = threading.Thread(target=self.car_info, args=(urljoin(self.host, car.div.a['href']),))
  52. time.sleep(0.5)
  53. t.start()
  54. except:
  55. pass
  56.  
  57. def car_info(self, url):
  58. soup = self.get_response(url)
  59. left_index = soup.find("div", {"class": "xq-left"}).findAll('p')
  60. name = left_index[0].text
  61. image_byte = requests.get(left_index[1].img['src']).content
  62. right_index = soup.find("ul", {"class": "xq-right"}).findAll('li')
  63. founded = right_index[3].span.text
  64. models = right_index[5].span.text
  65. website = right_index[7].span.text
  66. print("Insert Car Logo {}".format(name))
  67. _sql = "insert into car_logo(name,image,founded,models,website) values (?,?,?,?,?)"
  68. self.db.insert(_sql, (name, Binary(image_byte), founded, models, website))
  69. if __name__ == '__main__':
  70. m = CarLogo()
  71. m.create_url()

最终存储的数据库如下:

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

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

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

点击关注,第一时间了解华为云新鲜技术~

Python快速爬取车标网图片,以后不要说这什么车你不认识了!的更多相关文章

  1. 使用Python爬虫爬取网络美女图片

    代码地址如下:http://www.demodashi.com/demo/13500.html 准备工作 安装python3.6 略 安装requests库(用于请求静态页面) pip install ...

  2. Python爬虫爬取全书网小说,程序源码+程序详细分析

    Python爬虫爬取全书网小说教程 第一步:打开谷歌浏览器,搜索全书网,然后再点击你想下载的小说,进入图一页面后点击F12选择Network,如果没有内容按F5刷新一下 点击Network之后出现如下 ...

  3. python爬虫——爬取NUS-WIDE数据库图片

    实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm   由于这个数据只给了每个图片的URL,所以需 ...

  4. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...

  5. [Python] 快速爬取当前城市所有租房网站房源及配置,一目了然

    Python爬取当前城市房源信息,以徐州为例代码效果图请看下方,其他部分请查看附件,一起学习,谢谢 # -*- coding: utf-8 -*- """ @Time : ...

  6. Python爬虫爬取彼岸网4K Picture

    深夜爬取4k图片 下载流程 定义page_text函数,对第一页地址发送get请求,因为页面数据在页面源代码都能查到,所以发送get 请求就ok!,注意:要进行编码格式设置,可以去源代码查看, 定义p ...

  7. python爬虫爬取赶集网数据

    一.创建项目 scrapy startproject putu 二.创建spider文件 scrapy genspider  patubole patubole.com   三.利用chrome浏览器 ...

  8. Python 爬虫: 抓取花瓣网图片

    接触Python也好长时间了,一直没什么机会使用,没有机会那就自己创造机会!呐,就先从爬虫开始吧,抓点美女图片下来. 废话不多说了,讲讲我是怎么做的. 1. 分析网站 想要下载图片,只要知道图片的地址 ...

  9. Python爬虫 爬取百合网的女人们和男人们

    学Python也有段时间了,目前学到了Python的类.个人感觉Python的类不应称之为类,而应称之为数据类型,只是数据类型而已!只是数据类型而已!只是数据类型而已!重要的事情说三篇. 据书上说一个 ...

  10. .Net Core爬虫爬取妹子网图片

    现在网上大把的Python的爬虫教程,很少看见有用C#写的,正好新出的.Net Core可以很方便的部署到Linux上,就用妹子图做示范写个小爬虫 在C#下有个很方便的类库 HtmlAgilityPa ...

随机推荐

  1. Decorator 装饰者模式简介与 C# 示例【结构型4】【设计模式来了_9】

    〇.简介 1.什么是装饰者模式 一句话解释:   通过继承统一的抽象类来新增操作,再在使用时通过链式添加到对象中,达到与原有设定无关联可灵活附加. 装饰者模式是一种行为设计模式,它允许向一个现有的对象 ...

  2. 关于AI时代的程序架构的变化

    以ChatGPT为代表的AI出现,表示着AI的零点时刻已经突破.现在AI的使用已经不用再多说了,实际上是已经侵入到各行各业.所有人都在疯狂寻找本行业AI的使用场景,这样的盛景只在互联网刚出现的时候能感 ...

  3. H5-geolocation学习

    geolocation--定位 PC--IP地址 精度比较低 IP库 Chrome -> Google 手机--GPS window.navigator.geolocation 单次 getCu ...

  4. ES6和node模块化

    node模块化: 1.输出:exports.a=12; 或者module.exports={ a:12, b:5 } 2.引入:require('./a.js'); 3.引用自定义模块 放到node_ ...

  5. Go 常用标准库之 fmt 介绍与基本使用

    Go 常用标准库之 fmt 介绍与基本使用 目录 Go 常用标准库之 fmt 介绍与基本使用 一.介绍 二.向外输出 2.1 Print 系列 2.2 Fprint 系列 2.3 Sprint 系列 ...

  6. 深度解读MediaBox SDKs如何实现技术架构升级

    本专栏将分享阿里云视频云MediaBox系列技术文章,深度剖析音视频开发利器的技术架构.技术性能.开发能效和最佳实践,一起开启音视频的开发之旅.本文为MediaBox技术架构篇,重点从音视频终端SDK ...

  7. SpringBoot 项目优雅实现读写分离

    一.读写分离介绍 当使用Spring Boot开发数据库应用时,读写分离是一种常见的优化策略.读写分离将读操作和写操作分别分配给不同的数据库实例,以提高系统的吞吐量和性能. 读写分离实现主要是通过动态 ...

  8. Verilog HDL数据流建模与运算符

    数据流建模使用的连续赋值语句由关键词assign开始,一般用法如下: wire [位宽说明]变量名1, 变量名2, ..., 变量名n; assign 变量名 = 表达式; 只要等号右边的值发生变化, ...

  9. P1029 最大公约数和最小公倍数问题(普及−) 题解

    题目传送门 想要做这题,我们要先了解一下最大公约数. 最大公因数,也称最大公约数.最大公因子,指两个或多 个整数共有约数中最大的一个.a,b的最大公约数记为 (a,b),同样的,a,b,c的最大公约数 ...

  10. 【Javaweb】Servlet三|实现Servlet程序的几种方法及Servlet继承体系说明

    GET和POST请求的分发处理 代码如下 注意页面要和index位置一样否则浏览器找不到 注意大小写 HttpServletRequest httpServletRequest = (HttpServ ...