数据采集与预处理安俊秀习题答案_第1页
数据采集与预处理安俊秀习题答案_第2页
数据采集与预处理安俊秀习题答案_第3页
数据采集与预处理安俊秀习题答案_第4页
数据采集与预处理安俊秀习题答案_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第1章1.大数据的“5V”特征是什么?大数据的“5V”特征使得数据采集的挑战愈发突出,其分别为Volume(大体量)、Velocity(时效性)、Variety(多样性)、Value(高价值)与Veracity(准确性)。2.Flume中最小日志采集单位是什么,包括哪些部分?Flume被设计成一个分布式的管道架构,可以看作在数据源和目标地之间是一个由Agent(代理,最小日志采集单位)构成的网络。Agent主要由Source、Channel与Sink三个组件组成。3.请概述三大数据采集工具Flume、Logstash、Fluentd之间的区别。不同组件之间有着不同的优势和劣势,总结以下特点。(1)在数据传输方面,Flume更注重于数据的传输,而在数据预处理方面不如Logstash,而在传输上Flume比Logstash更可靠,因为数据会持久化存储在channel中,只有当数据存储在sink端中才会从channel中删除,这个过程保证了数据的可靠性。(2)在数据预处理方面,Logstash属于ELK组件之一,一般会同ELK其它组件一起配合使用,所以其更注重于数据的预处理。(3)在插件和可扩展性方面Logstash有比Flume丰富的插件可选,所以在扩展功能上比Flume全面,而且对比与Fluentd而言Logstash也更加优秀,相比起来Fluentd插件质量不够好,第三方插件大多是使用者根据自己业务需要编写,只为实现特定需求,没有足够的泛化,也没有足够的测试和性能评估。(4)此外在性能和内存占用方面,Fluentd虽然有高性能这一项,可能相对于logstash要好很多,但在实际使用中,解析->转换->入库整个过程性能并不理想。此外Fluentd的性能既因为Ruby消耗过多计算和内存资源,又因为Ruby难以受益于多核,所以对数据吞吐量大的业务来说它是很昂贵的。4.请列举三个常见的爬虫应用场景。爬虫的应用场景已经覆盖到我们生活的方方面面,互联网的各个领域都有爬虫技术的应用,最常见的爬虫应用就是以谷歌、百度为代表的搜索引擎,除此之外爬虫的应用十分广泛,部分应用场景举例如下:(1)购物网站比价系统如今各大电商平台为了活跃用户进行各种秒杀活动并推出各种优惠券等,同样的一件商品在不同网购平台价格可能不同,这就催生各种比价网站。那么这些网站是如何在秒级的时间内知道一件商品在某站有优惠?这就需要一个爬虫系统来实时监控各站的价格浮动。先采集商品的价格,规格,数量等,再做处理,分析,反馈。(2)舆情分析系统顾名思义就是舆论发展的情况有正面和负面之分,利用爬虫技术来监测搜索引擎、新闻门户、论坛、博客、微博、微信、报刊、视频的舆情。根据预定的监控关键词,实现全媒体一键搜索,保证信息搜集的全面性;同时为了丰富数据的多样性,除了采集文本信息之外,还对图像、视频等信息进行采集;为保证其时效性,采用全栈式的响应机制,对于目标网站发布目标信息后,可以在分钟级内采集到本地数据库内。(3)资讯推荐系统通过爬虫技术抓取数新闻源,然后以用户行为属性标签归纳和深度自然语言搜索优化手段来分发给用户,做到千人千面的阅读体验,达到最可观的搜索优化程度。(4)数据买卖利用爬虫收集信息,将数据提供给买数据的公司。比如天眼查,企查查这些公司。5.数据预处理流程中主要包括哪些方法?数据预处理的方法主要包括:数据清洗,数据集成,数据变换,数据规约。第2章1.JSON、CSV数据格式分别是什么样的。答:简单形式的JSON:{"people":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}]}复杂形式的JSON:{"programmers":[{"firstName":"Brett","lastName":"McLaughlin","email":"aaaa"},{"firstName":"Jason","lastName":"Hunter","email":"bbbb"},{"firstName":"Elliotte","lastName":"Harold","email":"cccc"}],"authors":[{"firstName":"Isaac","lastName":"Asimov","genre":"sciencefiction"},{"firstName":"Tad","lastName":"Williams","genre":"fantasy"},{"firstName":"Frank","lastName":"Peretti","genre":"christianfiction"}],"musicians":[{"firstName":"Eric","lastName":"Clapton","instrument":"guitar"},{"firstName":"Sergei","lastName":"Rachmaninoff","instrument":"piano"}]}CSV的格式规范(格式规范定义来源于RFC4180),一共七点:(1)每一行记录位于一个单独的行上,用回车换行符CRLF(也就是\r\n)分割。(2)文件中的最后一行记录可以有结尾回车换行符,也可以没有。(3)第一行可以存在一个可选的标题头,格式和普通记录行的格式一样。标题头要包含文件记录字段对应的名称,应该有和记录字段一样的数量。(在MIME类型中,标题头行的存在与否可以通过MIMEtype中的可选“header”参数指明)。(4)在标题头行和普通行每行记录中,会存在一个或多个由半角逗号(,)分隔的字段。整个文件中每行应包含相同数量的字段,空格也是字段的一部分,不应被忽略。每一行记录最后一个字段后不能跟逗号(通常用逗号分隔,也有其他字符分隔的CSV,需事先约定)。(5)每个字段可用也可不用半角双引号(’’)括起来(不过有些程序,如Microsoft的Excel就根本不用双引号)。如果字段没有用引号括起来,那么该字段内部不能出现双引号字符。(6)字段中若包含回车换行符、双引号或者逗号,该字段需要用双引号括起来。(7)如果用双引号括字段,那么出现在字段内的双引号前必须加一个双引号进行转义。2.通用网络爬虫的流程。答:(1)获取初始URL。初始的URL地址可以由人为地指定,也可以由用户指定的某个或几个初始爬虫网页决定。(2)根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,首先需要爬取对应URL地址中的网页,爬取了对应的URL地址中的网页后,将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,同时将已经爬取的URL地址存放到一个URL列表中保存,用于去重以及判断爬取的进程。(3)将新的URL放到URL队列中。在第2步中,获取到了下一个新的需要爬取的URL地址后,会将新的URL地址放到URL队列中。(4)从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新网页中获取URL,并存放上述爬取过程。(5)满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件。如果没有设置停止条件,爬虫则会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。3.写出核对电话号码的正则表达式。答:myreg=/^[1][3,4,5,7,8][0-9]{9}$/;这个表达式的意思是:1--以1为开头;2--第二位可为3,4,5,7,8,中的任意一位;3--最后以0-9的9个整数结尾。本来只容13,15,17,18,开头的手机号,但是测试mm说有14开头的号码,所以添加了14;当然,如果以后要是发展成有16,或者19,之类的开头号码的话,在[3,4,5,7,8]中添加即可。4.代理如何使用。答:#建立属于自己的开放代理IP池importrequestsimportrandomimporttimefromlxmlimportetreefromfake_useragentimportUserAgentclassIpPool:def__init__(self):#测试ip是否可用urlself.test_url='/get'#获取IP的目标urlself.url='/index_{}.html'self.headers={'User-Agent':UserAgent().random}#存储可用ipself.file=open('ip_pool.txt','wb')defget_html(self,url):'''获取页面'''html=requests.get(url=url,headers=self.headers).textreturnhtmldefget_proxy(self,url): '''数据处理获取ip和端口'''html=self.get_html(url=url)#print(html)elemt=etree.HTML(html)ips_list=elemt.xpath('//table/tbody/tr/td[1]/text()')ports_list=elemt.xpath('//table/tbody/tr/td[2]/text()')forip,portinzip(ips_list,ports_list):#拼接ip与portproxy=ip.strip()+":"+port.strip()#print(proxy)#95:9999self.test_proxy(proxy)deftest_proxy(self,proxy):'''测试代理IP是否可用'''proxies={'http':'http://{}'.format(proxy),'https':'https://{}'.format(proxy),}#参数类型#proxies#proxies={'协议':'协议://IP:端口号'}#timeout超时设置网页响应时间3秒超过时间会抛出异常try:resp=requests.get(url=self.test_url,proxies=proxies,headers=self.headers,timeout=3)#获取状态码为200ifresp.status_code==200:print(proxy,'\033[31m可用\033[0m')#可以的IP写入文本以便后续使用self.file.write(proxy)else:print(proxy,'不可用')exceptExceptionase:print(proxy,'不可用')defcrawl(self):'''执行函数'''#快代理每页url的区别#/free/inha/1/#/free/inha/2/# #提供的免费ip太多#这里只获取前100页提供的免费代理IP测试foriinrange(1,101):#拼接完整的urlpage_url=self.url.format(i)#注意抓取控制频率time.sleep(random.randint(1,4))self.get_proxy(url=page_url)#执行完毕关闭文本self.file.close()if__name__=='__main__':ip=IpPool()ip.crawl()5.数据存储到MySQL数据库中,创建表、增删改查数据的主要方法。答:创建库:importpymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306)cursor=db.cursor()cursor.execute('selectversion()')data=cursor.fetchone()print('Databaseversion:',data)cursor.execute('createdatabasespidersdefaultcharactersetutf8')db.close()创建表:importpymysqldb=pymysql.connect(host='localhost',user='root',password=’123456’,port=3306,db='spiders')cursor=db.cursor()sql='createtableifnotexistsstudents(idvarchar(255)notnull,namevarchar(255)notnull,ageintnotnull,primarykey(id))'cursor.execute(sql)db.close()插入数据importpymysqlid='1234325'name='lili'age='20'db=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')cursor=db.cursor()sql='insertintostudents(id,name,age)values(%s,%s,%s)'try:cursor.execute(sql,(id,name,age))mit()except:db.rollback()db.close()更新数据:importpymysqldb=pymysql.connect(host='localhost',user='root',password=’123456’,port=3306,db='spiders')cursor=db.cursor()sql='updatestudentssetage=%swherename=%s'try:cursor.execute(sql,(25,'Wangwu'))mit()except:db.rollback()db.close()删除数据:importpymysqldb=pymysql.connect(host='localhost',user='root',password='sjy147hhxxttxs',port=3306,db='spiders')cursor=db.cursor()table='students'con='age>18'sql='deleteform{table}where{con}'.format(table=table,con=con)try:cursor.execute(sql)mit()except:db.rollback()db.close()查询数据:importpymysqldb=pymysql.connect(host='localhost',user='root',password='123456',port=3306,db='spiders')cursor=db.cursor()sql='select*fromstudentswhereage>10'try:cursor.execute(sql)print('count:',cursor.rowcount)one=cursor.fetchone()print('first:',one)res=cursor.fetchall()print('res:',res)print('type:',type(res))forrowinres:print(row)except:print('error')第3章1.什么是ajax?答:ajax是Web数据交互方式,使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载整个页面。其作为一种创建交互式、快速动态网页应用的网页开发技术,在无需重新加载整个网页的情况下,就能够更新部分网页。2.获取ajax数据的方法和爬取过程有哪些?答:一种是通过浏览器的审查元素来获取解析地址,另一种是通过Selenium模拟浏览器抓取。比较简单的爬取过程如下:(1)打开浏览器的检查功能。(2)找到数据的真实地址,单击页面中的Network选项,然后刷新网页,进行“抓包”。(3)用request请求这个地址来获取数据。3.如何用浏览器的审查元素来获取解析地址的方式获取豆瓣热门电视剧信息。答:#coding=gbkimporturllib.request,urllib.errordefmain():url="/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0"askURL(url)defaskURL(url):head={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64;rv:84.0)Gecko/20100101Firefox/84.0'}request=urllib.request.Request(url,headers=head,method='GET')#通过请求函数,给它一个请求头html=""try:response=urllib.request.urlopen(request)html=response.read().decode('utf-8')print(html)excepturllib.error.URLErrorase:ifhasattr(e,"code"):print(e.code)ifhasattr(e,"reason"):print(e.reason)returnhtmlif__name__=='__main__':main()4.Selenium是什么?一些动态渲染的页面是请求不到数据应该如何处理?答:Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。针对动态渲染页面,一是我们可以分析ajax请求,分析ajax参数发现其规律,自行模拟ajax请求,二是如果通过ajax参数无法发现其规律,可以利用selenium来模拟浏览器,即通过selenium和chrome

