网络爬虫项目实战 教案 项目四 汽车Scrapy+MTC项目_第1页
网络爬虫项目实战 教案 项目四 汽车Scrapy+MTC项目_第2页
网络爬虫项目实战 教案 项目四 汽车Scrapy+MTC项目_第3页
网络爬虫项目实战 教案 项目四 汽车Scrapy+MTC项目_第4页
网络爬虫项目实战 教案 项目四 汽车Scrapy+MTC项目_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

教师备课纸苏州工业职业技术学院教师备课纸SuzhouInstituteOfIndustrialTechnology第

PAGE

14页教师备课首页苏州工业职业技术学院教师备课首页SuzhouInstituteOfIndustrialTechnology第1页课题项目四招聘Requests项目实战课型理实一体授课班级大数据22C1、大数据22C2授课时数8教学目标(1)掌握Scrapy爬虫框架用法。(2)掌握Xpath的用法。(3)掌握从CSV文件读取到DataFrame。(4)掌握DataFrame列裂变。(5)掌握DataFrame文字替换。(6)掌握DataFrame列数据类型转换。(7)掌握DataFrame保存到CSV文件。(8)掌握在数据库中新建数据表。(9)从CSV文件读取到MySQL数据表。(10)掌握MySQL查询数据表。(11)掌握Flask框架可视化图表。教学重点(1)掌握Scrapy爬虫用法。(2)掌握Flask框架可视化图表。教学难点Flask框架可视化图表学情分析学生零基础,在教学中注重引导学生学会自主学习,培养学生学会查找文献资料教学效果教后记任务1:Scrapy+XPath采集数据步骤1:转到Tomcat安装目录下的bin目录,运行startup.bat后,打开Chrome,访问:50001/findcar/chengdu.html,打开成都地区二手车网页信息,如图4-3所示。代表Tomcat运行正常。还可以通过修改城市名称,如::50001/findcar/guangzhou.html和:50001/findcar/shanghai.html,访问广州和上海二手车网页信息,如图4-4和图4-5所示。步骤2:打开网站首页,在页面任意位置点击鼠标右键后,选择“检查”,选择“Network”选项卡,查看HTTP请求和返回内容,点击“Clear”按钮,清除缓存。点击“Ctrl+R”重新加载页面,再切换到“Doc”选项卡。选择“chengdu.html”,查看RequestHeaders,保存User-Agent的属性值。步骤3:打开网站首页(:50001/findcar/chengdu.html),然后在页面空白区域点击鼠标右键,选择“检查”,在右边“Elements”窗口查找div元素,对照左边窗口的显示,找到各个二手车信息div对应的页面元素,如图4-9所示。步骤4:鼠标停留在网页中车辆名称等字段信息,然后点击鼠标右键后,选择“检查”,查找各个对应字段的XPath路径。从XPath路径“div[@class="gongge_main"]”开始,“车辆名称”字段对应的XPath相对路径为“/a/span/text()”。类似地,确定“上牌时间”、“行驶里程”、“销售城市”、“销售价格”字段的XPath路径。步骤5:打开AnacondaPrompt,用下面命令转到PyCharm项目主目录。>cdc:\PycharmProjects步骤6:用下面命令创建Scrapy空项目“findcar”。>scrapystartprojectfindcar步骤7:转到findcar子目录。>cdc:\PycharmProjects\findcar步骤8:执行下面命令创建爬虫。其中,car_spider是爬虫名称,是网站域名。>scrapygenspidercar_spider""步骤9:用PyCharm打开项目,展开目录“findcar”,项目结构应该如图4-11所示。步骤10:修改findcar/spiders/car_spider.py,设置起始URL指向网站首页。#-*-coding:utf-8-*-importscrapyclassCarSpiderSpider(scrapy.Spider):name='car_spider'allowed_domains=['']start_urls=[':50001/findcar/chengdu.html']defparse(self,response):pass步骤11:在项目根目录下创建startpoint.py文件,代码如下:fromscrapyimportcmdlinecmdline.execute('scrapycrawlcar_spider'.split(''))运行startpoint.py,PyCharm控制台输出如下结果:2022-08-0911:43:37[scrapy.utils.log]INFO:Scrapy2.6.1started(bot:findcar)2022-08-0911:43:37[scrapy.utils.log]INFO:Versions:lxml,libxml22.9.9,cssselect1.1.0,parsel1.6.0,w3lib1.22.0,Twisted22.4.0,Python3.7.3(default,Apr242019,15:29:51)[MSCv.191564bit(AMD64)],pyOpenSSL19.0.0(OpenSSL1.1.1c28May2019),cryptography2.7,PlatformWindows-10-10.0.19041-SP02022-08-0911:43:37[scrapy.crawler]INFO:Overriddensettings:'robotstxt/request_count':1,'scheduler/dequeued':3,'scheduler/dequeued/memory':3,'scheduler/enqueued':3,'scheduler/enqueued/memory':3,'start_time':datetime.datetime(2022,8,9,3,43,38,870554)}2022-08-0911:43:51[scrapy.core.engine]INFO:Spiderclosed(finished)步骤12:修改findcar/items.py,FindcarItem类添加车辆名称、上牌时间、行驶里程、销售城市、销售价格。importscrapyclassFindcarItem(scrapy.Item):name=scrapy.Field()#车辆名称year=scrapy.Field()#上牌时间distance=scrapy.Field()#行驶里程price=scrapy.Field()#销售城市city=scrapy.Field()#销售价格步骤13:修改findcar/pipelines.py,FindcarPipeline类中实现process_item方法。importcsvwithopen('./data.csv',mode='a',encoding='utf-8',newline='')asf:writer=csv.writer(f)writer.writerow(['车辆名称','上牌时间','行驶里程','销售城市','销售价格'])classFindcarPipeline:defprocess_item(self,item,spider):withopen('./data.csv',mode='a',encoding='utf-8',newline='')asf:writer=csv.writer(f)writer.writerow([item["name"],item["year"],item["distance"],item["city"],item["price"]])步骤14:在findcar/settings.py中,反注释ITEM_PIPELINES,启用findcar.pipelines。ITEM_PIPELINES={'carcrawl.pipelines.CarcrawlPipeline':300,}步骤15:在findcar/settings.py中,继续反注释DEFAULT_REQUEST_HEADERS部分,设置User-Agent。cookie和referer为空,不需要设置。DEFAULT_REQUEST_HEADERS={'Accept':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36','Accept-Language':'en',}步骤16:修改findcar/car_spider.py,爬取数据。importscrapy

