网络爬虫项目实战 课件 项目5 旅游Requests+MTC爬虫项目_第1页
网络爬虫项目实战 课件 项目5 旅游Requests+MTC爬虫项目_第2页
网络爬虫项目实战 课件 项目5 旅游Requests+MTC爬虫项目_第3页
网络爬虫项目实战 课件 项目5 旅游Requests+MTC爬虫项目_第4页
网络爬虫项目实战 课件 项目5 旅游Requests+MTC爬虫项目_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

项目5旅游Requests+MTC爬虫项目网络爬虫应用项目式教程《网络爬虫项目实战》进阶篇5.1项目介绍5.2任务分解5.3项目实施目录Content5.4课后练习5.5能力拓展5.1.1

项目目标爬取某旅游网站的哈尔滨出发的旅游线路,统计不同线路类型的已购人数,统计结果以柱形图显示。5.1.2学习目标技能目标1.能够使用Requests采集数据2.能够使用Pandas清洗数据3.能够使用MySQL存储数据4.能够使用ECharts可视化数据知识目标1.熟悉数据采集过程2.熟悉数据清洗常见方法3.熟悉数据分析特点4.了解数据可视化形式素质目标1.培育项目管理能力2.培育解决实际问题能力实训目标实训项目爬取某旅游网站,分析和可视化不同线路类型的已购人数实操内容1.解析Json数据2.编写数据爬虫代码3.编写数据清洗代码4.编写数据分析代码5.设计和实施可视化图表5.2任务分解5.1项目目标5.3项目实施目录Content5.4课后练习5.5能力拓展5.2

任务分解从数据采集到可视化,本项目包括以下任务。数据采集线路标题线路名称已购人数线路时间数据清洗提取人数提取目的地提取旅游天数删除多余字段数据分析按照旅游线路分组统计购买人数数据可视化不同旅游线路平均购买人数柱形图网络爬虫实战项目式教程《网络爬虫项目实战》进阶篇项目5旅游Requests+MTC爬虫项目5.2任务分解5.1项目介绍5.3项目实施目录Content5.4课后练习5.5能力拓展5.2.1数据采集实施过程(1)访问:50001/gotrip/go.html,显示网站首页,代表网站运行正常。如下图所示。5.2.1

数据采集实施过程(2)打开网站首页,在页面任意位置点击鼠标右键后,选择“检查”,选择“Network”选项卡,查看HTTP请求和返回内容。5.2.1

数据采集实施过程点击“Clear”按钮,清除缓存,然后在左面页面窗口中任意位置点击鼠标右键,选择“重新加载”,再切换到“Doc”选项卡。5.2.1

数据采集实施过程选择“go.html”,查看RequestHeaders,保存User-Agent的属性值。5.2.1

数据采集实施过程切换到“XHR”选项卡,查看JSON数据,JSON数据的URL地址为::50001/gotrip/json/go.json。5.2.1数据采集实施过程XHRXHR是XMLHttpRequest的简称,表示在后台与服务器交换数据,这意味着能够在不加载整个网页的状况下,对网页某部分的内容进行更新。XHR是Ajax的一种用法,而Ajax并非一门语言,只是一种不须要加载整个网页,只是更新局部内容的技术。5.2.1

数据采集实施过程(3)打开PyCharm,File→NewProject创建PyCharm项目gotrip,手工填写项目路径,选择Anaconda编译器(python.exe),如下图所示。5.2.1

数据采集实施过程点击“Create”按钮,进入窗口“OpenProject”,如下图所示。5.2.1

数据采集实施过程点击“OK”按钮,创建空项目gotrip,如下图所示。5.2.1

