网络爬虫项目实战 课件4-2 汽车Scrapy+MTC爬虫实战项目实施_第1页
网络爬虫项目实战 课件4-2 汽车Scrapy+MTC爬虫实战项目实施_第2页
网络爬虫项目实战 课件4-2 汽车Scrapy+MTC爬虫实战项目实施_第3页
网络爬虫项目实战 课件4-2 汽车Scrapy+MTC爬虫实战项目实施_第4页
网络爬虫项目实战 课件4-2 汽车Scrapy+MTC爬虫实战项目实施_第5页
已阅读5页,还剩48页未读, 继续免费阅读

下载本文档

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

文档简介

网络爬虫实战项目式教程《网络爬虫项目实战》进阶篇项目4汽车Scrapy+MTC爬虫项目4.2任务分解4.1项目介绍4.3项目实施目录Content4.4课后练习4.5能力拓展4.2.1数据采集实施过程(1)访问http://:50001/findcar/chengdu.html、http://:50001/findcar/guangzhou.html、:50001/findcar/shanghai.html,显示网站首页,代表网站运行正常。如下图所示。4.2.1

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

数据采集实施过程在左面页面窗口中任意位置点击鼠标右键,选择“重新加载”,再切换到“Doc”选项卡。4.2.1

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

数据采集实施过程(3)打开网站首页(:50001/findcar/chengdu.html),然后在页面空白区域点击鼠标右键,选择“检查”,在右边“Elements”窗口查找div元素,对照左边窗口的显示,找到各个二手车信息div对应的页面元素。如下图所示。4.2.1

数据采集实施过程(4)鼠标停留在网页中车辆名称等字段信息,然后点击鼠标右键后,选择“检查”,查找各个对应字段的XPath路径。从XPath路径“div[@class=”gongge_main“]”开始,“车辆名称”字段对应的XPath相对路径为“/a/span/text()”。4.2.1

数据采集实施过程(5)打开AnacondaPrompt,用下面命令转到PyCharm项目主目录。>cdc:\datacrawling\pyprojects(6)用下面命令创建Scrapy空项目“findcar”。>scrapystartprojectfindcar4.2.1

数据采集实施过程(7)转到findcar子目录。>cdfindcar(8)执行下面命令创建爬虫。其中,car_spider是爬虫名称,是网站域名。>scrapygenspidercar_spider""4.2.1

数据采集实施过程(9)用PyCharm打开项目,展开目录“findcar”,项目结构应该如下图所示。2.3.1项目实施->数据采集(10)修改car_spider.py,设置起始URL指向网站首页。#-*-coding:utf-8-*-importscrapyclassCarSpiderSpider(scrapy.Spider):name=‘car_spider'allowed_domains=['']start_urls=['http://:50001/findcar/chengdu.html’]defparse(self,response):

pass#encoding=utf-8fromscrapyimportcmdlinecmdline.execute('scrapycrawlcar_spider'.split(''))(11)在项目根目录下New->PythonFile,创建startpoint.py,代码如下。4.2.1

数据采集实施过程(12)运行startpoint.py,PyCharm控制台输出如下结果:2022-10-0421:40:18[scrapy.utils.log]INFO:Scrapy1.8.0started(bot:findcar)2022-10-0421:40:18[scrapy.utils.log]INFO:Versions:lxml,libxml22.9.5,cssselect1.1.0,parsel1.5.2,w3lib1.21.0,Twisted18.7.0,Python3.7.0(default,Jun282018,08:04:48)[MSCv.191264bit(AMD64)],pyOpenSSL18.0.0(OpenSSL1.0.2p14Aug2018),cryptography2.3.1,PlatformWindows-10-10.0.19041-SP02022-10-0421:40:18[scrapy.crawler]INFO:Overriddensettings:{'BOT_NAME':'findcar','NEWSPIDER_MODULE':'findcar.spiders','ROBOTSTXT_OBEY':True,'SPIDER_MODULES':['findcar.spiders']}2022-10-0421:40:18[scrapy.extensions.telnet]INFO:TelnetPassword:236a03a9065f23592022-10-0421:40:18[scrapy.middleware]INFO:Enabledextensions:------------------------------------------------------------------------------------------------------2022-10-0421:40:19[scrapy.core.engine]DEBUG:Crawled(404)<GET:50001/robots.txt>(referer:None)2022-10-0421:40:19[protego]DEBUG:Ruleatline1withoutanyuseragenttoenforceiton.2022-10-0421:40:19[scrapy.core.engine]DEBUG:Crawled(200)<GET:50001/findcar/chengdu.html>(referer:None)2022-10-0421:40:19[scrapy.core.engine]INFO:Closingspider(finished)------------------------------------------------------------------------------------------------------'scheduler/enqueued/memory':1,'start_time':datetime.datetime(2022,10,4,13,40,19,43542)}2022-10-0421:40:19[scrapy.core.engine]INFO:Spiderclosed(finished)4.2.1