driver利用代码来模拟用户在浏览器上的各种交互。5.如何通过Selenium来获取豆瓣热门电视剧网页的信息。答:fromseleniumimportwebdriverimporttime#初始化一个driver,指定Chrome浏览器driver=webdriver.Chrome()#隐式等待:在查找所有元素时,如果尚未被加载,则等10秒driver.implicitly_wait(10)#请求豆瓣电影剧情排行榜driver.get("/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0")#通过page_source获取网页源代码time.sleep(10)#要等它加载一段时间,才会有数据print(driver.page_source.encode('GBK','ignore').decode('GBK'))#忽略掉非法字符在编译6.如何获取豆瓣热门电视剧前五十?答:importtimefromseleniumimportwebdriverdefclick_to_bottom():js="returnaction=document.body.scrollHeight"height=0#初始化现在滚动条所在高度为0new_height=driver.execute_script(js)#当前窗口总高度whileheight<new_height:#通过模拟点击加载更多将滚动条调整至页面底部foriinrange(height,new_height,200):driver.find_element_by_class_name('more').click()time.sleep(0.5)height=new_heighttime.sleep(0.5)new_height=driver.execute_script(js)ifcondition():break#终止条件defcondition():try:#终止条件是第五十个item的xpathdriver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[4]/div/a[50]')returnTrueexcept:returnFalseif__name__=='__main__':#初始化一个driver,指定Chrome浏览器driver=webdriver.Chrome()#请求豆瓣热门电视剧前五十driver.get("/tv/#!type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0")click_to_bottom()#通过find_element_css_selector方法,将前50个写入数组teleplay中teleplayList=driver.find_elements_by_css_selector('#content>div>div.article>div>div.list-wp>div>a>p')[:50]i=1withopen("teleplay_Top50.txt",'w')asf:forteleplayinteleplayList:f.writelines("NO.{}{}\n".format(i,teleplay.text))i+=1driver.quit()7.什么是Scarpy?Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。Scrapy

