网络爬虫项目实战 课件全套 何福男 第1-8章 开发环境准备 -社交Selenium爬虫项目_第1页
网络爬虫项目实战 课件全套 何福男 第1-8章 开发环境准备 -社交Selenium爬虫项目_第2页
网络爬虫项目实战 课件全套 何福男 第1-8章 开发环境准备 -社交Selenium爬虫项目_第3页
网络爬虫项目实战 课件全套 何福男 第1-8章 开发环境准备 -社交Selenium爬虫项目_第4页
网络爬虫项目实战 课件全套 何福男 第1-8章 开发环境准备 -社交Selenium爬虫项目_第5页
已阅读5页,还剩441页未读 继续免费阅读

下载本文档

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

文档简介

第1章开学第1课网络爬虫应用项目式教程数据采集与预处理6.1本章介绍1.2知识技术1.3参考书目目录Content1.1课程定义1.4就业方向1.5课程考核1.1课程定义数据采集数据预处理数据可视化(了解)1.1

数据采集应用案例:学业伴侣开发过程6.1本章介绍1.2知识技术1.3参考书目目录Content1.1课程定义1.4就业方向1.5课程考核1.2知识技术数据预处理Pandas:去重、去空值、数据拆分、数据替换等操作数据采集1.Scrapy:爬虫框架2.Requests:爬虫框架3.Selenium:自动化测试工具4.CSSSelector:元素定位5.XPath:元素定位数据可视化Pandas:数据分析Flask:Web服务框架Sqlalchemy:数据统计ECharts:可视化图表库6.1本章介绍目录Content1.1课程定义1.4就业方向1.3参考书目1.2知识技术1.5课程考核1.3

参考书目教材:《网络爬虫项目实战》,电子工业出版社,2023年7月出版。数据处理专业教材,适用于大数据专业学生。该书使用项目式组织数据采集案例,消除初学者对数据采集的陌生感。6.1本章介绍目录Content1.1课程定义1.3参考书目1.4就业方向1.2知识技术1.5课程考核1.4

就业方向6.1本章介绍目录Content1.1课程定义1.3参考书目1.5课程考核1.2知识技术1.4就业方向1.5

课程考核平时成绩期末考试成绩总分70%30%1.课堂表现:考勤、不讲话等。2.课堂提问:正确回答老师的问题;3.课堂作业:及时完成作业;4.课后作业:及时提交网络平台。第1章开发环境准备网络爬虫应用项目式教程《网络爬虫项目实战》入门篇6.1本章介绍1.2知识和技术1.3参考书目目录Content1.1数据采集与预处理1.4就业方向1.1章节简介网络爬虫项目开发环境需要诸多程序协同工作。先用Tomcat搭建好要爬取的网站,再用谷歌浏览器打开相应的网页,用Python语言编写相应的代码爬取数据,通过PyCharm编译代码,将爬取到的数据存储到本地文件或数据库中,再进行相应的数据清洗和可视化。那么这一章的环境准备工作非常重要,是后面所有操作的基础。1.2学习目标1.3软件介绍目录Content1.2学习目标1.1章节介绍1.2学习目标技能目标1.掌握各个软件的下载途径2.掌握各个软件的安装方法知识目标1.了解爬虫项目开发的基本原理2.了解项目需要的各个软件素质目标1.培育项目管理能力2.培育解决实际问题能力1.2学习目标1.3软件介绍目录Content1.3软件介绍1.1章节介绍1.3

软件介绍1. ChromeGoogleChrome是一款由Google公司开发的网页浏览器,该浏览器基于其他开源软件撰写,包括WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。1.3

软件介绍2. AnacondaAnaconda是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,装上Anaconda,相当于把Python和一些如NumPy、SciPy、Pandas、Matplotlib等常用的库自动安装好了,使得安装比常规Python安装要容易。PyCharm是一款功能强大的PythonIDE,使用它能极大的方便用户进行Python语言的开发,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。因此,利用Anaconda和PyCharm可以极大地帮助用户编写和运行代码,提高效率。1.3

软件介绍3. 第三方库Anaconda集成了很多科学计算中所需要的包,如NumPy,SciPy等等,但是因为实际需求,我们会需要导入列表中没有的第三方包,如Selenium、Jieba等,在Anaconda中,我们需要安装所需要的第三方包:。1.3

软件介绍4. ChromeDriverChromeDriver是Chrome驱动,是Python爬虫使用Selenium库模拟打开谷歌浏览器依赖的文件,能模拟用户使用谷歌浏览器。1.3

软件介绍5. PyCharmPyCharm是一种PythonIDE(IntegratedDevelopmentEnvironment,集成开发环境),带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,是一款使用广泛,功能齐全的Python编辑器。配置较为简单、功能强大、使用起来省时省心,对初学者友好。1.3

