又学了两天爬虫,一直想爬东西。emmm,雷佳音代言了三陪三保的广告,好像叫瓜子二手车,不错,今天就爬一下。看看他们卖的车是不是真的很便宜。提示:本文仅供学习交流,请勿用于非法用途!!!页面分析首先我们打开选车页面https://www.guazi.com/sjz/buy/#bread。我们选择变速箱类型为自动变速箱,车型为SUV。可以看到,链接变成了https://www.guazi.com/sjz/buy/h2n2/#bread。可以想象过滤条件是/h2n2。在此基础上,我们翻到第二页。链接变成了https://www.guazi.com/sjz/buy/o2h2n2/#bread。所以/o{index}h2n2中的索引是页码。根据上图可以看出该条件下有13805辆车,但是下面的页码标签只能达到50页。我试了一下,把index调到51,数据和第50页一样。所以我们爬取前50页的数据就好了。每页40辆车,一共2000条数据,不妨碍我们谈事情吧~撸起袖子写代码获取获取也用到了requests库。headers={'User-Agent':'你的用户代理','Cookie':'你的cookie'}defget_page(url):response=requests.get(url,headers=headers)response.encoding='utf-8'if__name__=='__main__':forxinrange(1,51):get_page(f'https://www.guazi.com/sjz/buy/o{x}h2n2/#bread')先生。辣条试过了。如果不加header,请求的页面加载的是数据...,不是我们想要的数据。关于这两个值的获取请按F12自行获取。这个cookie是不登录就存在的,所以存储的不是登录信息页面被切到这种程度,是不是很贴心?哦,User-Agent没拦截,反正就在下面,自己去拿吧。Escape~Analysis仍然使用PyQuery库。查看网页源码只需要获取ul,然后获取所有的a标签即可。有了现价和原价,我们还可以算出车辆的折扣。frommultiprocessing.poolimportPoolimportrequestsfrompyqueryimportPyQueryaspqimportjsonfromdecimalimport*defget_page(url):response=requests.get(url,headers=headers)response.encoding='utf-8'doc=pq(response.text)ul=doc('.carlist.clearfix.js-top')links=ul.find('a')datas=[]forlinkinlinks:name=pq(link)('h2').text()img=pq(link)('img').attr('src')msg??=pq(link)('.t-i').text()year=msg.split('|')[0]距离=msg.split('|')[1]now_price=pq(link)('.t-pricep').text()original_price=pq(link)('.t-priceem').text()如果len(original_price)==0:original_price=now_pricediscount=Decimal(now_price.replace('万',''))*100/Decimal(original_price.replace('万',''))discount_str=str(Decimal(discount).quantize(Decimal('0.00')))+'%'dict={'name':name,'img':img,'year':年,'distance':distance,'now_price':now_price,'original_price':original_price,'discount':discount_str}datas.append(dict)print(json.dumps(dict,ensure_ascii=False))if__name__=='__main__':pool=Pool(3)group=([f'https://www.guazi.com/sjz/buy/o{x}h2n2/#bread'forxinrange(1,51)])池。map(get_page,group)pool.close()pool.join()这次我们把数据放到一个list里面,然后一次性塞进mongo。为了加快爬取速度,我们采用多进程爬取,并在main函数内部编写相关代码。要存储此存储,请使用mongo,一个非常好的NoSQL数据库。frompymongoimportMongoClientclient=MongoClient('127.0.0.1',27017)db=client.pjjltcollection=db.guazicollection.insert_many(datas)在MongoClient中填写链接和端口,得到一个client客户端。然后从客户端获取pjjlt数据库。从数据库中获取瓜子集合。然后塞进去,看看结果,嗯,对,正好是两千。可视化直方图拿到数据了,先来看看这2000辆汽车在什么价格区间。生成一个量价图。使用了matplotlib库。frommatplotlibimportpyplotasplt#获取数据defget_mongo_datas():datas=collection.find({})returndatas#添加条形图上方纵坐标的值defadd_labels(rects):forrectinrects:height=rect.get_height()plt.text(rect.get_x()+rect.get_width()/2,height+0.01*height,height,ha='center',va='bottom')rect.set_edgecolor('白色')#生成二维柱状图defcreate_two_dimensional_diagram(datas):price_5=0price_10=0price_20=0price_20_plus=0fordataindatas:price=Decimal(data.get('now_price').replace('一万',''))ifprice<5:price_5+=1elifprice>=5andprice<10:price_10+=1elifprice>=10andprice<20:price_20+=1else:price_20_plus+=1price_y=[price_5,price_10,price_20,price_20_plus]price_x=['0~5','5~10','10~20','20+']plt.rcParams['font.sans-serif']=['SimHei']rects=plt.bar(price_x,price_y,align='center')#将纵坐标的值加入直方图add_labels(rects)plt.title('价量关系图')plt.ylabel('数量(车辆)')plt.xlabel('price(10,000)')plt.show()首先通过get_mongo_datas从mongo获取车辆信息(后面也会用到这个方法)。然后通过create_two_dimensional_diagram方法生成二维柱状柱状图。生成工具使用matplotlib。先按照当前价格分组,计算出数量,然后放入横纵坐标数组中。需要添加字体,['SimHei'],否则不能正常显示中文。原来的柱状图上面没有垂直值,所以我们需要用add_labels方法来绘制。生成的表单如下所示。是不是和看博的你一样好看呢~好吧,不是长脸,别打我,拉条君就是说你长得好看而已。Escape~文字云接下来我们看看都在卖什么车。这里,名字被切分后,就形成了词云。使用了jieba和wordcloud库。importjiebafromwordcloudimportWordClouddefcreate_wordCloud(datas):names=[]数据中的数据:names.append(data.get('name').replace('',''))big_name=''.join(names)wl=jieba.lcut(big_name,cut_all=True)wl_space_split=''.join(wl)wc=WordCloud('simhei.ttf',background_color='white',#背景色width=1000,height=600).generate(wl_space_split)wc.to_file('%s.png'%'SUV')首先使用上一节中的get_mongo_datas从mongo获取车辆信息。然后把名字去掉空格,拼接起来,得到一个超长的名字串,然后用jieba分词,把大串分词得到一个list。cut_all=True参数是完整的分词,也就是单词很多的那种。然后使用WordCloud生成词云图。simhei.ttf参数也处理了中文名字的转换。那么让我们期待已久的图片首次亮相吧!噗。.我们需要屏蔽一些词吗?.将代码更改为以下内容:defcreate_wordCloud(datas):names=[]fordataindatas:names.append(data.get('name').replace('',''))big_name=''.join(名称)wl=jieba.lcut(big_name,cut_all=True)wl_space_split=''.join(wl)stopwords=['luxury','luxury','luxury','automatic','elite','comfortable','Comfort','Import','OL','Sport','Sport','Comfort','VI','OT','CVT']wc=WordCloud('simhei.ttf',background_color='white',#背景色width=1000,height=600,stopwords=stopwords).generate(wl_space_split)wc.to_file('%s.png'%'SUV2')添加停用词参数停用词,可以屏蔽一些词。然后继续生成图片。emmm,看来是屏蔽不够了。你可以继续挡住屏幕前的俊美美女,不过应该已经有一些车辆名称出现了。什么尼桑、马自达、本田、奔驰等等。呵,根本买不起辣条~几块钱赶紧搜三手五菱宏光。最后,又写完了一个爬虫。新的get已经存入mongo,视觉上还是有一些了解的。满意了~喜欢的小伙伴们走之前给我点个赞吧。辣条君会持续输出爬虫博客。谢谢你又帅又漂亮。智者的关注和支持。