使用了

Twisted

异步网络库来处理网络通讯,该框架用途广泛,可以应用在包括数据挖掘,检测和自动化测试,信息处理或存储历史数据等一系列的任务场景中。8.爬虫框架机制是什么?通用爬虫框架定义了编写一个网络爬虫最基本的过程。一个通用的爬虫框架通常包含待抓取的URL列表、已抓取的URL列表、URL下载器、URL解析器、数据库等几个模块。根据任务的需求,还可以加入监控模块、定时启动模块等。第4章1.数据清洗主要包括那几个方面。答:数据清洗主要是包括三个方面,分别是缺失数据处理,异常数据处理和数据转化处理。2.造成缺失值的因素有哪些。答:造成缺失值的主要原因主要有一下六个方面,分别是信息无法获取,信息遗漏,属性不可使用,不重要而被舍弃,数据获取成本过大,以及对于该数据要求实时性高。3.处理缺失值的方法有什么。具体原理是什么。答:缺失值处理的方法主要有三个,分别是删除元组、数据补齐、不处理。删除元组是直接将相关的缺失数据直接删除,适用与删除后对结果影响较小的情况下;数据补齐则是利用多种数据补齐的方法,例如平均值填充,热卡填充等将数据缺失部分补上;不处理则是尽可能保持数据原生模样,防止人为理解的偏差造成的数据分析结果错误。4.删除重复值的时候使用了什么函数。具体如何使用的。答:删除重复值时使用了drop_duplicates()函数,需要去重的函数自生调用该方法,可以通过调整subset和keep参数设置按照那一列去重和保留那个数据。5.检验异常值的方法有哪些。答:检测方法有很多,但是主要思路都是先确立检测标准,将标准转化为具体条件然后进行过滤。本书中介绍的方法为简单描述统计分析,3∂partial原则方法以及Z-score方法。6.数据转换有哪些方法。答:数据转化主要有六种方法,分别为数据类型转化,函数或映射转化,重命名轴索引,连续数据离散化,哑变量处理,数据标准化。7.什么是映射。映射在Python中是如何表现的。答:映射来源于数学中的概念,是指两个元素的集之间元素相互“对应”的关系。在python中主要是通过字典的形式来表现的,分为key值和value值,一一对应的关系。8.map函数是用来干什么的?如何使用。答:map函数在python中是用来处理映射的,map()函数会根据提供的函数对指定序列做映射。使用方法为map(function,iterable,...)。9.什么是哑变量,为什么要使用哑变量。答:哑变量是指将数据转换为一种编码形式进行分析的方法。数据收集过程中很多数据并不是直接为数字表示,这种情况下为了适应算法和库便将数据进行编码转换,通过这种方式方便数据的处理。10.自己编写代码尝试规范化下列数字:200,300,400,600,1000。答:这里采用最大最小规范化,令min=0,max=1,结果分别为:[0,0.125,0.25,0.5,1]第5章1.数据联合的方法中,pandas.merge、pandas.concat与numpy.concatenate三个函数的作用和区别是什么?轴向连接(concatenation):pandas.concat()