fromfindcar.itemsimportFindcarItem

item=FindcarItem()

classCarSpiderSpider(scrapy.Spider):

name='car_spider'

allowed_domains=['']

start_urls=[':50001/findcar/chengdu.html',':50001/findcar/shanghai.html',':50001/findcar/guangzhou.html']

defparse(self,response):

car_info_list=response.xpath('//div[@class="gongge_main"]')

forcarincar_info_list:

name=car.xpath('./a/span/text()').extract()

year=car.xpath('./p/i[1]/text()').extract()

distance=car.xpath('./p/i[2]/text()').extract()

city=car.xpath('./p/i[3]/text()').extract()

price=car.xpath('./div[1]/i/text()').extract()

item['name']=name[0]

item['year']=year[0]

item['distance']=distance[0]

item['city']=city[0]

item['price']=price[0].strip()

yielditem运行startpoint.py文件,在项目根目录中,多了一个CSV文件,如图4-15所示。任务2:Pandas清洗数据步骤1:在项目根目录New→PythonFile,创建data_clean.py。读入data.csv到DataFrame类型。利用read_csv()读取数据,进行数据清洗。importpandasaspdpd.set_option('display.width',None)#不限制显示的宽度pd.set_option('display.unicode.east_asian_width',True)#设置数据对齐df=pd.read_csv('data.csv',encoding='utf-8')print(df.head()) 运行data_clean.py,PyCharm控制台输出如下结果:车辆名称上牌时间行驶里程销售城市销售价格0大众朗逸2021款280TSI双离合豪华版2021年0.20万公里上海111福特探险者(进口)2013款3.5L自动尊享型2015年8.93万公里成都142起亚智跑2018款2.0L手自一体两驱智享豪华版2020年5.39万公里广州93林肯冒险家2020款2.0T两驱尊享版2020年0.98万公里上海234大众途昂2020款380TSI四驱豪华版国VI2020年2.50万公里上海27步骤2:从车辆名称提取车辆品牌。车辆名称中包含了车辆品牌,通过str.split()函数可以提取字符串中的信息。df['车辆品牌']=df['车辆名称'].str.split("",expand=True)[0]print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:车辆名称上牌时间行驶里程销售城市销售价格车辆品牌0大众朗逸2021款280TSI双离合豪华版2021年0.20万公里上海11大众朗逸1福特探险者(进口)2013款3.5L自动尊享型2015年8.93万公里成都14福特探险者(进口)2起亚智跑2018款2.0L手自一体两驱智享豪华版2020年5.39万公里广州9起亚智跑3林肯冒险家2020款2.0T两驱尊享版2020年0.98万公里上海23林肯冒险家4大众途昂2020款380TSI四驱豪华版国VI2020年2.50万公里上海27大众途昂步骤3:根据上牌时间计算车龄。fromdatetimeimportdatetimenow=datetime.now()year=now.yeardf['上牌时间']=df['上牌时间'].str.replace("年","")df['上牌时间']=df['上牌时间'].astype("int")df['车龄']=year-df['上牌时间']print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:车辆名称上牌时间行驶里程销售城市销售价格车辆品牌车龄0大众朗逸2021款280TSI双离合豪华版2021年0.20万公里上海11大众朗逸 11福特探险者(进口)2013款3.5L自动尊享型2015年8.93万公里成都14福特探险者(进口)72起亚智跑2018款2.0L手自一体两驱智享豪华版2020年5.39万公里广州9起亚智跑23林肯冒险家2020款2.0T两驱尊享版2020年0.98万公里上海23林肯冒险家24大众途昂2020款380TSI四驱豪华版国VI2020年2.50万公里上海27大众途昂2步骤4:将行驶里程的单位去掉,再转换为数值型。defchange(x):if"万公里"inx:x=x.replace("万公里","")x=float(x)*10000x=int(x)else:x=x.replace("百公里内","0")x=int(x)returnxdf['行驶里程']=df['行驶里程'].apply(change)pd.set_option('display.max_rows',None)print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:车辆名称上牌时间行驶里程销售城市销售价格车辆品牌车龄0大众朗逸2021款280TSI双离合豪华版2021年2000上海11大众朗逸11福特探险者(进口)2013款3.5L自动尊享型2015年89300成都14福特探险者(进口)72起亚智跑2018款2.0L手自一体两驱智享豪华版2020年53900广州9起亚智跑23林肯冒险家2020款2.0T两驱尊享版2020年9800上海23林肯冒险家24大众途昂2020款380TSI四驱豪华版国VI2020年25000上海27大众途昂2步骤5:删除多余字段,调整字段排列顺序。df=df.drop(axis=1,labels=['车辆名称','上牌时间'])df=df[['销售城市','车辆品牌','车龄','行驶里程','销售价格']]print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:销售城市车辆品牌车龄行驶里程销售价格0上海大众朗逸12000111成都福特探险者(进口)789300142广州起亚智跑25390093上海林肯冒险家29800234上海大众途昂22500027步骤6:保存清洗数据,将清洗后的数据保存到data_clean.csv文件,。df.to_csv("data_clean.csv",header=False,index=True)运行data_clean.py,在项目中可以找到一个新文件data_clean.py,如图4-16所示。任务3:MySQL存储数据下面要转到MySQLCommandLineClient,把净化后的数据导入MySQL。步骤1:创建数据库cardb。dropdatabaseifexistscardb;createdatabasecardb;步骤2:创建表carinfo。usecardb;droptableifexistscarinfo;createtablecarinfo(idint,cityvarchar(200),\ car_brandvarchar(200),car_yearint,car_distanceint,\ car_priceint,primarykey(id))\ charset=utf8;步骤3:查看MySQL上传目录。showvariableslike'%secure_file_priv%';步骤4:复制data_clean.csv到MySQL上传目录。步骤5:复制data_clean.csv绝对路径到剪贴板。步骤6:导入data_clean.csv到carinfo表。其中,替换data_clean.csv的绝对路径中的“\”要换成“\\”,因为“\”在MySQL中是转义符。loaddatalocalinfile"C:\\ProgramData\\MySQL\\MySQLServer5.7\\Uploads\\data_clean.csv"\intotablecarinfo\charactersetutf8fieldsterminatedby','optionallyenclosedby'"'\linesterminatedby'\r\n'\(id,city,car_brand,car_year,car_distance,car_price);步骤7:执行select语句,检查前5条记录。select*fromcarinfolimit5;任务4:Flask搭建服务Flask是一个微型的Python开发的Web框架,基于WerkzeugWSGI工具箱和Jinja2模板引擎。下面采用Flask搭建MTC应用,M代表Model(模型),T代表模板Template(模板)、C代表Controller(控制器)。步骤1:在项目根目录New->PythonPackage,创建app包。步骤2:在app包下New->PythonPackage,创建views包。步骤3:在app目录下New->Directory,创建目录static,然后把echarts.min.js复制到app/static目录。步骤4:在app包下New->PythonFile,创建extensions.py,定义db变量和config_extensions方法。fromflask_sqlalchemyimportSQLAlchemydb=SQLAlchemy()defconfig_extensions(app):db.init_app(app)步骤5:在app/views包下New->PythonFile,创建main.py,定义blueprint变量。fromflaskimportBlueprintblueprint=Blueprint("main",__name__)步骤6:完善app/views/__init__.py,定义DEFAULT_BLUEPRINT变量。fromapp.views.mainimportblueprintDEFAULT_BLUEPRINT=((blueprint,""))步骤7:完善app/__init__.py,定义Config类、config_blueprint方法、create_app方法。fromflaskimportFlask