数据采集实施过程(13)修改findcar/items.py,FindcarItem类添加车辆名称、上牌时间、行驶里程、销售城市、销售价格。importscrapyclassFindcarItem(scrapy.Item):name=scrapy.Field()#车辆名称

year=scrapy.Field()#上牌时间

distance=scrapy.Field()#行驶里程

price=scrapy.Field()#销售价格

city=scrapy.Field()#销售城市4.2.1

数据采集实施过程(14)修改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"]])4.2.1

数据采集实施过程(15)在findcar/settings.py中,反注释ITEM_PIPELINES,启用findcar.pipelines。ITEM_PIPELINES={'carcrawl.pipelines.CarcrawlPipeline':300,}4.2.1

数据采集实施过程(16)在findcar/settings.py中,继续反注释DEFAULT_REQUEST_HEADERS部分,设置User-Agent。cookie和referer为空,不需要设置。DEFAULT_REQUEST_HEADERS={

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

数据采集实施过程(17)修改findcar/car_spider.py,爬取数据。importscrapyfromfindcar.itemsimportFindcarItemitem=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()yielditem4.2.1

数据采集实施过程运行startpoint.py,在项目根目录中,多了一个CSV文件。4.2.2Pandas清洗数据(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控制台输出如下结果:4.2.2Pandas清洗数据pd.set_option()通过Pandas的使用,可以交互式地展示与分析表格(DataFrame)。而表格的格式就显得尤为重要了,因为大部分时候如果nnn直接展示表格,格式并不是很友好。利用pd.set_option()就可以修改Pandas的比如默认情况下,Pandas是不能超出屏幕的显示范围,一旦表的行数很多,就会截断中间的行只显示一部分,此时可以通过设置display.max_rows来控制显示的最大行数。4.2.2Pandas清洗数据(2)从车辆名称提取车辆品牌。车辆名称中包含了车辆品牌,通过str.split()函数可以提取字符串中的信息。df['车辆品牌']=df['车辆名称'].str.split("",expand=True)[0]print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:4.2.2Pandas清洗数据(3)根据上牌时间计算车龄。fromdatetimeimportdatetimenow=datetime.now()year=now.yeardf['上牌时间']=df['上牌时间'].str.replace("年","")df['上牌时间']=df['上牌时间'].astype("int")df['车龄']=year-df['上牌时间']print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:4.2.2Pandas清洗数据Pandas的常用字符串函数在Pandas中,通过DataFrame来存储文件中的内容,其中最常见的数据类型就是字符串。针对字符串,Pandas提供了一系列的函数,以提高操作效率。这些函数可以方便地某一列字符串类型的数据进行操作,Pandas中字符串处理函数以str开头,常用的有以下几种:4.2.2Pandas清洗数据(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控制台输出如下结果:4.2.2Pandas清洗数据(5)删除多余字段,调整字段排列顺序。df=df.drop(axis=1,labels=['车辆名称','上牌时间'])df=df[['销售城市','车辆品牌','车龄','行驶里程','销售价格']]print(df.head())运行data_clean.py,PyCharm控制台输出如下结果:4.2.2Pandas清洗数据(6)保存清洗数据,将清洗后的数据保存到data_clean.csv文件。df.to_csv("data_clean.csv",header=False,index=True)运行data_clean.py,在项目中可以找到一个新文件data_clean.csv。4.2.3MySQL存储数据(1)创建数据库cardb。dropdatabaseifexistscardb;createdatabasecardb;结果如下:4.2.3MySQL存储数据(2)创建表carinfo。usecardb;droptableifexistscarinfo;createtablecarinfo(idint,cityvarchar(200),\

car_brandvarchar(200),car_yearint,car_distanceint,\

car_priceint,primarykey(id))\

charset=utf8;结果如下:4.2.3MySQL存储数据MySQL常用命令MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL常用命令包括:4.2.3MySQL存储数据(3)查看MySQL上传目录。showvariableslike'%secure_file_priv%';结果如下:(4)复制data_clean.csv到MySQL上传目录。4.2.3MySQL存储数据(5)复制data_clean.csv绝对路径到剪贴板。4.2.3MySQL存储数据(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);结果如下:4.2.3MySQL存储数据(7)执行select语句,检查前5条记录。select*fromcarinfolimit5;结果如下:4.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)4.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,""))4.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/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)