可以沿一个轴将多个DataFrame对象连接在一起,形成一个新的Dataframe对象融合(merging):pandas.merge()方法可以根据一个或多个键将不同DataFrame中的行连接起来。数组轴向链接(arrayconcatenation):numpy.concatenate()和pandas.concat()很相似,不同的只在于前者专门针对数组操作,后者专门针对DataFrame对象进行操作。2.多层索引结构的数据中如何选取元素?stack和unstack两个函数的作用和联系?对于多层索引结构,可以使用[]的形式以及loc()和iloc()函数来选取元素。使用[]来选取元素时,不可直接使用最外层以外的其他层级。以下图为例,以下四种元素选取方式都是等价的。#根据多层索引联合取值:#以下4句代码等效:df['math','term2']df.loc[:,('math','term1')]df['math']['term2']df[('math','term1')]stack()为“堆叠”的意思,其作用是将列旋转到行,而unstack()为stack()的反操作,其作用是将行旋转到列。3.为何要使用pivot函数?如何使用unstack函数来达到pivot函数的效果?unstack()方法和pivot()方法是很像的,主要的不同在于,unstack()方法是针对索引或者标签的,即将列索引转成最内层的行索引;而pivot()方法则是针对列的值,即指定某列的值作为行索引,指定某列的值作为列索引,然后再指定哪些列作为索引对应的值。因此,总结起来一句话就是:unstack()针对索引进行操作,pivot()针对值进行操作。但实际上,两者在功能往往可以互相实现,且pivot只是封装了unstack的一个快捷方式而已,其本质上还是先用set_index建立层次化索引,然后用unstack进行重塑,但当多层索引不是原数据自带的,而是由其他列数据转化而来,则此时pivot()函数更加灵活和方便,若原数据中本身带有多层次索引,那么用unstack()就会简单很多,因此,用什么方法取决于原数据的构成。pivot()的函数原型为:DataFrame.pivot(index=None,columns=None,values=None):ReturnreshapedDataFrameorganizedbygivenindex/columnvalues.函数中有3个参数,pivot每次只能处理3个列,其中一个作为行转列后的index,另一个作为行转列之后的columns,最后一个作为行转列后的表格values。pivot会忽略除了以上3个列之外的其他列数据,因此需要使用DataFrame切片、聚合等操作来达成特定的行列转换目标。unstack()和pivot()函数的等价操作如下。首先创建一个DataFrame。importpandasaspddata_df=pd.DataFrame({'userNum':['001','002','003','001','002','003'],'score':[90,96,93,87,82,80],'subjectCode':['01','01','01','02','02','02'],'subjectName':['语文','语文','语文','数学','数学','数学'],'userName':['张三','李四','王五','张三','李四','王五']})data_df结果如下图所示。针对以上数据,我们将userNum和subjectName设置为两层索引,同时使用unstack()将最内层索引subjectName转化为列索引,以此达到了用学号和学科来共同展示学生成绩信息的目的。结果如下图所示。data_df.set_index(['userNum','subjectName']).unstack()而如果我们只需要使用学号和学科来展示学生得分数据的话,还需要单独选取score这一列。data_df.set_index(['userNum','subjectName']).unstack()['score']而想要完成以上操作,pivot()函数只需要一行就能达到与上图完全相同的结果。data_df.pivot(index='userNum',columns='subjectName',values='score')4.简述groupby机制。想要理解GroupBy机制,就必须理解底层逻辑“分拆-应用-聚合”。(1)分拆:之所以叫GroupBy,正是因为有“Group”这个概念。我们用到Group,是因为需要按某个属性(字段)将数据区分为不同的Group,该属性我们通常称之为“分组键”,分组后便可以对每个Group进行操作(如求和、求平均),避免了数据集作为一个整体不好操作的问题。(2)应用:将数据切分为不同的Group并不是最终的目的,我们的目标是针对每个小的group执行一个操作,得到一个结果,这个过程就是“应用”,也是整个GroupBy中最复杂、最有发挥空间的部分。这里的操作可以是最简单的描述性统计和汇总统计,比如求和、求最大值、求最小值、求平均,它们得到的结果通常是一个标量值,也就是一个数。此外还可以加入略复杂的要求,比如同时返回每组最大值和最小值,得到的结果可以是一个Series、列表、字典、DataFrame或是任意你定义的对象类型。比如下图所示便是一个典型的拆分-应用过程。针对上图可以看出,分拆后的结果有以下特点:①分拆后的小group的列(columns)和原数据集是一样的;②分拆后的小group的分组键对应的列的值都是相等的,比如第一个小group里面,部门都是A;第二个则部门都是B③分拆形成的小group的个数,取决于原数据集中分组键对应的列的值去重后的个数,比如上图中原数据集中有4个数据,但是只有A、B、C3个部门,所以最终拆出来的小group就有3个。(3)聚合:聚合相对来说比较好理解一些了,从前面的图中我们可以看到,“应用”是对每一个小group执行了一种或简单或复杂的操作,但是不可能就这么返回给你,所以需要把这些数据给聚合起来,构成一个可读性更高的数据形式给你。简单来说,可以认为在这里pandas对“应用”完成后的每个小group的操作结果做了一个concat操作,也就是轴向上的聚合,也就是从上到下把他们像“堆俄罗斯方块”一样堆起来。在pandas中,堆叠起来的数据要么是Series,要么是DataFrame,也就是说,无论中间对每个小group的操作操作有多复杂,最后返回的结果无外乎就是Series和DataFrame。整个分拆-应用-聚合过程由下图所示。5.(1)按Type分组,求Price的最大值和最小值。(2)按Type分组,对HP进行归一化。(3)按位置分成三组,求Price的平均值。答案:#1result=data.groupby('Type').agg({'Price':['max'],'HP':['min']})print(result)#2defnormalize(x):xMin,xMax=x.min(),x.max()result=(x-xMin)/(xMax-xMin)returnresultresult=data.groupby('Type')['HP'].transform(normalize).head()print(result)#3#可以先看数据的行列:print(data.shape)输出:(60,9)#说明数据有60行,9列condition=['Head']*20+['Mid']*20+['Tail']*20result=data.groupby(condition)['Price'].mean()print(result)第6章1.如何从宏观到微观的对网页内容进行有效的爬取?(1)从宏观上观察网页结构,确定需要爬取的目标位置和结构。在整体上需要把控爬取目标的结构路径以及爬取逻辑和顺序,为后续实际代码的编写做好规划,使后续工作更有条理,避免出错。(2)宏观把控后,针对爬取目标结构进行微观的观察,确定定位时所需的路径和标签,以及对目标需要获取的包或者是进一步的URL链接等元素,或者是以什么样的方式来获取信息、需要对数据进行什么样的预先处理等,敲定为每一部分爬取的代码细节。2.如何使用正则表达式对网页文本内容进行提取?正则表达式(RegularExpression,RE)描述了一种字符串匹配的模式(Pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式主要是针对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。所以针对网页某些目标信息内容的提取,正则表达式就是使用写好的匹配公式,通过在网页源码字符串内容中搜寻目标,来过滤出我们想要的信息。使用步骤如下:(1)首先获取网页源码的HTML字符串内容(2)然后编写正则表达式,例如第六章中针对影片详情链接所书写的表达式。#影片详情链接findlink=pile(r'<ahref="(.*?)">')(3)最后对目标使用正则匹配,提取信息,并保存结果。例如对详情链接的提取代码。#影片详情的链接link=re.findall(findlink,item)[0]data.append(link)3.如何将整理好的数组或列表数据按一定格式保存到本地?按照到第六章对整理好数据的保存过程为例,整个步骤如下:(1)首先创建Workbook对象,并设置编码。book=xlwt.Workbook(encoding="utf-8",style_compression=0)(2)然后创建excel中的表单sheet=book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True)(3)接着对数组或列表进行元素定位,以行列为坐标确定当前书写的单元格,将数据写入。以第六章中二维数组的写入为例。#外层循环定位行foriinrange(0,250):print("第%d条"%i)data=datalist[i]#内层循环,定位列forjinrange(0,8):sheet.write(i+1,j,data[j])(4)最后按照保存路径,对Excel表格进行保存。book.save(savepath)4.数据预处理的常见步骤和常用包有哪些?数据预处理一般包含以下四个步骤。(1)数据清洗:按需处理重复值、缺失值、异常值等数据。(2)数据集成:按一定格式将多个数据源中的数据结合起来存放在一致的数据存储中。(3)数据变换:把当前数据转换成为适合后续数据分析的形式。(4)数据规约:按业务需求和一定形式,将数据进行压缩,或是提取出所需要的属性数据。降维、分组聚合、采样等方式属于这一步骤。一般情况数据处理与分析需要三个包,分别为Pandas、NumPy、Matplotlib这三个包,前两个用于数据读取与分析,最后一个用于绘图。第7章1.在对爬取的数据添加年份时,我们发现实际爬取的数据日期其实出现了跨年份的现象,统一拼接为2022年显然不妥。针对这一情况该如何解决呢?通过datetime.now().year我们可以获得当前的年份数字,将获取到的2022直接减一即可得到前一年的年份,最后在恰当索引的地方拼接不同年份即可。#拼接当前年份temp=''.join([str(datetime.now().year-1),res])具体方法可以是采用iloc分别选取今年的数据和去年的数据,分别拼接不同年份,最后将两个拼接好的数据使用pd.concat()函数的进行纵向合并即可。2.通过最后的词云图可以看到,图中依然有一些无意义的词语或者是杂乱的内容,如何优化我们的文本分词操作,让绘制的词云图更完美?词云图不够完美一般都是因为对文本的预处理和分词操作不够完善,想要从分词上优化这一点无非两个操作:①增加停用词②添加分词字典。第一个方法可以利用根据业务添加的停用词,有效的去除原本词云图中出现的一系列无意义词语,如下图所示,可以人为地添加想要去除的词语。第二个方法则可以有效的对分词错误的部分根据业务术语进行矫正,比如“三大指数”和“元宇宙”被分词为了“股三大”和“宇宙”,这种明显的错误可以通过jieba.add_word()函数来动态添加词典,或者使用jieba.load_userdict()来直接加载本地的自定义词典,进行批量的处理。代码如下所示:jieba.add_word('元宇宙')jieba.load_userdict("my_dict.txt")自定义词典如下如所示。3.如何运用generate_from_frequencies()函数和jieba.analyse模块以更少的代码逻辑绘制出词云图?进行分词时,我们可以直接使用jieba.analyse来进行去除停用词和分词操作。使用extract_tags()函数可以获得指定权重排名数量的关键字词频权重元组列表,将该列表重组为字典后,便可以直接使用在generate_from_frequencies()函数上面生成词云图。使用这种方法的好处是不用手动去除停用词,并且可以修改词频权重从而调节词云图中的细节,不像直接使用WC.generate()无法控制词云图的生成结果。同时结合上题中的内容,我们手动添加新的停用词和词典来进行分词操作,最终形成词云图,下面的代码以comment的内容为例。#jieba.add_word('元宇宙')#加载自定义词典jieba.load_userdict("my_dict.txt")defautoCut(content):#输入停用词jieba.analyse.set_stop_words('cn_stopwords.txt')#去除停用词+词频分析word_list=\jieba.analyse.extract_tags(content,topK=50,withWeight=True)#转化为字典形式以便做词云图word_dict={}foriinword_list:word_dict[i[0]]=i[1]returnword_dict#调用函数进行分词title=autoCut(title)comment=autoCut(comment)importmatplotlib.pyplotaspltfromwordcloudimportWordCloudWC=WordCloud(font_path='C:\\Windows\\Fonts\\STFANGSO.TTF',max_words=50,height=800,width=800,background_color='white',mode='RGBA',collocations=False)#根据给定词频生成词云WC.generate_from_frequencies(comment)#WC.generate(space_comment)plt.figure(figsize=(6,4),dpi=350)#不显示坐标轴plt.axis("off")plt.imshow(WC)最后的绘制结果如下图所示。可以看到这一次的本的词云图更加完善,突出的关键词表达更加清晰。4.简述本章Scrapy项目运行原理,各组件之间是如何协同工作的?Scrapy中的数据流由引擎控制,项目运行原理和各组件的协同过程如下所示:(1)Engine首先打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个要