fromapp.extensionsimportconfig_extensions

fromapp.viewsimportblueprint

classConfig:

SQLALCHEMY_COMMIT_ON_TEARDOWN=True

SQLALCHEMY_TRACK_MODIFICATIONS=False

SQLALCHEMY_DATABASE_URI="mysql+pymysql://root:123456@:3306/cardb?charset=utf8"

defconfig_blueprint(app):

app.register_blueprint(blueprint,url_prefix="")

defcreate_app(config):

app=Flask(__name__)

app.config.from_object(config)

config_extensions(app)

config_blueprint(app)

returnapp检查用户名、密码和端口,确认输入值和安装的MySQL一致。步骤8:在app包下New->PythonFile,创建manager.py。fromflask_scriptimportManager,Server

fromappimportcreate_app,Config

if__name__=='__main__':

app=create_app(Config)

manager=Manager(app)

manager.add_command('runserver',Server(host='',use_debugger=True,use_reloader=True))

manager.run()右键选中manager.py,选择“RunManager”菜单,运行程序,PyCharm控制台输出如下结果:usage:manager.py[-?]{runserver,shell}...positionalarguments:{runserver,shell}runserverRunstheFlaskdevelopmentserveri.e.app.run()shellRunsaPythonshellinsideFlaskapplicationcontext.optionalarguments:-?,--helpshowthishelpmessageandexit点击Run->EditConfiguration。选中manager,编辑Parameters,输入“runserver”。 再次右键选中manager.py,选择“RunManager”菜单,运行程序。PyCharm控制台输出如下结果,代表Flask配置成功。*ServingFlaskapp"app"(lazyloading)*Environment:productionWARNING:Thisisadevelopmentserver.Donotuseitinaproductiondeployment.UseaproductionWSGIserverinstead.*Debugmode:on*Restartingwithstat*Debuggerisactive!*DebuggerPIN:263-346-767*Runningon:5000/(PressCTRL+Ctoquit)单击“停止”按钮,停止manager运行。步骤9:在app包下New->PythonPackage,创建包models。步骤10:在包app/models下New->PythonFile,创建entities.py,定义Carinfo类。fromapp.extensionsimportdb