软件介绍6. JavaJava是由SunMicrosystems公司于1995年5月推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持JavaApplet。1.3

软件介绍7. TomcatTomcat是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,是开发和调试JSP程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。1.3

软件介绍8. MySQLMySQL是一个关系型数据库管理系统,MySQL是目前最受欢迎的开源关系型数据库管理系统。由瑞典MySQLAB公司开发,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。因为它受众广泛,免费,所以它是网络数据采集项目中常用的数据库。网络爬虫抓取数据不是目的,需要的是将抓取的数据进行保存到本地,然后进行相关的数据处理操作应用到实际业务场景才是最终的目标,那么数据的保存就尤为重要了。网络爬虫的数据存储方式一般分两种。一是存储在文件中,包括文本文件和csv文件,二是存储在数据库中,比如说MySQL关系型数据库。1.3

软件介绍9. NavicatNavicat是一套快速、可靠和全面的数据库管理工具,专门用于简化数据库管理和降低管理成本。Navicat图形界面直观,提供简便的管理方法,设计和操作MySQL、Oracle、PostgreSQL等数据。Navicat提供一个直观和设计完善的用户界面,用于创建、修改和管理资料库的所有对象,例如表、视图、函数或过程、索引、触发器和序列。Navicat具有广泛的功能,配备了一套简单、易于使用的用户界面来管理和处理数据。项目2购物Scrapy爬虫项目网络爬虫应用项目式教程《网络爬虫项目实战》入门篇2.1项目介绍2.2任务分解2.3项目实施目录Content2.4课后练习2.5能力拓展2.1.1

项目目标爬取某购物网站的“手机”专栏,按照经销商分组统计评价数,统计结果以柱状图显示。2.1.2学习目标技能目标1.能够使用Scrapy+XPath采集数据2.能够使用Pandas清洗数据3.能够使用Pandas分析数据4.能够使用ECharts可视化数据知识目标1.熟悉数据采集过程2.熟悉数据清洗常见方法3.熟悉数据分析特点4.了解数据可视化形式素质目标1.培育项目管理能力2.培育解决实际问题能力实训目标实训项目爬取购物网站,分析和可视化手机经销商的关注度实操内容1.定位网页元素XPath2.编写Scrapy爬虫3.编写数据清洗代码4.编写数据分析代码5.设计和实施可视化图表2.2任务分解2.1项目目标2.3项目实施目录Content2.4课后练习2.5能力拓展3.2

任务分解从数据采集到可视化,本项目包括以下任务。数据采集商品名称经销商评价数数据清洗删除重复行抽取评价数数据分析统计经销商的商品评价数数据可视化手机经销商关注度柱状图项目2购物Scrapy爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇2.2任务分解2.1项目介绍2.3项目实施目录Content2.4课后练习2.5能力拓展2.3.1项目实施->数据采集(1)转到Tomcat安装目录下的bin目录,运行startup.bat后,打开Chrome,访问:50001/cellphone/list.html,显示网站首页,代表Tomcat运行正常。如下图所示。2.3.1项目实施->数据采集(2)打开AnacondaPrompt,转到PyCharm项目主目录(比如,c:\datacrawling\pyprojects)。(3)创建Scrapy空项目phonecrawler。(4)转到phonecrawler子目录,执行下面命令创建爬虫。其中,phone_spider是爬虫名称,是网站域名。>c:\datacrawling\pyprojects>scrapystartprojectphonecrawler>cdphonecrawler>scrapygenspiderphone_spider2.3.1项目实施->数据采集(5)打开PyCharm,打开项目phonecrawler,展开项目主目录下的子目录phonecrawler,项目结构如下图所示。2.3.1项目实施->数据采集(6)打开File->Settings->ProjectInterpreter,选择第1章安装的AnacondaPython编译器。如下图所示。2.3.1项目实施->数据采集(7)修改phone_spider.py,设置起始URL指向网站首页。#-*-coding:utf-8-*-importscrapyclassPhoneSpiderSpider(scrapy.Spider):name='phone_spider'allowed_domains=['']start_urls=[':50001/cellphone/list.html']defparse(self,response):

