什么?你了解二手车市场?(含爬虫代码)
往期回顾
从零开始学Python【15】--matplotlib(散点图)
从零开始学Python【14】--matplotlib(折线图)
从零开始学Python【13】--matplotlib(直方图)
从零开始学Python【12】--matplotlib(箱线图)
从零开始学Python【11】--matplotlib(饼图)
从零开始学Python【10】--matplotlib(条形图)
前言
我们已经学习了使用Python的matplotlib模块进行数据的可视化,包括绘制条形图、饼图、箱线图、直方图、折线图和散点图。学习了就要学会去使用它,我们就通过一个二手车的案例来练一下手,在练之前,是不是得先有数据呀。没问题,我们就使用Python这个神器先来抓取某二手车平台的数据—爬虫。在今天的这篇文章中,我们就来详细的讲讲如何从这个网络平台上获取数据。
爬虫思路
先来看几张截图,然后基于这个截图再来介绍在整个爬虫中需要经过的步骤:
在这个二手车主页中,只显示了50页,以每页50辆车来算,顶多只能抓取2500辆二手车的信息。为了能够尽可能的抓取更多的二手车信息,我们对二手车的各个品牌按字母展开,如上图所示。所以,在这一步中,我们需要获取各品牌二手车的链接URL;
以奥迪品牌为例,我们需要知道这种品牌的二手汽车大概有多少辆,说白了就是要获取奥迪二手车一共有多少页信息。所以,我们需要获取各个品牌车辆各有多少页,然后再根据页数生成要抓取的链接URL;
有了这些个URL,就可以根据URL的内容,获取每一辆车的上牌时间、表显里程等指标数据;
最后需要将搜集来的数据进行存储,本例中我们就将数据存放到csv文件中,如下图所示。
接下来,我们就根据上面的四个步骤,展开某二手车平台数据的搜集。
步骤一、获取各品牌二手车的链接URL
我们来到二手车的主页,并按下电脑的F12键,根据下图框出来的1,2,3几个步骤,就可以获取4的结果。
说明:
红框1:点击品牌末尾的更多,会展现一排因为字母,这线字母全都是汽车品牌的首字母拼音;
红框2:点击类似鼠标的按钮,可以帮助你锁定接下来需要选择的内容包含在什么标记中;
红框3:点击“奥迪”品牌为例;
红框4:点击之后,就会锁定该“奥迪”所在网页源代码中的位置和所属标记。
代码实现:
# 导入第三方包
import requestsfrom bs4
import BeautifulSoup
import time
# 设置伪头--用于防止反爬虫
headers = {'Accept':'*/*',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'keep-alive',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36'}
# 二手车主页的链接
url = 'http://shanghai.taoche.com/all/'
# 发送抓取链接的请求并进一步解析
res = requests.get(url, headers = headers).text
soup = BeautifulSoup(res,'html.parser')
# 抓取二手车品牌名称及对应的链接
car_brands = soup.findAll('div',{'class':'brand-name'})
# 根据HTML的标记搜索指定对象
car_brands = [j for i in car_brands for j in i] # 双重for循环的列表解析式
brands = [i.text for i in car_brands] # 去标签化处理
urls = ['http://shanghai.taoche.com' + i['href'] for i in car_brands] # 拼接完整的二手车品牌链接
步骤二、生成所有需要抓取的链接URL
根据第一步获取的urls,即各个品牌的第一页链接,接下来需要把各品牌的所有页面的链接全部解析出来。以奥迪品牌的url为例,根据下图的1,2几个步骤获取每个品牌的总页数。
说明:
红框1:在奥迪的主页下,按F12键,并点击类似鼠标箭头的按钮,用于抓捕点击行为;
红框2:点击页码“15”,查看页码对应的HTML标记,用于解析总页数这个值;
红框3:点击后,就会返回“15”所在网页源代码中的位置和所属标记;
代码实现:
# 构建空的列表,用于存放品牌的所有链接和品牌名称
target_urls = []
target_brands = []
# 通过for循环完成网页的解析,并生产链接
for b,u in zip(brands,urls):
# 抓取各品牌二手车主页下的所有页码
res = requests.get(u, headers = headers).text
soup = BeautifulSoup(res,'html.parser')
# 查询出页数
if len(soup.findAll('div',{'class':'the-pages'})) == 0:
pages = 1
else:
pages = int([page.text for page in soup.findAll('div',{'class':'the-pages'})[0].findAll('a')][-2])
# 为了防止反爬虫,这里每循环一次休眠3秒钟
time.sleep(3)
# 将链接存储起来
for i in range(1,pages + 1):
target_brands.append(b)
target_urls.append(u+'?page='+str(i)+'#pagetag')
步骤三、所有目标链接的数据抓取
第二步已经获取了所有目标链接(一共308条),接下来需要针对这些链接,进行目标数据的抓取,包括二手车的上牌时间、表显里程、排放标准、二手价等信息。以“奥迪A6 2013款 40 hybrid”为例,根据下图的1,2几个步骤获取每个二手车的详细数据:
说明:
红框1:在奥迪的主页下,按F12键,并点击类似鼠标箭头的按钮,用于抓捕点击行为;
红框2:点击标题“奥迪A6 2013款 40 hybrid”,查看页码对应的HTML标记;
红框3:点击后,就会返回该标题所在网页源代码中的位置和所属标记;
上图所示,源代码中的红框abc对应了前端显示的ABC内容,这样就可以借助已知的标记解析出想要的数据内容,具体可以查看下面的代码。
代码实现:
# 构建空列表,用于数据的存储brand = []
title = []
boarding_time = []
km = []
discharge = []
sec_price = []
new_price = []
# 对每个链接发送请求
for b,u in zip(target_brands,target_urls):
res = requests.get(u, headers = headers).text
soup = BeautifulSoup(res,'html.parser')
# 统计每页二手车的数量
N = len([i.findAll('a')[0]['title'] for i in soup.findAll('div',{'class':'item_details'})])
# 为防止报错,这里借用异常值处理办法
try:
# 二手车的品牌
brands = (b+'-')*N
brand.extend(brands.split('-')[:-1])
# 二手车的名称
title.extend([i.findAll('a')[0]['title'] for i in soup.findAll('div',{'class':'item_details'})])
# 二手车的上牌时间、行驶里程数等信息
info = [i.findAll('li') for i in soup.findAll('ul',{'class':'ul_news'})]
boarding_time.extend([i[0].text[4:] for i in info])
km.extend([i[1].text[4:] for i in info])
# 二手车的排量标准
discharge.extend([i[3].text[4:] for i in info])
# 二手车的价格
sec_price.extend([float(i.findAll('h2')[0].text[:-1]) for i in soup.findAll('div',{'class':'item_price'})])
# 新车的价格
new_price.extend([i.findAll('p')[0].text.split('\xa0')[0][5:].strip() for i in soup.findAll('div',{'class':'item_price'})])
except IndexError:
print('索引错误')
# 每3秒休眠一次
time.sleep(3)
步骤四、数据的存储
上面的三个步骤大约需要15分钟左右的运行时间,之后在电脑的内存中就会存储11,281条二手车的数据信息,如果不对这些数据的存储,一旦关闭Python的会话窗口,数据就会丢失。所以,有必要将这些数据存储到本地或数据库,这里就是要pandas模块,将数据存储到csv文件中。
代码实现:
# 数据导出
import pandas as pd
# 先转化为数据框(记得转置)
cars_info = pd.DataFrame([brand,title,boarding_time,km,discharge,sec_price,new_price]).T
# 数据框变量的重命名
cars_info = cars_info.rename(columns={0:'Brand',
1:'Name',
2:'Boarding_time',
3:'Km',
4:'Discharge',
5:'Sec_price',
6:'New_price'})
# 数据的写出操作
cars_info.to_csv('second_cars_info.csv', index=False)
结语
OK,今天的内容就是手把手地教你使用Python对某二手汽车平台进行爬虫,相信经过以上的操作,你应该明白爬虫的思路和步骤了吧,如果有问题,欢迎在公众号的留言区域表达你的疑问。同时,也欢迎各位朋友继续转发与分享文中的内容,让跟多的人学习和动手操作。最后,本文相关的Python脚本和PDF版本已存放到百度云盘,可以通过下面的链接获取:
链接: https://pan.baidu.com/s/1dFapkdV 密码: 9qv4
每天进步一点点2015
学习与分享,取长补短,关注小号!
长按识别二维码 马上关注