classCarinfo(db.Model):

__tablename__='carinfo'

id=db.Column(db.String(20),primary_key=True)

city=db.Column(db.String(200))

car_brand=db.Column(db.String(20))

car_year=db.Column(db.Integer)

car_distance=db.Column(db.Integer)

car_price=db.Column(db.Integer)步骤11:完善app/models/__init__.py,开放Carinfo类。from.entitiesimportCarinfo步骤12:完善app/views/main.py,定义get_car_price_by_city和defapi_city_price方法。fromflaskimportBlueprint,jsonify,render_template

fromsqlalchemyimportfunc,or_fromapp.extensionsimportdb

fromapp.modelsimportCarinfo

blueprint=Blueprint("main",__name__)

defget_car_price_by_city():

rows=db.session.query(Carinfo.city,func.avg(Carinfo.car_price))\

.group_by(Carinfo.city).all()

x=[]

y=[]

forrowinrows:

x.append(row[0])

y.append((int)(row[1]))

returnx,y

@blueprint.route("/api/city_price")

defapi_city_price():

x,y=get_car_price_by_city()

returnjsonify([x,y])步骤13:运行app/manager.py,打开Chrome,访问:5000/api/city_price,从服务器返回3个不同城市销售价格数据的列表,表示Flask连接数据库正常。任务5:Flask+ECharts可视化数据 有了Flask提供的数据,采用ECharts框架的柱状图对比不同城市的二手车均价。步骤1:完善app/views/main.py,定义get_car_price_by_city方法。fromflaskimportBlueprint,jsonify,render_template

fromsqlalchemyimportfunc,or_

fromapp.extensionsimportdb

fromapp.modelsimportCarinfo

blueprint=Blueprint("main",__name__)

defget_car_price_by_city():

rows=db.session.query(Carinfo.city,func.avg(Carinfo.car_price))\

.group_by(Carinfo.city).all()

x=[]

y=[]

forrowinrows:

x.append(row[0])

y.append((int)(row[1]))

returnx,y

@blueprint.route("/city_price")

defcity_price():

x,y=get_car_price_by_city()

returnrender_template('single_chart.html',x_data=x,y_data=y)步骤2:在app包下New->Directory,创建templates目录。步骤3:在templates目录下NewHTMLFile,创建single_chart.html。步骤4:修改single_chart.html的代码。<!DOCTYPEhtml><htmllang="en"><head><metacharse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论