pass#encoding=utf-8fromscrapyimportcmdlineRUN_SCRAPY_COMMAND='scrapycrawlphone_spider-ophone_raw.csv'.split('')#注意:用1个空格分隔cmdline.execute(RUN_SCRAPY_COMMAND)(8)在项目根目录下New->PythonFile,创建startpoint.py,代码如下。2.3.1项目实施->数据采集(9)运行startpoint.py,结果如下图所示。2022-07-0808:36:28[scrapy.utils.log]INFO:Scrapy1.8.0started(bot:phonecrawler)2022-07-0808:36:28[scrapy.core.engine]DEBUG:Crawled(404)<GET:50001/robots.txt>(referer:None)2022-07-0808:36:28[protego]DEBUG:Ruleatline1withoutanyuseragenttoenforceiton.2022-07-0808:36:28[scrapy.core.engine]DEBUG:Crawled(200)<GET:50001/cellphone/list.html>(referer:None)2022-07-0808:36:28[scrapy.core.engine]INFO:Closingspider(finished)2022-07-0808:36:28[scrapy.core.engine]INFO:Spiderclosed(finished)2.3.1项目实施->数据采集(10)修改phonecrawler/items.py,PhonecrawlerItem类添加商品名称、评论数、经销商属性。#-*-coding:utf-8-*-#Defineherethemodelsforyourscrapeditems##Seedocumentationin:#/en/latest/topics/items.htmlimportscrapyclassPhonecrawlerItem(scrapy.Item):

#商品名称商品名称=scrapy.Field()#评价数量评价数量=scrapy.Field()#经销商经销商=scrapy.Field()2.3.1项目实施->数据采集(12)访问http://:50001/cellphone/list.html,右键打开检查->Network,查看User-Agent、cookie、referer属性值。如下图所示。2.3.1项目实施->数据采集(13)反注释phonecrawler/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/100.0.4896.127Safari/537.36'}2.3.1项目实施->数据采集(14)回到网站首页,然后点击鼠标右键,选择“检查”,在右边“Elements”窗口查找div元素,对照左边窗口的显示,找到各商品对应的页面元素。如下图所示。商品XPath:div[contains(@class,'product-box')]2.3.1项目实施->数据采集(15)鼠标停留在左面页面窗口中第1件商品的评价数,然后点击鼠标右键后,选择“检查”,查找评价数的XPath路径。如下图所示。评价数XPath相对路径:div[@class='res-info']/div/div[@class='info-evaluate']/a/i/text()2.3.1项目实施->数据采集(16)查看第4件商品的经销商。经销商XPath相对路径:div[@class='res-info']/div/a[contains(@class,'store-class')orcontains(@class,'store-name')]/text()查看第8件商品的经销商。并且2.3.1项目实施->数据采集(17)鼠标停留在左面页面窗口中的商品名称,然后点击鼠标右键后,选择“检查”,查找商品名称的XPath路径。如下图所示。商品名称XPath相对路径:div[@class='res-info']/div[@class='title-selling-point']/a/text()2.3.1项目实施->数据采集XPath常用规则在XPath中,有7种类型的节点:元素、属性、文本、命名空间、处理命令、注释、以及文档(根)节点。XPath文档时被作为节点树来对待的。树的根被称为文档节点或者根节点。(1)XPath基本语法(2)XPath谓词2.3.1项目实施->数据采集XPath常用规则(3)选取未知节点(4)“|”运算符实例2.3.1项目实施->数据采集(18)修改phone_spider.py,爬取网站首页。#-*-coding:utf-8-*-importreimportscrapyfromphonecrawler.itemsimportPhonecrawlerItemclassPhoneSpiderSpider(scrapy.Spider):name='phone_spider'allowed_domains=['']start_urls=[':50001/cellphone/list.html']defparse(self,response):

node_list=response.xpath("//div[contains(@class,'product-box')]")fornodeinnode_list:item=PhonecrawlerItem()#商品名字

name=node.xpath("./div[@class='res-info']/div[@class='title-selling-point']/a/text()").extract()#数据保护

name=name[0]iflen(name)>0else""#替换连续空格到单个空格

item['商品名称']=re.sub("\s+","",name)#评价数量

volume=node.xpath("./div[@class='res-info']/div/div[@class='info-evaluate']/a/i/text()").extract()#数据保护

item['评价数量']=volume[0]iflen(volume)>0else""#经销商

brand=node.xpath("./div[@class='res-info']/div/a[contains(@class,'store-class')orcontains(@class,'store-name')]/text()").extract()#数据保护

item['经销商']=brand[0]iflen(brand)>0else""#详情URLyielditem2.3.1项目实施->数据采集(19)运行startpoint.py,结果如下图所示。商品名称,经销商,评价数量vivoiQOO7传奇12+256G高通骁龙888+增强版LPDDR5120W超快闪充全感操控系统双路线性马达立体双扬UFS3.1双模5G全网通手机,自营,8700+vivoiQOONeo58+256G夜影黑5G新品,柠悦数码旗舰店,1.1万+AppleiPhone12ProMax,自营,4.9万+vivovivoiQOONeo58+256GB夜影黑5G新品手机,柠悦数码旗舰店,1.1万+vivovivoiQOONeo512+256GB云影蓝5G新品手机,柠悦数码旗舰店,1.1万+vivovivoiQOONeo512+256GB像素橙5G新品手机,柠悦数码旗舰店,1.1万+AppleiPhone12128G白色移动联通电信5G全网通,自营,21万+2.3.1项目实施->数据采集(20)回到网站首页,滑动页面到最底端,鼠标停留在页码“2”,然后点击鼠标右键后,选择“检查”,查看页码“2”的XPath路径。如下图所示。最大页码XPath路径://div[@id="bottom_pager"]/div/a[last()]/text()2.3.1项目实施->数据采集(21)完善phone_spider.py,定义list_base_url和offset,start_urls改变为可替换的模板,使爬虫具有翻页爬取功能。#-*-coding:utf-8-*-importreimportscrapyfromphonecrawler.itemsimportPhonecrawlerItemclassPhoneSpiderSpider(scrapy.Spider):name='phone_spider'allowed_domains=['']

