1.绪论
1.1系统设计背景
利用爬虫和kettle进行数据爬取与处理分析。
1.2开发目的与意义
将所学网络采集工具技术和ETL工具处理技术结合,对网络信息进行爬取,并通过一定手段处理、分析,得到自己需要的数据内容,能帮助我们进行决策等。
2.相关技术介绍
2.1数据采集与处理技术
Python爬虫技术、ETL工具Kettle
2.2Python爬虫技术介绍
爬虫原理
如果要获取网络上数据,我们要给爬虫一个网址(程序中通常叫URL),爬虫发送一个HTTP请求给目标网页的服务器,服务器返回数据给客户端(也就是我们的爬虫),爬虫再进行数据解析、保存等一系列操作。
爬取网页数据之前需要事先安装request、BeautifulSoup包
2.3ETL工具Kettle介绍
Kettle以Java语言编写,作用是将各种数据放在其中,然后以一种指定的格式流出。Kettle包含Spoon、Chef、Encr、Kitchen等组件。其中,Spoon是一个图形用户界面,可以方便、直观地完成数据转换任务。Spoon可以运行转换(.kst)或者任务(.kjb),其中转换用Pan来运行,任务用Kitchen来运行。Pan是一个数据转换引擎,具备很多功能,比如从不同的数据源读取,操作和写入数据。Kitchen可以运行使用XML或数据资源库描述的任务。通常任务是在规定时间内用批处理的模式自动运行的。
3.采集与处理系统总体架构
3.1需求分析
购买者能够根据自己的经济能力等各方面因素进行综合考量后,在众多选择中购买适合适合自己的车辆。
3.2功能描述
爬虫模块:爬取指定网页数据,存储为csv文件
ETL工具模块:使用kettle进行数据清洗
3.3系统操作流
4.数据采集模块设计
4.1采集对象分析
我们要爬取的数据位于<div class=”buy-cars clear”>下<div class=”buy-cars -main”>中<ul class=”car-pic-form-box car-box-list clear”>下的 li 标签下,所以我们的目标就是获取此标签下的数据,之后再进一步对此标签下数据做进一步处理。
车辆配置情况这一属性存放在h6标签内
购买时间和总里程数两个属性存放在span标签内
出售价格这一属性存放在strong标签内
4.2采集方法设计
引入request、BeautifulSoup、csv三个函数包
1、使用urllib的request请求方法获得网页源代码
2、使用BeautifulSoup解析库解析网页源代码
3、使用find()方法一层一层递归找到要爬取数据所存放的位置
4、使用find_all()方法获得所有的li标签下的数据
5、使用for循环+text()方法不断获得相应属性的数据值
6、用列表进行接收,最后生成csv文件
5.数据集成、转换与清洗模块设计
5.1采集后的数据分析
采集的数据分别对应在属性“车辆配置类型”、“车辆买入时间”、“总里程数”和“出 售价格/万”
其中属性“车辆配置类型”描述的是车辆的品牌、规格等
属性“车辆买入时间”描述的是车辆的使用年限
属性“总里程数”描述的是车辆的行驶距离,侧面反映发动机的大概
属性“出售价格/万”描述的是这辆车准备出售的价格,购买者根据自身情况
5.2数据集成、转换与清洗的目标
1、删除数据集内存在空值的数据片
2、假设用户预算在20-25万区间内,筛选适合用户的车辆信息
3、以Excel文件形式输出
5.3数据处理方法设计
6.系统实施
6.1数据采集效果
6.2数据处理效果
处理一:删除属性“车辆类型配置”中的空值
处理二:用户预算在20-25万之间,过滤掉不在此区间段内的车辆
7.总结
代码非常简单,也可以套用本代码去爬取其他网页的信息。完整的代码放下面,也附着着详细的介绍:
import csv
import urllib.request
from bs4 import BeautifulSoup as bs
#请求头设置
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36'}
#存放所有数据列表
all_info=[]
def get_page_info(urls):
#使用urllib的request请求方法获得网页源代码
req=urllib.request.Request(urls,headers=headers)
html=urllib.request.urlopen(req)
#使用BeautifulSoup解析库解析网页源代码
soup=bs(html.read(),'html.parser')
#使用find()方法一层一层递归找到要爬取数据所存放的位置
address1=soup.find('div',class_='buy-cars clear')
address2=address1.find('div',class_='buy-cars-main')
address3=address2.find('ul',class_='car-pic-form-box car-box-list clear')
#使用find_all()方法获得要查找的URL片段
id=address3.find_all('li')
#循环解析页面数据
for i in id:
#获取id片段里a标签下h6标签的内容
car=i.a.h6.text
#获取id片段里div,class=parameter标签下span标签的第一个文本内容
time=i.find('div',class_='parameter').find_all('span')[0].text
# 获取id片段里div,class=parameter标签下span标签的第二个文本内容
kilometers=i.find('div',class_='parameter').find_all('span')[1].text
#获取id片段里a标签下strong标签的内容
price=i.a.strong.text
# 获取id片段里div,class=tags标签下span标签的文本内容
# //此类信息不适合find_all()方法,故注释
#tags=i.find('div',class_='tags').find_all('span').text
result_info = [car, time, kilometers, price]
all_info.append(result_info)
print(all_info)
def save_csv(all_data):
menu_name=['车辆类型配置','车辆买入时间','总计里程数','出售价格/万']
path='car_infomations.csv'
with open(path,'w',newline='',encoding='utf-8') as f:
writer=csv.writer(f)
#写入一行数据属性栏
writer.writerow(menu_name)
#写入多行爬取数据
writer.writerows(all_data)
if __name__=='__main__':
#构造一个URL,一般获得所有一级页面的URL
url = 'https://so.iautos.cn'
url_list=url+'/quanguo/p%dasdsvepcatcpbnscac/#buyCars'
for k in range(1,10):
urls=url_list%k
print(urls)
get_page_info(urls)
save_csv(all_info)