知識不分邊界......
人,為什么要讀書?舉個例子:
當看到天邊飛鳥,你會說:“落霞與孤鶩齊飛,秋水共長天一色。”而不是:“卧靠,好多鳥。”;
當你失戀時你低吟淺唱道:“人生若只如初見,何事秋風悲畫扇。”而不是千萬遍地悲喊:“藍瘦,香菇!”
今天回家早,陪倆小爺在樓下遛彎,忽然聽見一陣馬達轟鳴聲,嗖~~閃一輛跑車,大大問;“爸爸,這是什么車啊?” 我:“紅色的車…”小小說:“爸爸肯定不認識,我也知道是紅色的車。”氣氛有些冷場…
別人看車關注牌子,我看車關注寬敞不,睡着舒服不?可不管怎樣不能在孩子面前丟份啊,我決定學習學習車標!
車標網
在網上找了半天車標的數據,最后看到了這個網站:車標網: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.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是否正常:

圖片下載小技巧
看過了二進制的存儲方式,大家肯定說明白了,網站獲取到圖片鏈接然后找着上面的例子下載到本地,然后再進行二進制的讀取后存儲數據庫即可,對嗎?不對…有什么問題呢?來看一個例子:

這里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.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()
最終存儲的數據庫如下:

由於圖片是BLOB類型的二進制文件,所以大家看到的是星星,感覺網站的車標是不不夠,怎么才140多種(雖然我能認識的不到20種…)
這個中興看了半天還以為是搞錯了,沒想到是同名的…

OK,今天的內容就到這里,整理好數據庫,哪天閑了做一個車標的測試題,當然大家可以按照之前我的使用爬蟲+Flask獲取世界國旗數據和孩子一起學習那邊文章引申着自己寫一個車標的練習題。