returnapp4.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:-?,--helpshowthishelpmessageandexit4.2.4Flask搭建服务点击Run->EditConfiguration。选中manager,编辑Parameters,输入“runserver”。4.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运行。4.2.4Flask搭建服务(9)在app包下New->PythonPackage,创建包models。fromapp.extensionsimportdbclassCarinfo(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)(10)在包app/models下New->PythonFile,创建entities.py,定义Carinfo类。(11)完善app/models/__init__.py,开放Carinfo类。from.entitiesimportCarinfo4.2.4Flask搭建服务(12)完善app/views/main.py,定义get_car_price_by_city和defapi_city_price方法。fromflaskimportBlueprint,jsonifyfromsqlalchemyimportfunc,or_fromapp.extensionsimportdbfromapp.modelsimportCarinfoblueprint=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])4.2.4Flask搭建服务(13)运行app/manager.py,打开Chrome,访问:5000/api/city_price,从服务器返回3个不同城市销售价格数据的列表,表示Flask连接数据库正常。4.2.4

Flask搭建服务Flask框架Flask是一个使用Python编写的轻量级Web应用框架,较同类型的其它框架更为灵活、轻便。Flask可以很好地结合MTC模式进行开发,开发人员分工合作,在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。此外,Flask还有很强的定制性,用户可以根据自己的需求添加相应的功能,实现功能的丰富与扩展,其强大的插件库可以让用户实现开发出功能强大的网站。Flask主要包括Werkzeug和Jinja2两个核心函数库,它们分别负责业务处理和安全方面的功能,这些基础函数为web项目开发过程提供了丰富的基础组件。Werkzeug库十分强大,功能比较完善,支持URL路由请求集成,一次可以响应多个用户的访问请求。Jinja2库支持自动HTML转移功能,能够很好控制外部黑客的脚本攻击。系统运行速度很快,页面加载过程会将源码进行编译形成Python字节码,从而实现模板的高效运行。4.2.4

Flask搭建服务Flask框架Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上,其工作过程如下图:4.2.4

Flask搭建服务Flask框架IT运维的基本点为安全、稳定、高效,运维自动化的目的就是为了提高运维效率,Flask开发快捷的特点正好符合运维的高效性需求。在项目迭代开发的过程中,所需要实现的运维功能以及扩展会逐渐增多,针对这一特点更是需要使用易扩展的Flask框架。另外,由于每个公司对运维的需求不同,所要实现的功能也必须有针对性地来设计,Flask可以很好地完成这个任务。4.2.5Flask+ECharts可视化数据(1)完善app/views/main.py,定义get_car_price_by_city方法。fromflaskimportBlueprint,jsonify,render_template@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目录。4.2.5Flask+ECharts可视化数据(3)在templates目录下NewHTMLFile,创建single_chart.html。4.2.5Flask+ECharts可视化数据(4)修改single_chart.html的代码。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">

<title>单图</title></head><body></body></html>4.2.5Flask+ECharts可视化数据(5)在single_chart.html中

温馨提示

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

评论

0/150

提交评论