list_base_url=":50001/cellphone/list#offset#.html"offset=0#页码偏移量

start_urls=[list_base_url.replace("#offset#","")]defparse(self,response):#更新最大页码

ifself.offset==0:page_num=response.xpath('//div[@id="bottom_pager"]/div/a[last()]/text()').extract()

#数据保护

self.max_pages=(int)(page_num[0])iflen(page_num)>0else0

……

#经销商

brand=node.xpath("./div[@class='res-info']/div/a[contains(@class,'store-class')orcontains(@class,'store-name')]/text()").extract()#数据保护

item['经销商']=brand[0]iflen(brand)>0else""#详情URLyielditem

#页码偏移量加1self.offset+=1#未走到最后一页就继续爬取

ifself.offset<self.max_pages:url=self.list_base_url.replace("#offset#",str(self.offset))yieldscrapy.Request(url,callback=self.parse)2.3.1项目实施->数据采集(22)运行startpoint.py,结果如下图所示。商品名称,经销商,评价数量vivoiQOO7传奇12+256G高通骁龙888+增强版LPDDR5120W超快闪充全感操控系统双路线性马达立体双扬UFS3.1双模5G全网通手机,自营,8700+省略商品名称,经销商,评价数量vivoiQOO7传奇12+256G高通骁龙888+增强版LPDDR5120W超快闪充全感操控系统双路线性马达立体双扬UFS3.1双模5G全网通手机,自营,8700+省略【购机送1年碎屏保】OPPOA8天青色4GB+128GB新品手机6.5英寸水滴屏4230mAh大电池后置AI三摄全网通4G全面屏拍照游戏智能手机oppoa8手机,时器数码专营店,2600+2.3.2项目实施->数据清洗(1)创建data_clean.py,读入phone_raw.csv到DataFrame类型。(2)忽略DataFrame包含的CSV头。(3)删除重复行。#encoding=utf-8importpandasaspd#读入CSV文件到Dataframe对象labels=["商品名称","经销商","评价数量"]df=pd.read_csv('phone_raw.csv',names=labels,encoding='utf-8')print(df.head())#删除第2次爬取生成的csv头df=df[df["评价数量"]!="评价数量"]print(df.head(5))#去重df=df.drop_duplicates()print("去重后记录行数:{}".format(df.shape[0]))2.3.2项目实施->数据清洗(4)建立包含“评价数量”、“单位”列的DataFrame。。(5)根据字段“单位”计算十进制的评价数。#字段“评价数量”裂变成两列:评价数(数字),单位pattern="(?P<评价数>\d*\.?\d*)(?P<单位>.+*)"comment_df=df["评价数量"].str.extract(pattern)print(comment_df.head())#去除评价数量后面的单位defextract_salary(x):ifx["单位"]=="万+":salary=int(eval(x["评价数"])*10000)else:salary=(int)(eval(x["评价数"]))returnsalary#应用extract_salary处理comment_df的每一行comment_df["评价数"]=comment_df.apply(extract_salary,axis=1)#更新原始DataFrame的字段“评价数”df["评价数量"]=comment_df["评价数"]print(df.head())2.3.2项目实施->数据清洗(6)保存清洗后的数据。打开findjob_clean.csv,结果如下图。#保存清洗后的数据df.to_csv("phone_clean.csv",index=False)2.3.3项目实施->数据分析(1)创建data_analysis.py,读入phone_clean.csv到DataFrame类型。(2)按照经销商分组后,统计评价数量。运行结果如下图所示。#encoding=utf-8importpandasaspd#读入CSV文件到Dataframe对象df=pd.read_csv("phone_clean.csv",header=0,encoding="utf-8")print(df.head())#分经销商统计评价数stats_stats=df.groupby(["经销商"]).sum()[["评价数量"]]print(stats_stats)2.3.4项目实施->数据可视化(1)在项目根目录New->Directory,创建app目录。(2)在app目录下New->Directory,创建目录static,然后把echarts.min.js复制到app/static目录。(3)在app目录下New->Directory,创建templates目录。2.3.4项目实施->数据可视化(4)在templates目录下NewHTMLFile,创建single_chart.html。2.3.4项目实施->数据可视化(5)在single_chart.html中引入依赖的JS文件。2.3.4项目实施->数据可视化(6)定义div元素和编写JS代码。JS代码中引用数据分析产生的数据,实例化ECharts图表对象,然后传给div元素显示。项目2购物Scrapy爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇2.2任务分解2.1项目介绍2.4课后练习目录Content2.3项目实施2.5能力拓展2.4课后练习1.选择题1.Scrapy架构包含多个组件,下面( )不属于Scrapy组件。A.Engine(引擎)

