当前位置: 首页 > 后端技术 > Python

python快速爬取车标网图片,以后别说你不知道这车!

时间:2023-03-25 21:26:37 Python

知识无国界...伙计,你为什么要学习?例如:看到天上有飞鸟,就会说:“晚霞孤雁齐飞,天上秋水一色”。而不是:“来吧,有这么多鸟。”;失恋时,你低声吟唱:“人生若只如初见,何必秋风悲画扇?”而不是喊“兰寿,蘑菇!”轰鸣声,嗖~~一辆跑车闪过,大声问道;“爸爸,这是什么车?”我:“红色的车……”潇潇潇:“爸爸肯定不认识,我也知道是红色的车。”气氛有点冷……别人看车看品牌,我看车看宽敞不宽敞,睡着舒服不?但无论如何,我不能在我的孩子面前失去我的身份。我决定学车标!Chebiaow.com在网上找了很久Chebiaow的资料,终于看到了这个网站:Chebiaow.com:http://www.chebiaow.com/logo。该网站将车系按照字母顺序从A-Z排序,然后点击每个车标进入详细信息。以奥迪为例:有用的数据有哪些?品牌名称、车标、成立时间、主要车型、官网……那么今天的爬虫练习就蓄势待发,获取车标网下的所有汽车品牌和车标,并入库……数据库操作指南是针对简单数据的,我习惯用python自带的sqlite3来存储数据库,简单方便。。。那么如何管理我们的数据库呢?推荐使用DBUtils!在之前的文章《奋战高考,助你秒变语言之王》中,对DBUtils有详细的介绍,这里就不赘述了。。。不过这次有个知识点,我们需要改变车标图片,存储在数据库中,那么数据库中如何存储图片,使用类型BLOB。举个读写数据库图片的简单例子#-*-coding:utf-8-*-#@Author:WangXiang#@JianShu:QingfengPython#@Date:2019/7/2223:00#@Software:PyCharm#@version:Python3.7.3#@File:show.pyimportsqlite3db=sqlite3.connect('Car.db')cur=db.cursor()cur.execute("CREATETABLEifnotexistsimage_save(imageBLOB);")withopen('Audi.jpg','rb')asf:cur.execute("insertintoimage_savevalues(?)",(sqlite3.Binary(f.read()),))db.commit()cur.execute('selectimagefromimage_savelimit1')b=cur.fetchone()[0]withopen('1.jpg','wb')asf:f.write(b)我们创建一个image_save测试表,然后将图片读取为二进制字节,将二进制文件通过sqlite3.Binary存储到数据库中。然后同理,我们读取BLOB类型的图片后,写入进去,就可以实现效果了。看看这个1.jpg是否正常:图片下载提示。看完了二进制的存储方法,大家一定明白了吧,网站获取图片链接然后找到上面的例子下载到本地,然后读取二进制存入数据库,对吧?不……有什么问题吗?我们来看一个例子:这里是奥迪图片的链接地址,我们通过requests下载....importrequestsr=requests.get('http://img.chebiaow.com/thumb/cb/allimg/1303/1-1303061Z600520,c_fill,h_138,w_160.jpg')r.contentb'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01...'可以看到我们得到的内容通过requests.get已经是二进制数据了,为什么要存成图片再转换呢?网页分析调整url以对A-Z汽车标志进行排序。网站的url匹配关系很简单:fromstringimportascii_uppercaseasau#ascii_uppercase代表A-Z。当然,你可以自己生成,不引入模块,也可以...foruppercaseinau:"http://www.chebiaow.com/logo/{}.html".format(au)获取品牌链接,可以看到在包含cb-list方法的ul下匹配所有li中的第一个a标签,然后拼接base_url即可。品牌详情进入品牌详情界面后,我们获取左右栏设置所需的红色内容。整体代码通过上面的分析,我们开始爬取,但是这个网站真的很慢,而且没有办法添加Threading多线程执行,整体代码如下:#-*-coding:utf-8-*-#@Author:王翔#@JianShu:QingfengPython#@Date:2019/7/2223:08#@Software:PyCharm#@version:Python3.7.3#@File:CarLogo.pyimportosfromdb_makerimportDbMakerasDBfromstringimportascii_uppercaseasauiimportrequestsfrombs4importBeautifulSoupfromurllib.parseimporturljoinfromsqlite3importBinaryimportcardLogingimport=DAclassCarBA'__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(WindowsNT6.1;WOW64)AppleWebKit/537.36''(KHTML,likeGecko)Chrome/70.0.3538.67Safari/537.36')}defcheck_dir(self):如果不是headers=self.headers,params=params,timeout=15)除了:passsoup=BeautifulSoup(r.text,"lxml")returnsoupdefcreate_url(self):_url_format="http://www.chebiaow.com/logo/{}.html"对于au中的大写字母:尝试:soup=self.get_response(_url_format.format(uppercase))_cars=soup.find("ul",{"class":"cb-list"})。findAll('li')forcarin_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()除了:传递defcar_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')found=right_index[3].span.textmodels=right_index[5].span.textwebsite=right_index[7].span.textprint("插入汽车标志{}".format(name))_sql="insertintocar_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款。。。)ZTE看了半天还以为写错了,没想到居然同名了。。.OK,今天的内容就到这里,整理一下数据库,哪天做一道车标测试题,当然大家可以根据我之前使用爬虫+Flask获取世界国旗数据和小朋友一起学习,文章那边延伸出自己写车标的练习题。点击关注,第一时间了解华为云新技术~