爬取的URL。(2)

Engine从Spider中获取到第一

个要爬取的URL,并通过Scheduler以Request的形式调度。(3)

Engine向Scheduler请求下一个要爬取的URL。(4)

Scheduler返回下一个要爬取的URL给Engine,Engine

将URL通过Downloader

Middlewares转发给Downloader下载。(5)

一旦页面下载完毕,Downloader生成该页面的Response,并将其通过Downloader

Middlewares发送给Engine。(6)Engine从下载器中接收到Response,并将其通过Spider

Middlewares发送给Spider处理。(7)Spider处理Response,并返回提取到的Item及新的Request给Engine。(8)

Engine将Spider返回的Item给Item

Pipeline,将新的Request给Scheduler。(9)重复第(2)步到第(8)步,直到Scheduler中没有更多的Request,Engine

关闭该网站,爬取结束。利用通过多个组件的相互协作、不同组件完成工作的不同、组件对异步处理的支持,Scrapy最大限度地利用了网络带宽,

大大提高了数据爬取和处理的效率。第8章1.为什么要求数据尽量服从正态分布?在机器学习中,许多模型对具有正态分布的数据训练效果更好,学习速度更快,并且正态分布数据的泛化性更高,因为自然界很多事物的概率密度大多是正态分布的。此外从目标分布来说,非正态分布会导致标签数据的损失值出现误导,或许结果看着很小,但实际结果很大。尤其在回归问题上,对正态分布的数据有着较高的要求。2.如何大量的属性字段之间选取想要的特征?当数据集中数据字段属性特别多,但又不是很清楚哪些属性是我们所需要的时候,有必要先进行合理的数据属性规约,提取出关联度高,有明显线性关系的属性特征来进行后续数据预处理所需要的属性特征。在选择过程中我们可以使用关联矩阵来判断不同属性间的关联性,而

温馨提示

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

评论

0/150

提交评论