B.Downloader(下载器) C.Scheduler(调度器) D.Request(请求)2.一般用( )软件打开CSV文件。A.PyCharm B.VisualStudio C.Excel D.Word3.XPath=”//div[@class=’bottom_pager’]”匹配( )。A.文档中class属性等于’bottom_pager’的所有div。B.文档中class属性等于’bottom_pager’的第一个div。C.当前节点下class属性等于’bottom_pager’的div元素。D.定义bottom_pager类的所有div。2.4课后练习1.选择题4.执行name=re.sub("\s+","",“中国”)后,name=( )。A.“中国”。B.“中国”。C.“中国”。D.“中国

”。5.df是一个DataFrame类型对象,df.apply(func1,axis=1)将( )。A.fun1应用到每列形成的一维数组。B.fun1应用到每行形成的一维数组。C.fun1应用到行、列形成的二维数组。D.不起作用。2.4课后练习2.填空题(1)技术人员想从post.html中想爬取中标公告后保存到post_raw.csv,请完善代码。#encoding=utf-8fromlxmlimportetree#数据采集html=etree.parse('post.html',etree.HTMLParser(encoding="UTF-8"))items=html.xpath(

)fori,iteminenumerate(items):print("第{}条中标公告".format(i+1))seq_no=item.xpath(

)[0]2.4课后练习

print("中标编号={}".format(seq_no))winner_name=item.xpath(

)[0]print("中标单位={}".format(winner_name))amount_char=item.xpath(

)[0]

print("中标金额(大写)={}".format(amount_char))amount_digit=item.xpath(

)[0]print("中标金额(小写)={}".format(amount_digit))withopen('post_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([seq_no,winner_name,amount_char,amount_digit])2.4课后练习2.填空题(2)生成的post_raw.csv中,“中标金额(大写)”列包含前缀”中标金额:”和后缀“(”,技术人员想把中标金额(大写)解析出来保存到post_clean.csv,请完善代码。#encoding=utf-8importpandasaspdlabels=["中标编号","中标单位","中标金额(大写)","中标金额(小写)"]df=pd.read_csv('post_raw.csv',names=labels,encoding='utf-8')print(df.head())2.4课后练习defextract_amount_char(x):x=_____________x=_____________returnxdf[

]=df[

].apply(extract_amount_char)print(df.head())df.to_csv("post_clean.csv",index=False)2.4课后练习3.应用题选择一个销售手机的电商网站,爬取手机经销商关注度数据,用柱状图比较Top5经销商的关注度。项目2购物Scrapy爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇2.2项目描述2.1项目目标2.5能力拓展目录Content2.3项目实施2.4课后练习2.5

能力拓展1.任务目标运用本课学习的技术,完成一个柱状图“手机品牌关注度”,然后把课堂完成的“手机经销商关注度”柱状图放到一个页面展示。结果如下图所示。2.5

能力拓展2.任务分析(1)按照品牌筛选记录(2)统计品牌所有商品的评价数。(4)柱状图可视化品牌评价。2.5

能力拓展3.任务实施(1)筛选华为品牌手机并统计评价数量。(2)筛选苹果品牌手机并统计评价数量。(3)筛选vivo品牌手机并统计评价数量。(4)筛选小密品牌手机并统计评价数量。(5)创建composite_chart.html,设计“手机品牌关注度”柱状图。(6)完善composite_chart.html,把“手机品牌关注度”柱状图和“手机经销商关注度”柱状图放在一个页面。项目3招聘Requests爬虫项目网络爬虫应用项目式教程《网络爬虫项目实战》入门篇3.1项目介绍3.2任务分解3.3项目实施目录Content3.4课后练习3.5能力拓展3.1.1

项目目标爬取某招聘网站北京公司发布的招聘信息,统计不同公司类型的招聘岗位占比,统计结果以饼图显示。如下图所示。3.1.2学习目标技能目标1.能够使用Requests+XPath采集数据2.能够使用Pandas清洗数据3.能够使用Pandas分析数据4.能够使用ECharts可视化数据知识目标1.熟悉数据采集过程2.熟悉数据清洗常见方法3.熟悉数据分析特点4.了解数据可视化形式素质目标1.培育项目管理能力2.培育解决实际问题能力实训目标实训项目爬取某招聘网站,分析和可视化北京地区公司招聘岗位分布实操内容1.定位网页元素XPath2.编写Requests爬虫3.编写数据清洗代码4.编写数据分析代码5.设计和实施可视化图表3.2任务分解3.1项目目标3.3项目实施目录Content3.4课后练习3.5能力拓展3.2

