python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...
知識(shí)不分邊界......
人,為什么要讀書(shū)?舉個(gè)例子:
當(dāng)看到天邊飛鳥(niǎo),你會(huì)說(shuō):“落霞與孤鶩齊飛,秋水共長(zhǎng)天一色。”而不是:“臥靠,好多鳥(niǎo)。”;
當(dāng)你失戀時(shí)你低吟淺唱道:“人生若只如初見(jiàn),何事秋風(fēng)悲畫(huà)扇。”而不是千萬(wàn)遍地悲喊:“藍(lán)瘦,香菇!”
今天回家早,陪倆小爺在樓下遛彎,忽然聽(tīng)見(jiàn)一陣馬達(dá)轟鳴聲,嗖~~閃一輛跑車(chē),大大問(wèn);“爸爸,這是什么車(chē)啊?” 我:“紅色的車(chē)…”小小說(shuō):“爸爸肯定不認(rèn)識(shí),我也知道是紅色的車(chē)。”氣氛有些冷場(chǎng)…
別人看車(chē)關(guān)注牌子,我看車(chē)關(guān)注寬敞不,睡著舒服不?可不管怎樣不能在孩子面前丟份啊,我決定學(xué)習(xí)學(xué)習(xí)車(chē)標(biāo)!
車(chē)標(biāo)網(wǎng)
網(wǎng)站將車(chē)系按照字母從A-Z進(jìn)行了排序,然后點(diǎn)擊每個(gè)車(chē)標(biāo)進(jìn)入詳細(xì)信息,那Audi做例子:
有用的數(shù)據(jù)是哪些?品牌名稱(chēng),車(chē)標(biāo),成立時(shí)間,主要車(chē)型,官網(wǎng)…
那么今天的爬蟲(chóng)練習(xí)呼之欲出,獲取車(chē)標(biāo)網(wǎng)下所有的汽車(chē)品牌及車(chē)標(biāo),并入庫(kù)保存…
數(shù)據(jù)庫(kù)操作指南
針對(duì)簡(jiǎn)單的數(shù)據(jù),我習(xí)慣用python自帶的sqlite3進(jìn)行數(shù)據(jù)庫(kù)的存儲(chǔ),簡(jiǎn)單方便….那么如何管理我們的數(shù)據(jù)庫(kù)呢?推薦使用DBUtils!在往期的文章
決戰(zhàn)高考,幫你秒變成語(yǔ)之王中,有對(duì)DBUtils的詳細(xì)介紹,這里就不再贅述了…
但本次有一個(gè)知識(shí)點(diǎn),我們需要將車(chē)標(biāo)圖片,存儲(chǔ)在數(shù)據(jù)庫(kù)中,那么如何在數(shù)據(jù)庫(kù)中存儲(chǔ)圖片,使用類(lèi)型BLOB。舉一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)圖片讀寫(xiě)例子
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清風(fēng)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)
我們創(chuàng)建一個(gè)image_save的測(cè)試表,然后將圖片讀取為二進(jìn)制字節(jié)的方式,通過(guò)sqlite3.Binary將二進(jìn)制文件存儲(chǔ)至數(shù)據(jù)庫(kù)。
那么同樣的,我們將BLOB類(lèi)型的圖片讀取出來(lái)后,進(jìn)行寫(xiě)入,即可達(dá)到效果,來(lái)看看這個(gè)1.jpg是否正常:
圖片下載小技巧
看過(guò)了二進(jìn)制的存儲(chǔ)方式,大家肯定說(shuō)明白了,網(wǎng)站獲取到圖片鏈接然后找著上面的例子下載到本地,然后再進(jìn)行二進(jìn)制的讀取后存儲(chǔ)數(shù)據(jù)庫(kù)即可,對(duì)嗎?不對(duì)…有什么問(wèn)題呢?來(lái)看一個(gè)例子:
這里Audi圖片的鏈接地址,我們通過(guò)requests來(lái)下載看看….
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...'
可以看到我們通過(guò)requests.get獲取到的content就已經(jīng)是二進(jìn)制數(shù)據(jù)了,為何還要存儲(chǔ)成圖片,在轉(zhuǎn)化呢?網(wǎng)頁(yè)分析
適配url
針對(duì)A-Z的車(chē)標(biāo)排序,網(wǎng)站的url匹配關(guān)系很簡(jiǎn)單:
from string import ascii_uppercase as au
# ascii_uppercase代表A-Z,當(dāng)然你可以不引入模塊自己生成也OK...
for uppercase in au:
"http://www.chebiaow.com/logo/{}.html".format(au)
獲取品牌鏈接
可以看到在包含cb-list方法的ul下匹配所有l(wèi)i中的第一個(gè)a標(biāo)簽,然后拼接base_url即可。
品牌詳情
進(jìn)入品牌詳情界面后,我們針對(duì)左右欄目的設(shè)置,分別獲取所需標(biāo)紅的內(nèi)容
整體代碼
通過(guò)上面的分析,我們開(kāi)始爬蟲(chóng),但這個(gè)網(wǎng)站真的是相應(yīng)好慢,沒(méi)辦法添加上Threading的多線(xiàn)程執(zhí)行吧,整體代碼如下:
# -*- coding: utf-8 -*-
# @Author : 王翔
# @JianShu : 清風(fēng)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()
最終存儲(chǔ)的數(shù)據(jù)庫(kù)如下:
由于圖片是BLOB類(lèi)型的二進(jìn)制文件,所以大家看到的是星星,感覺(jué)網(wǎng)站的車(chē)標(biāo)是不不夠,怎么才140多種(雖然我能認(rèn)識(shí)的不到20種…)
這個(gè)中興看了半天還以為是搞錯(cuò)了,沒(méi)想到是同名的…
OK,今天的內(nèi)容就到這里,整理好數(shù)據(jù)庫(kù),哪天閑了做一個(gè)車(chē)標(biāo)的測(cè)試題,當(dāng)然大家可以按照之前我的使用爬蟲(chóng)+Flask獲取世界國(guó)旗數(shù)據(jù)和孩子一起學(xué)習(xí)那邊文章引申著自己寫(xiě)一個(gè)車(chē)標(biāo)的練習(xí)題。
總結(jié)
以上是生活随笔為你收集整理的python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: go模板引擎生成html,goweb-模
- 下一篇: pythonsys标准_python 以