Python爬虫+Kettle爬取和清洗网页数据

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)






  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值