任务分解从数据采集到可视化,本项目包括以下任务。数据采集职位名称公司名称公司属性发布属性数据清洗删除重复行抽取公司类型抽取发布时间数据分析按照公司类型分组统计岗位量数据可视化各类型公司招聘岗位比例饼图项目3招聘Requests爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇3.2任务分解3.1项目介绍3.3项目实施目录Content3.4课后练习3.5能力拓展3.3.1项目实施->数据采集(1)访问,显示网站首页,代表网站运行正常。如下图所示。:50001/findjob/index1.html3.3.1项目实施->数据采集(2)创建PyCharm项目jobvis,手工填写项目路径,选择Anaconda编译器。如下图所示。3.3.1项目实施->数据采集(3)访问网站首页,右键打开检查->Network,查看User-Agent、cookie、referer属性值。如下图所示。3.3.1项目实施->数据采集(4)创建findjob_spider.py,定义get_page函数。importcsvimportreimportrequestsfromlxmlimportetreefromrequests.utilsimportget_encodings_from_contentlist_base_url=":50001/findjob/index1.html"defget_page(url):#从chrome开发者工具复制User-Agent和cookie值(如果有的话)

headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}#发送GET请求

res=requests.get(url,headers)

#查看编码方式

enconding=get_encodings_from_content(res.text)#打印网页内容

html_doc=res.content.decode(enconding[0])returnhtml_doclist_base_url指向网站首页,headers的“User-Agent”值使用上面RequestHeaders复制过来的内容。3.3.1项目实施->数据采集RequestsRequests是基于urllib的HTTP库,爬虫通过Requests库完成发起请求和获取相应。(1)请求参数(2)响应参数3.3.1项目实施->数据采集(5)选择“检查”,在右边“Elements”窗口查找div元素,对照左边窗口的显示,找到各岗位div对应的页面元素。(6)停留在第1个岗位的职位名称,然后点击鼠标右键后,选择“检查”,查找职位名称的XPath路径。3.3.1项目实施->数据采集(7)鼠标停留在左面窗口的单位名称,然后点击鼠标右键后,选择“检查”,找到单位名称的XPath路径。(8)类似上述步骤,查找单位属性和发布时间的XPath路径。单位属性XPath相对路径:div[@class=‘er’]/p[@class=‘dcat’]/text()发布时间对应XPath相对路径:a/p/span[@class='time']/text()。3.3.1项目实施->数据采集(9)findjob_spider.py中增加parse_page。defparse_page(url):#解析页面到html树

page_content=get_page(url)response=etree.HTML(page_content)#提取岗位属性

node_list=response.xpath("//div[@class='j_joblist']/div[@class='e']")fornodeinnode_list:#职位名称

span_value=node.xpath("./a/p/span[@class='jnameat']/text()")iflen(span_value)>0:jobName=re.sub("\s+","",span_value[0])else:jobName="“#单位名称

a_value=node.xpath("./div[@class='er']/a/text()")companyName=a_value[0]iflen(a_value)>0else""

#单位属性,例:['国企|500-1000人']p_value=node.xpath("./div[@class='er']/p[@class='dcat']/text()")iflen(p_value)>0:companyAttr=re.sub("\s+","",p_value[0])else:companyAttr=""#发布时间,例:06-14发布

span_value=node.xpath("./a/p/span[@class='time']/text()")pubTime=span_value[0]iflen(span_value)>0else""#保存职位信息

