版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络爬虫实战项目式教程《网络爬虫项目实战》进阶篇项目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><scr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 温顾红色记忆传承爱国精神
- 180平方米室内设计方案
- 绘本设计创作汇报
- 儿童医学小科普
- 个人私人教练品牌建设指南
- 变频器专业说明书设计规范
- 客厅装修设计要素与流程解析
- 初步工艺设计答辩
- 环境设计主要类型分析
- 网络安全高级教程课程设计
- 国家职业技术技能标准 4-12-01-01 汽车维修工 人社厅发2018147号
- LNG(天然气)供气站(气化站)安全应急救援预案
- 7.5 歌曲 《红河谷》课件(20张)
- 人工智能导论智慧树知到期末考试答案章节答案2024年哈尔滨工程大学
- 新大象版四年级下册科学全册知识点(精编版)
- 磨床操作培训课件
- GB/T 43189-2023核仪器仪表闪烁体和闪烁探测器的命名(标识)以及闪烁体的标准尺寸
- 预制钢筋混凝土方桩图集
- 民用航空器活动区驾驶员笔试备考题库(含答案)
- 三体系管理手册
- 辣椒初加工项目可研
评论
0/150
提交评论