数据采集实施过程(4)在项目根目录下New→PythonFile,创建data_spider.py,headers的“User-Agent”值使用上面RequestHeaders复制过来的内容。importrequestsimportpprintimportcsvHeaders={

‘User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36'}5.2.1

数据采集实施过程(5)利用get请求获取网页的JSON数据。url=':50001/gotrip/json/go.json'result=requests.get(url,headers=Headers).json()print(result)运行data_spider.py,PyCharm控制台输出如下结果:[{'title':'黔南6天5夜跟团游','name':'网红梵净山·全景贵州六日游✔真纯玩✔宿2景区内✔头等舱车20人团✔豪华住宿✔黄果树瀑布✔荔波小七孔✔西江苗寨✔镇远古镇+机票','pic':'./image/1.jpg','type':'跟团游','cash':'3929','time':'6月16日...8月31日多团期','buy':'33人已购'},{'title':'三亚5天4夜自由行','name':'「官方自营」「亲子💞情侣优选」三亚丽禾温德姆酒店,精选雅致房4晚🐳黄金地段、国际连锁🏄坐拥15000平米商业广场','pic':'./image/15.jpg','type':'自由行','cash':'983','time':'天天','buy':'0人已购'}]5.2.1

数据采集实施过程(6)修改JSON数据的格式。url=':50001/gotrip/json/go.json'result=requests.get(url,headers=Headers).json()pprint.pprint(result)[{'buy':'33人已购','cash':'3929','name':'网红梵净山·全景贵州六日游✔真纯玩✔宿2景区内✔头等舱车20人团✔豪华住宿✔黄果树瀑布✔荔波小七孔✔西江苗寨✔镇远古镇+机票','pic':'./image/1.jpg','time':'6月16日...8月31日多团期','title':'黔南6天5夜跟团游','type':'跟团游'},{'buy':'0人已购','cash':'983','name':'「官方自营」「亲子💞情侣优选」三亚丽禾温德姆酒店,精选雅致房4晚🐳黄金地段、国际连锁🏄坐拥15000平米商业广场','pic':'./image/15.jpg','time':'天天','title':'三亚5天4夜自由行','type':'自由行'}]运行data_spider.py,PyCharm控制台输出如下结果:5.2.1数据采集实施过程pprintpprint模块提供了打印出任何Python数据结构类和方法。pprint包含一个“美观打印机”,用于生成数据结构的一个美观视图。格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅读。将原来输出尽可能放在一行上而分解为多行显示,并且带有必要的缩进。5.2.1

数据采集实施过程(7)利用for循环读取每一个数据。url=':50001/gotrip/json/go.json'result=requests.get(url,headers=Headers).json()forinfoinresult:pprint.pprint(info)

break运行data_spider.py,PyCharm控制台输出如下结果:{'buy':'33人已购','cash':'3929','name':'网红梵净山·全景贵州六日游✔真纯玩✔宿2景区内✔头等舱车20人团✔豪华住宿✔黄果树瀑布✔荔波小七孔✔西江苗寨✔镇远古镇+机票','pic':'./image/1.jpg','time':'6月16日...8月31日多团期','title':'黔南6天5夜跟团游','type':'跟团游'}5.2.1

数据采集实施过程(8)提取字段信息。url=':50001/gotrip/json/go.json'result=requests.get(url,headers=Headers).json()forinfoinresult:title=info['title']#线路标题

name=info['name']#线路名称

type=info['type']#线路类型

buy=info['buy']#已购人数

print(title,name,type,buy)运行data_spider.py,PyCharm控制台输出如下结果:黔南6天5夜跟团游网红梵净山·全景贵州六日游✔真纯玩✔宿2景区内✔头等舱车20人团✔豪华住宿✔黄果树瀑布✔荔波小七孔✔西江苗寨✔镇远古镇+机票跟团游33人已购三亚5天4夜自由行「官方自营」「亲子💞情侣优选」三亚丽禾温德姆酒店,精选雅致房4晚🐳黄金地段、国际连锁🏄坐拥15000平米商业广场自由行0人已购5.2.1

数据采集实施过程(9)设置循环翻页。importrequestsimportpprintimportcsvHeaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36'}page_list=['','2','3','4','5']forpageinpage_list:url=':50001/gotrip/json/go{}.json'.format(page)result=requests.get(url,headers=Headers).json()forinfoinresult:#pprint.pprint(info)title=info['title']#线路标题

name=info['name']#线路名称

type=info['type']#线路类型

buy=info['buy']#已购人数

print(title,name,type,buy)5.2.1

数据采集实施过程运行data_spider.py,PyCharm控制台输出如下结果:黔南6天5夜跟团游网红梵净山·全景贵州六日游✔真纯玩✔宿2景区内✔头等舱车20人团✔豪华住宿✔黄果树瀑布✔荔波小七孔✔西江苗寨✔镇远古镇+机票跟团游33人已购大理6天5夜跟团游口碑纯玩💎温泉酒店!升动车返昆の5A精华景点+印象丽江+雪山登顶+吉普车环洱海+圣托里尼丨篝火晚会丨大理丽江6日跟团游0人已购三亚3天2夜自由行「好货预售」三亚海棠湾红树林度假酒店聆海泳池一居别墅2晚|豪车接送+网红体验自由行0人已购可以看出,共爬取第1页到第5页的75条数据。5.2.1

数据采集实施过程(10)保存数据。importrequestsimportpprintimportcsvHeaders={'user-agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36'}withopen('./data.csv',mode='a',encoding='utf-8',newline='')asf:f.truncate(0)writer=csv.writer(f)writer.writerow(['线路标题','线路名称','线路类型','已购人数'])page_list=['']forpageinpage_list:url=':50001/gotrip/json/go{}.json'.format(page)result=requests.get(url,headers=Headers).json()forinfoinresult:#pprint.pprint(info)title=info['title']#线路标题

name=info['name']#线路名称

type=info['type']#线路类型

buy=info['buy']#已购人数

print(title,name,type,buy)

withopen('./data.csv',mode='a',encoding='utf-8',newline='')asf:writer=csv.writer(f)writer.writerow([title,name,type,buy])5.2.2Pandas清洗数据(1)在项目根目录New→PythonFile,创建data_clean.py。5.2.2Pandas清洗数据(2)读入data.csv数据,并转换为DataFrame类型。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控制台输出如下结果:5.2.2Pandas清洗数据(3)从已购人数中提取人数,并转换为整型。df['已购人数']=df['已购人数'].str.replace("人已购","")df['已购人数']=df['已购人数'].astype("int")print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:5.2.2Pandas清洗数据(4)从线路标题中提取目的地。df['目的地']=df['线路标题'].str.split("",expand=True)[0]print(df[['线路类型','已购人数','目的地']].head())运行data_clean.py,PyCharm控制台输出如下结果:5.2.2Pandas清洗数据str.split()函数str.split()方法可以实现将DataFame中的一列数据按照对字符串进⾏分割,然后以列表形式进⾏输出,expand=True表示将分割后扩充成新的一列。5.2.2Pandas清洗数据(5)从线路标题中提取旅游天数。df['旅游时间']=df['线路标题'].str.split("",expand=True)[1]df['旅游天数']=df['旅游时间'].str.split("天",expand=True)[0]df['旅游天数']=df['旅游天数'].astype("int")print(df[['线路类型','已购人数','目的地','旅游天数']].head())运行data_clean.py,PyCharm控制台输出如下结果:5.2.2Pandas清洗数据(6)删除多余字段。df=df.drop(axis=1,labels=['线路名称','旅游时间'])print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:5.2.2Pandas清洗数据(7)完善data_clean.py,保存清洗后的数据。df.to_csv("data_clean.csv",header=False,index=True)运行data_clean.py,PyCharm控制台输出如下结果:5.2.3MySQL存储数据(1)创建数据库tripdb。dropdatabaseifexiststripdb;createdatabasetripdb;结果如下:5.2.3MySQL存储数据(2)创建表tripinfo。usetripdb;droptableifexiststripinfo;createtabletripinfo(idint,trip_titlevarchar(200),\

trip_typevarchar(200),trip_buyint,\

destinationvarchar(200),dayint,primarykey(id))\

charset=utf8;结果如下:5.2.3MySQL存储数据(3)查看MySQL上传目录。showvariableslike'%secure_file_priv%';结果如下:(4)复制data_clean.csv到MySQL上传目录。5.2.3MySQL存储数据(5)复制data_clean.csv绝对路径到剪贴板。5.2.3MySQL存储数据(6)导入data_clean.csv到tripinfo表。其中,替换data_clean.csv的绝对路径中的“\”要换成“\\”,因为“\”在MySQL中是转义符。loaddatalocalinfile"C:\\ProgramData\\MySQL\\MySQLServer5.7\\Uploads\\data_clean.csv"\intotabletripinfo\charactersetutf8fieldsterminatedby','

\linesterminatedby'\r\n'\(id,trip_title,trip_type,trip_buy,destination,day);结果如下:5.2.3MySQL存储数据(7)执行select语句,检查前5条记录。select*fromtripinfolimit5;结果如下:5.2.4Flask搭建服务(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.2.4Flask搭建服务(5)在app/views包下New->PythonFile,创建main.py,定义blueprint变量。fromflaskimportBlueprintblueprint=Blueprint("main",__name__)(6)完善app/views/__init__.py,定义DEFAULT_BLUEPRINT变量。fromapp.views.mainimportblueprintDEFAULT_BLUEPRINT=((blueprint,""))5.2.4Flask搭建服务(7)完善app/__init__.py,定义Config类、config_blueprint方法、create_app方法。fromflaskimportFlaskfromapp.extensionsimportconfig_extensionsfromapp.viewsimportblueprintclassConfig:SQLALCHEMY_COMMIT_ON_TEARDOWN=TrueSQLALCHEMY_TRACK_MODIFICATIONS=FalseSQLALCHEMY_DATABASE_URI="mysql+pymysql://root:123456@:3306/tripdb?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)

returnapp5.2.4Flask搭建服务(8)在app包下New->PythonFile,创建manager.py。fromflask_scriptimportManager,Serverfromappimportcreate_app,Configif__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:-?,--helpshowthishelpmessageandexit5.2.4Flask搭建服务点击Run->EditConfiguration。选中manager,编辑Parameters,输入“runserver”。5.2.4Flask搭建服务再次右键选中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运行。5.2.4Flask搭建服务(9)在app包下New->PythonPackage,创建包models。fromapp.extensionsimportdbclassTripinfo(db.Model):tablename_='tripinfo'id=db.Column(db.String(20),primary_key=True)trip_title=db.Column(db.String(200))trip_type=db.Column(db.String(200))trip_buy=db.Column(db.Integer)destination=db.Column(db.String(200))day=db.Column(db.Integer)(10)在包app/models下New->PythonFile,创建entities.py,定义Tripinfo类。(11)完善app/models/__init__.py,开放Tripinfo类。from.entitiesimportTripinfo5.2.4Flask搭建服务(12)完善app/views/main.py,定义get_buy_by_trip_type和api_type_buy方法。fromflaskimportBlueprint,jsonify,render_templatefromsqlalchemyimportfunc,or_fromapp.extensionsimportdbfromapp.modelsimportTripinfoblueprint=Blueprint("main",__name__)defget_buy_by_trip_type():rows=db.session.query(Tripinfo.trip_type,func.avg(Tripinfo.trip_buy))\.group_by(Tripinfo.trip_type).all()x=[]y=[]forrowinrows:x.append(row[0])y.append((int)(row[1]))returnx,y@blueprint.route("/api/type_buy")defapi_type_buy():x,y=get_buy_by_trip_type()returnjsonify([x,y])5.2.4Flask搭建服务(13)运行app/manager.py,打开Chrome,访问:5000/api/type_buy,从服务器返回包含不同类型购买人数的列表,表示Flask连接数据库正常。5.2.5Flask+ECharts可视化数据(1)完善app/views/main.py,定义get_buy_by_trip_type方法。fromflaskimportBlueprint,jsonify,render_templatefromsqlalchemyimportfunc,or_fromapp.extensionsimportdbfromapp.modelsimportTripinfoblueprint=Blueprint("main",__name__)defget_buy_by_trip_type():rows=db.session.query(Tripinfo.trip_type,func.avg(Tripinfo.trip_buy))\.group_by(Tripinfo.trip_type).all()x=[]y=[]forrowinrows:x.append(row[0])y.append((int)(row[1]))returnx,y@blueprint.route("/type_buy")deftype_buy():x,y=get_buy_by_trip_type()returnrender_template('single_chart.html',x_data=x,y_data=y)5.2.5Flask+ECharts可视化数据(2)在app包下New->Directory,创建templates目录。(3)在templates目录下NewHTMLFile,创建single_chart.html。5.2.5Flask+ECharts可视化数据(4)修改single_chart.html的代码。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>单图</title></head><body></body></html>5.2.5Flask+ECharts可视化数据(5)在single_chart.html中引入依赖的JS文件。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>单图</title><scriptsrc="../static/echarts.min.js"></script></head><body></body></html></html>5.2.5Flask+ECharts可视化数据(6)完善single_chart.html,定义div元素和编写JS代码。JS代码中引用数据分析产生的数据,实例化ECharts图表对象,然后传给div元素显示。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>单图</title><scriptsrc="../static/echarts.min.js"></script></head><body><divid="chart1"style="float:left;width:600px;height:400px"></div></body></html><script>varmychart1=echarts.init(document.getElementById("chart1"));varxdata=[{%foriinx_data%}"{{i}}",{%endfor%}];varydata=[{%foriiny_data%}"{{i}}",{%endfor%}];varoption={title:{text:'不同旅游类型平均购买人数',x:'center',textStyle:{color:'red',fontWeight:'bold',fontSize:'20'}},tooltip:{trigger:'axis'},xAxis:[{type:'category',data:xdata,name:'',axisLabel:{interval:0,rotate:10}}],yAxis:{type:'value',name:'购买人数'},series:[{type:'bar',name:xdata,data:ydata}]};mychart1.setOption(option);5.2.5Flask+ECharts可视化数据(7)打开Chrome浏览器,访问:5000/api/type_buy,可视化结果如下图所示。项目5旅游Requests+MTC爬虫实战网络爬虫实战项目式教程《网络爬虫项目实战》进阶篇5.2任务分解5.1项目介绍5.4课后练习目录Content5.3项目实施5.5能力拓展5.4课后练习1.选择题1.在“Network”中,为了查看“User-Agent”的信息,可以点击()。A.Headers B.Preview

C.Response D.Timing2.使用添加方式写入CSV文件数据,可以在open()函数中使用()。A.mode='r' B.mode='rw' C.mode='a' D.mode='w'5.4课后练习1.选择题3.在Pandas中,pd.set_option('display.width',None)表示()。A.不限制显示行数 B.不限制显示宽度 C.不限制显示行数 D.设置数据对齐4.在Pandas中,拆分字符串,可以使用函数()。A.strip() B.replace() C.find() D.split()5.4课后练习1.选择题5.在Pandas中,head()表示选取开始某几行,其默认参数为()。A.1

B.2

C.5 D.106.去掉DataFrame中的某一列中的字符“年”,可以使用()。A.aschange("int") B.type("int") C.change("int") D.astype("int")5.4课后练习1.选择题7.在将数据保存为CSV时,如果要将自动索引保存为一列,可以使用(

温馨提示

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

评论

0/150

提交评论