withopen('findjob_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([jobName,companyName,companyAttr,pubTime])3.3.1项目实施->数据采集defwebsite_crawl():current_page_url=list_base_urlparse_page(current_page_url)

if__name__=='__main__':website_crawl()(10)findjob_spider.py定义website_crawl函数。(11)findjob_spider.py定义主函数。运行findjob_spider.py,结果如下图所示。嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……电气工程技术员,北京中治赛瑞科技有限责任公司,民营公司|少于50人,06-14发布硬件工程师,北京宝盈科技发展有限公司,民营公司|少于50人,06-14发布3.3.1项目实施->数据采集(12)回到网站首页,滑动页面到最底端,鼠标停留在最后一页的页码“5”,然后点击鼠标右键后,选择“检查”,查看页码“5”的XPath路径。从下图看出,页码“5”对应的XPath路径为“//div[@class="p_in"]/ul/li[last()-1]/a/text()”,“//”代表任意路径,“last()”代表最后一个li子结点,“last()-1”代表倒数第2个li子结点。3.3.1项目实施->数据采集(13)修改findjob_spider.py,定义list_base_url和offset,start_urls改变为可替换的模板,完善website_crawl函数,使爬虫具有翻页爬取功能。importrandomfromtimeimportsleeplist_base_url=":50001/findjob/index#offset#.html"defwebsite_crawl():#获取首页内容

start_url=list_base_url.replace("#offset#",str(1))first_page_doc=get_page(start_url)first_page_tree=etree.HTML(first_page_doc)#找到总页数

page_num=first_page_tree.xpath('//div[@class="p_in"]/ul/li[last()-1]/a/text()')

page_num=(int)(page_num[0])iflen(page_num)>0else0#访问所有页面

foriinrange(1,page_num+1)::current_page_url=list_base_url.replace("#offset#",str(i))#sleep(seconds)随机间隔5~10秒爬取页面,防止目标网站拦截

sleep(random.randint(5,10)+random.random())print("爬取第{}页".format(i))parse_page(current_page_url)3.3.1项目实施->数据采集(14)运行findjob_spider.py,结果如下图所示。嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……模拟电路资深设计工程师,辰芯半导体(深圳)有限公司,民营公司|少于50人,06-14发布FAE现场应用工程师,北京维信诺光电技术有限公司,民营公司|50-150人,06-14发布3.3.2项目实施->数据清洗(1)创建data_clean.py,读入findjob_raw.csv到DataFrame类型。(2)删除重复记录。(3)从“单位属性”列抽取出单位类型和规模。importpandasaspdlabels=["职位名称","单位名称","单位属性","发布时间"]df=pd.read_csv('findjob_raw.csv',names=labels,encoding='utf-8')print(df.head())#去重df=df.drop_duplicates()print("去重后记录行数:{}".format(df.shape[0]))#字段“单位属性”裂变成二列:单位类型,规模。pattern="(?P<单位类型>.+)\|(?P<规模>.+)"compdesc_df=df["单位属性"].str.extract(pattern)df["单位类型"]=compdesc_df["单位类型"]df["规模"]=compdesc_df["规模"]df.drop(["单位属性"],axis=1,inplace=True)print(df[["单位类型","规模"]].head())3.3.2项目实施->数据清洗(4)删除“发布时间”列的“发布”后缀。(5)保存清洗后的数据。打开findjob_clean.csv,结果如下图。#字段“发布时间”去掉“发布”后缀。df["发布时间"]=df["发布时间"].str.replace("发布","")print(df["发布时间"].head())#保存清洗后的数据df.to_csv("findjob_clean.csv",index=False)3.3.3项目实施->数据分析(1)创建data_analysis.py,读入findjob_clean.csv到DataFrame类型。(2)按照单位类型分组后,统计招聘岗位数量。运行结果如下图所示。importpandasaspd#读入csv文件到Dataframe对象df=pd.read_csv("findjob_clean.csv",header=0,encoding="utf-8")print(df.head())#按单位类型统计岗位数量stats_stats=df.groupby(["单位类型"]).count()[["职位名称"]].reset_index().rename(columns={"职位名称":"岗位数量"})print(stats_stats)3.3.4项目实施->数据可视化(1)在项目根目录New->Directory,创建app目录。(2)在app目录下New->Directory,创建目录static,然后把echarts.min.js复制到app/static目录。(3)在app目录下New->Directory,创建templates目录。3.3.4项目实施->数据可视化(4)在templates目录下NewHTMLFile,创建single_chart.html。3.3.4项目实施->数据可视化(5)在single_chart.html中引入依赖的JS文件。3.3.4项目实施->数据可视化(6)定义div元素和编写JS代码。JS代码中引用数据分析产生的数据,实例化ECharts图表对象,然后传给div元素显示。项目3招聘Requests爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇3.2任务分解3.1项目介绍3.4课后练习目录Content3.3项目实施3.5能力拓展3.4课后练习1.选择题1.Requests是基于()的HTTP库。A.HTTPB.HTTPSC.ScrapyD.urllib2.request.get(timeout=0.5)中,timeout=0.5表示()。A.客户端最大连接时间等于0.5秒。B.客户端最大连接时间等于0.5分。C.客户端最大连接时间等于0.5毫秒。D.客户端最大连接时间等于0.5小时。3.Requests请求设置User-Agent、cookie、referer的原因是( )。A.默认参数。B.个人习惯。C.服务器要求。D.非空参数。3.4课后练习1.选择题4.执行splited_df=df["单位属性"].str.extract("(?P<单位类型>.+)\|(?P<规模>.+)")后,splited_df最多包含()列。A.0B.1C.2D.35.cypher_text=re.sub("\d+","*","电话)中,\d+代表()。A.0到多个数字。B.1到多个数字。C.0到多个字母。D.1到多个字母。3.4课后练习2.填空题(1)技术人员想从news.html中爬取新闻信息后保存到news_raw.csv,请完善代码。#encoding=utf-8importcsvfromlxmlimportetree#数据采集html=etree.parse('news.html',etree.HTMLParser(encoding="UTF-8"))items=html.xpath(

)3.4课后练习fori,iteminenumerate(items):print("第{}条新闻".format(i+1))data_url=item.xpath("

")[0]print("新闻链接={}".format(data_url))title=item.xpath("

")[0]print("新闻标题={}".format(title))pub_date=item.xpath("

")[0]print("发布时间={}".format(pub_date))withopen('news_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([data_url,title,pub_date])3.4课后练习2.填空题(2)生成的news_raw.csv中,“新闻链接”保存的是相对URL地址,技术人员想转到绝对地址(前面加前缀),也想把“发布时间”的时间连接符“-”删除,最后保存到news_clean.csv。请根据注释中的要求完善代码。#encoding=utf-8importpandasaspdlabels=["新闻链接","新闻标题","发布时间"]df=pd.read_csv('news_raw.csv',names=labels,encoding='utf-8')print(df.head())3.4课后练习#新闻链接中的”./"替换成"/",注意"."是一个通配符,需要用"\."表示符号"."。df["新闻链接"]=___________

print(df.head())#删除发布时间中的"-"df["发布时间"]=____________

print(df.head())df.to_csv(“news_clean.csv",index=False)3.4课后练习3.应用题选择一个招聘网站,爬取某城市的大数据岗位学历和薪资,用柱状图比较不同学历的平均最低工资。项目3招聘Requests爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇3.2项目描述3.1项目目标3.5能力拓展目录Content3.3项目实施3.4课后练习3.5

能力拓展1.任务目标运用本课学习的技术,完成一个柱状图“各学历收入对比”,然后把课堂完成的“各类型公司招聘岗位比例”饼形图放到一个页面展示。结果如下图所示。3.5

能力拓展2.任务分析(1)从页面爬取职位描述和工资范围。(2)抽取学历和最低工资。(3)按学历统计平均最低工资。(4)柱状图可视化不同学历工资。3.5

能力拓展3.任务实施(1)通过Chrome开发者工具,从网站首页查找职位描述的XPath路径。(2)通过Chrome开发者工具,从网站首页查找工资范围的XPath路径。(3)完善findjob_spider.py,从页面爬取职位描述和工资范围。(4)完善data_clean.py,添加“职位描述”和“工资范围”列。(5)完善data_clean.py,添加“工作地点”列、“工作经验”列,、“学历”列。(6)完善data_clean.py,建立“最低工资”列、“最高工资”列、“单位”列。(7)完善data_clean.py,建立“最低工资”列和“单位”列。(8)完善data_analysis.py,按照学历统计最低工资。(9)创建composite_chart.html,设计“各学历收入对比”柱状图。(10)完善composite_chart.html,把“各学历收入对比”柱状图和“各类型公司招聘岗位比例”饼形图放在一个页面。项目4汽车Scrapy+MTC爬虫项目网络爬虫应用项目式教程《网络爬虫项目实战》进阶篇4.1项目介绍4.2任务分解4.3项目实施目录Content4.4课后练习4.5能力拓展4.1.1

项目目标爬取某二手车网站的成都、广州、上海的信息,统计不同城市二手车均价,统计结果以柱形图显示。4.1.2学习目标技能目标1.能够使用Scrapy框架采集数据2.能够使用Pandas清洗数据3.能够使用MySQL存储数据4.能够使用Flask+ECharts可视化数据知识目标1.熟悉数据采集过程2.熟悉数据清洗常见方法3.熟悉数据分析特点4.了解数据可视化形式素质目标1.培育项目管理能力2.培育解决实际问题能力实训目标实训项目爬取某二手车网站,分析和可视化二手车均价实操内容1.搭建Scrapy框架2.编写数据爬虫代码3.编写数据清洗代码4.编写数据分析代码5.设计和实施可视化图表4.2任务分解4.1项目目标4.3项目实施目录Content4.4课后练习4.5能力拓展4.2

任务分解从数据采集到可视化,本项目包括以下任务。数据采集车辆名称上牌时间行驶里程销售城市销售价格数据清洗提取车辆品牌去掉里程单位计算车龄数据分析按照城市分组统计二手车均价数据可视化不同城市二手车均价柱形图网络爬虫实战项目式教程《网络爬虫项目实战》进阶篇项目4汽车Scrapy+MTC爬虫项目4.2任务分解4.1项目介绍4.3项目实施目录Content4.4课后练习4.5能力拓展4.2.1数据采集实施过程(1)访问http://:5

温馨提示

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

评论

0/150

提交评论