Python爬虫与网络数据采集案例实践(微课视频版)课件 第8章 Scrapy 爬虫框架的应用_第1页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第8章 Scrapy 爬虫框架的应用_第2页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第8章 Scrapy 爬虫框架的应用_第3页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第8章 Scrapy 爬虫框架的应用_第4页
Python爬虫与网络数据采集案例实践(微课视频版)课件 第8章 Scrapy 爬虫框架的应用_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

第8章Scrapy爬虫框架的应用学习目标知识目标(1)理解Scrapy框架的基本概念和工作流程。(2)熟悉Scrapy项目的结构及各组件的功能。(3)掌握使用Scrapy编写爬虫和数据提取的基本方法。学习目标能力目标(1)能够独立创建Scrapy项目并编写爬虫。(2)能够使用XPath和CSS选择器提取网页数据。(3)能够将提取的数据存储到不同的格式中,例如CSV和MongoDB。素质目标(1)养成良好的代码编写习惯,提升代码的可读性和可维护性。(2)培养解决问题的能力,能够在遇到爬虫开发中的常见问题时找出解决方案。(3)培养团队合作精神和沟通能力,能够在数据采集项目中与团队成员紧密合作,共同实现采集需求和解决技术难题。思维导图章节内容行业PPT模板/hangye/8.28.38.4Scrapy的工作原理综合案例——采集百度新闻数据拓展案例—采集微博搜索文章信息8.1Scrapy框架概述PATR01Scrapy框架概述COMTENS0102Scrapy简介与特点安装与配置ScrapyScrapy框架概述Scrapy特点Scrapy的高效性主要体现在其异步请求处理和并发抓取能力高效性Scrapy提供了灵活强大的数据提取机制数据提取能力强Scrapy通过其内部机制自动处理多种请求和响应相关的问题,降低了开发者的工作量自动处理请求和响应Scrapy的模块化设计使得框架结构清晰,便于开发者进行管理和扩展模块化Scrapy的中间件系统为用户提供了强大的自定义能力,主要包括请求中间件、响应中间件和自定义扩展丰富的中间件和扩展Scrapy提供了灵活的内置数据存储功能,让数据管理变得简单内置数据存储Scrapy简介与特点8.1.1Scrapy是一个开源的Python框架,专门用于从网站上抓取数据并进行处理,它具有高效的异步处理机制和灵活的中间件架构,可以轻松应对大规模的数据抓取任务Scrapy特点-高效性020301Scrapy基于Twisted异步网络库,允许同时处理多个请求而不必等待每个请求的响应,这样的设计不仅提高了数据抓取速度,而且有效利用了网络带宽Scrapy可以通过配置并发请求数在抓取过程中同时发送多个请求,以便能够面对大规模和复杂网站时快速获取大量数据Scrapy通过对请求队列的有效管理和请求调度,能够降低请求之间的延迟时间,极大提高抓取效率Scrapy特点-模块化010203Scrapy项目的文件结构是按照功能划分的,每个部分都有明确的职责。例如:spiders`目录存放爬虫代码items.py定义数据模型pipelines.py处理数据文件结构模块化模块化的设计使得在修改或扩展某一部分时,不会影响整个项目的其他部分。例如,添加新的数据存储方式或修改爬虫逻辑只需在相应的模块中进行调整设计模块化Scrapy的各个组件如爬虫、Items、Pipeline和中间件都是独立的模块,可以根据需要进行重用和组合,方便开发者建立新的爬虫项目。组件及中间件模块化Scrapy特点-数据提取能力强132Scrapy支持XPath语法,用于定位和提取HTML文档中的元素。XPath允许开发者精确定位复杂的DOM结构,非常适合提取嵌套的数据。除了XPath,Scrapy还支持CSS选择器,这种选择方式更加直观,开发者可以使用常见的CSS语法来选择需要的元素。对于熟悉前端开发的开发者来说,这使得数据提取变得更为简单和快速。Scrapy允许用户定义Item类,来描述所要抓取的数据的结构,通过结合选择器,用户可以方便地提取并存储所需字段Scrapy的中间件系统为用户提供了强大的自定义能力,这样的灵活性使得Scrapy能够适应不同的网站和数据抓取场景用户可以在发送请求前或收到响应后对请求进行处理,如在中间件中添加自定义的用户代理、请求延迟、重试机制等功能010203处理响应后,可以对响应内容进行预处理或过滤,决定是否继续处理该响应。开发者可以根据需要创建自定义的中间件,以满足特定的抓取需求Scrapy特点-丰富的中间件和扩展Scrapy特点-自动处理请求和响应1Scrapy可以自动跟踪HTTP重定向,确保请求能够成功到达目标页面,而开发者无需手动处理重定向2在需要登录或维护会话的网站数据采集过程中,Scrapy能够自动管理Cookies,确保在会话中保持状态3Scrapy内置的HTTP缓存机制可以避免重复请求相同的URL,提升抓取效率并降低对目标网站的压力Scrapy特点-内置数据存储2

1Scrapy能够方便地与数据库(如MongoDB、MySQL等)集成,开发者可以通过Pipeline将数据直接存储到数据库中3Scrapy支持将抓取到的数据输出为多种格式,包括JSON、CSV、XML等,方便后续的数据处理和分析Scrapy的数据存储方式可以在项目设置中轻松配置和调整,用户可以根据实际需求选择合适的存储方式在使用Scrapy进行网页数据抓取之前,需要在你的Python开发环境中安装和配置Scrapy。首先,确保开发环境统一采用本课程标准配置PyCharm-community-2024.1.6,Python版本采用Python3.11.9及以上稳定版本操作系统建议使用Windows、macOS和Linux操作系统其中之一安装Scrapy框架通常很简单,因为它是一个Python库,和安装其它第三方库一样,打开终端或命令提示符,执行以下命令来安装Scrapy这条命令会从Python包索引(PyPI)下载并安装Scrapy及其所有依赖库,安装过程可能需要几分钟时间,具体时间取决于网络速度和计算机性能安装完成后,执行以下命令来查询Scrapy版本,以确定Scrapy是否安装成功如果Scrapy框架安装成功,即可正确显示Scrapy版本,否则显示错误信息,需重新安装安装与配置Scrapy8.1.2pipinstallscrapyscrapy--version创建一个新的Scrapy项目,以创建“myproject”项目为例,需在命令行环境使用以下命令。这里“myproject”是项目名称,这将创建一个名为“myproject”的目录,并包含Scrapy项目的基本结构。项目目录结构如下:创建Scrapy项目8.1.2myproject/scrapy.cfg#项目的配置文件

myproject/#项目的Python包

__init__.pyitems.py#数据模型定义文件

middlewares.py#中间件定义文件

pipelines.py#数据处理管道定义文件

settings.py#项目设置文件

spiders/#存放爬虫代码的目录

__init__.pyscrapystartprojectmyprojectScrapy爬虫示例8.1.2以爬取国家图书馆(/)数字资源为例,编写简单Scrapy爬虫示例,打开终端或命令提示符,执行以下命令来创建Scrapy爬虫这里myspider是爬虫的名称,/是想要爬取的网站。执行结束后,将在当前项目“myproject/spiders/myspider.py”目录下自动创建一个新的爬虫myspider,在PyCharm中打开myspider.py爬虫文件可进一步代码编写以提取国家图书馆的数字资源类别信息Scrapy爬虫示例cdmyproject#进入项目目录scrapygenspidermyspider/#创建目标爬虫8.1.2打开国家图书馆网页,爬取数字资源类别,右击“检查”找到第一条数字资源-古籍特藏的标签,复制XPath,如图所示:Scrapy爬虫示例接下来编写Scrapy代码爬取数字资源类别,打开myspider.py,编写代码如下:Scrapy爬虫代码编写importscrapy

classMySpider(scrapy.Spider):name=‘myspider’#爬虫名称

allowed_domains=[‘’]#指定爬虫被允许爬取的域名列表,确保它只访问特定的网站或域名,从而避免爬取到不相关的内容或违反网站的robots.txt协议及法律法规‌

start_urls=['/’]#定义了爬虫启动时需要访问的初始URL列表

#解析爬虫返回的响应数据,defparse(self,response):#包含了请求所获取的数据和相关信息。通过这个参数,可以在方法内部使用XPath或CSS选择器等工具来提取所需的数据‌

#提取数据的逻辑

div=response.xpath('//ul[@class="wrap-1280resouce-list"]/li')foriinrange(len(div)):title=div[i].xpath('./dl/a/dd/h5/text()').extract_first()print(title)8.1.2接下来运行爬虫,在终端中输入命令如下:结果展示如下:Scrapy爬虫运行scrapycrawlmyspider8.1.2PATR02Scrapy的工作原理Scrapy的核心组件8.2引擎(Engine)引擎是Scrapy的核心调度模块,负责协调各个组件的工作。它接收爬虫的初始请求,通过调度器、下载器和爬虫之间的相互协作来完成整个抓取过程调度器(Scheduler)调度器是Scrapy的核心部分之一,负责接收爬虫生成的请求并将其按顺序发送给下载器。它采用先进的队列算法来管理请求的优先级,确保重要的请求优先被处理下载器(Downloader)下载器负责发送网络请求并接收响应数据。Scrapy的下载器是基于Twisted框架的,它支持异步操作,能够同时处理大量的请求,极大地提高了爬虫的并发性能。爬虫(Spider)Spider是Scrapy项目中用户定义的类,负责指定要抓取的目标网站、要抓取的数据类型以及解析网页的方法。每个Spider都是独立的,可以定义不同的解析逻辑项目管道(ItemPipeline)Pipeline用于处理从网页中提取出来的数据项(Item)。它可以对数据进行处理,典型的处理有清理、验证及持久化(例如存取到数据库中)。当网页被爬虫解析所需的数据存入数据项后,将被发送到项目管道,并经过几个特定的次序处理数据,最后存入本地文件或数据库。Pipeline是可配置的,用户可以根据需要启用多个Pipeline模块,形成数据处理的流水线。下载中间件(DownloaderMiddlewares)下载器中间件是一组在引擎及下载器之间的特定钩子,主要功能是处理下载器传递给引擎的响应。下载器中间件提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。通过设置下载器中间件可以实现爬虫自动更换useragent、IP等功能Spider中间件(SpiderMiddlewares)Spider中间件是一组在引擎及Spiders之间的特定钩子,主要功能是处理Spiders的输入(响应)和输出(Items及请求)。Spider中间件提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。Scrapy技术架构8.2Scrapy工作流程54321调度器接收请求下载器抓取网页内容爬虫解析响应数据数据处理与存储循环进行直到抓取结束Scrapy的工作原理基于其强大的架构和各个组件之间的紧密协作,能够高效地进行大规模的数据抓取。通过理解其工作流程和核心组件,开发者可以更好地利用Scrapy来构建灵活、可扩展的网络爬虫。Scrapy的工作流程可以分为以下几个关键步骤:Scrapy工作流程8.2用户定义的爬虫(Spider)会生成初始请求(Requests),并将其发送给调度器(Scheduler)调度器的主要任务是按照一定的策略管理这些请求,确保每个请求都能被下载器(Downloader)处理。1.调度器接收请求下载器负责将调度器交给它的请求发送到目标网站(Internet),并接收网页的响应内容(Responses)Scrapy的下载器是高度优化的,它可以同时处理多个请求,并利用异步I/O操作来提升效率。2.下载器抓取网页内容Scrapy工作流程8.2下载器将获取的响应(Responses)数据传递给爬虫。爬虫会对这些数据进行解析,提取有用的信息(如标题、链接、文本等),并生成进一步的请求(如需要深入抓取的子页面)。3.爬虫解析响应数据提取到的数据会通过ItemPipeline进行处理。Pipeline可以对数据进行清洗、验证、去重等操作,最终将处理后的数据存储到指定的数据库、文件或其他数据存储系统中。4.数据处理与存储整个流程会不断循环,直到调度器中不再有新的请求为止,此时爬虫任务才会结束。5.循环进行直到抓取结束PATR03综合案例——采集百度新闻数据综合案例——采集百度新闻数据1明确Scrapy项目的基础架构与内在逻辑,清晰各组件的功能及协同运作机制案例目标百度新闻作为国内领先的新闻聚合平台之一,汇聚了源自国内外诸多知名新闻机构的前沿资讯。每日,海量用户依托百度新闻及时掌握最新时事动态,鉴于此,采集百度新闻数据于大数据分析、新闻研究等多领域具备一定的应用价值。本案例聚焦于百度新闻首页,该页面常规展示的是时效性最强的新闻报道以及热点话题。借助抓取首页新闻标题与对应链接,可高效洞悉当下新闻热点,并为后续深度剖析新闻内容与溯源信息奠定基础。在此案例里,将从初始搭建阶段着手构建一个Scrapy爬虫,旨在获取百度新闻首页所展示的新闻标题及其对应的链接。2掌握爬虫构建与调试方法,熟悉编写爬虫抓取网页内容的规范与方法,熟练运用ScrapyShell开展调试工作,能够测试抓取逻辑的合理性与有效性。3掌握解析与提取数据的技术手段,熟练运用XPath和CSS选择器精准定位并提取网页中的特定数据,诸如新闻标题与链接等关键信息。4把握处理与存储数据的策略,学会借助ItemPipeline对抓取所得数据实施清洗、整理与存储操作,以契合后续深度分析与多样化应用需求。5洞悉实际爬虫开发进程中可能遭遇的复杂状况与挑战,诸如应对反爬虫机制、处置动态网页特性等难题,并掌握拓展爬虫功能、优化爬虫性能。案例分析爬虫的基本构建首先,选择项目拟创建的目录,以目录“D:\code\python”为例,使用Scrapy在此目录中创建一个新的项目“AcqBaiduNews”,并创建一个名为“BaiduSpider”的爬虫,指定爬取域的范围为“”,打开终端,输入命令如图所示:8.3.1爬虫的基本构建-项目结构使用PyCharm打开项目AcqBaiduNews,可以看到项目结构如图所示:8.3.1爬虫的基本构建-需求分析打开百度新闻,右键选择检查,分析热点新闻的标签类如图所示:8.3.1爬虫的基本构建-爬虫代码根据网页标签分析结果,打开BaiduSpider.py,实现基本的爬虫逻辑,找到class为“hotnews”的div元素,在此元素下的li元素都是百度新闻的热点新闻,然后使用BeautifulSoup解析页面,并在循环中创建AcqbaidunewsItem类对象(与Item中的类名一致)。最后,我们通过yield语句返回数据。关键代码如下:8.3.1classBaiduspiderSpider(scrapy.Spider):name='BaiduSpider'

allowed_domains=['']

start_urls=['/']defparse(self,response):fornewsinresponse.css(‘.hotnewsli’):#定位热点新闻标签item=AcqbaidunewsItem()#与Item中的类一致item["title"]=news.css('a::text').get()#提取新闻标题

item["url"]=news.css('a::attr(href)').get()#提取新闻链接

yielditem

#当yield一个Item对象时,引擎会将其传递给Pipeline处理爬虫的基本构建-Item代码在Scrapy中,Item用于定义抓取的数据结构。打开项目中的items.py文件,定义一个Item模板名为“AcqbaidunewsItem”,关键如下所示:8.3.1importscrapyimportcsv#导入csv库,用以将数据保存到csv文件classAcqbaidunewsItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()title=scrapy.Item[“title”]#新闻标题项

url=scrapy.Item[“url”]#新闻链接项data=[title,url]filename=‘data.csv’#本地csv文件名#将数据写入到本地csv文件withopen(filename,'a',encoding="utf-8",newline='')asfile:writer=csv.writer(file)

writer.writerow(data)pass爬虫的基本构建-运行爬虫1.在使用Scrapy构建爬虫项目时,通常会使用命令行工具来启动和运行爬虫。在PyCharm的命令行窗口中输入命令运行爬虫在该命令执行完成后,将会在项目根目录下创建一个名为baiduNews.csv的文件,保存所有爬到的新闻数据2.在Scrapy项目的根目录下创建一个新的“main.py”文件,作为启动爬虫的入口,在main.py文件中编写代码cmdline模块是Scrapy提供的用于执行命令行命令的接口,在这里,我们使用它来启动爬虫8.3.1scrapycrawlBaiduSpider-obaiduNews.csvfromscrapyimportcmdline

cmdline.execute("scrapycrawlBaiduSpider".split())为了方便使用PyCharm调试Scrapy项目,需要配置PyCharm,点击Run->EditConfigurations,在弹出窗口中,点击“+”号新建一个运行的Python模块,在弹出窗口中将Name改成spiderBaiduNews,在script处选择新建的main.py文件,设置WorkingDireciton为项目目录,就可以点击PyCharm右上角的运行或者调试按钮来调试运行爬虫程序爬虫的基本构建-运行爬虫8.3.1PyCharm调试Scrapy项目配置:8.3.1采集百度新闻数据基本工作原理1初始化请求:Spider类生成一个初始请求,目标URL为百度新闻网站的首页,并将该请求传递给调度器2请求调度:调度器接收到请求后,将其放入队列中,按照优先级等待下载器处理3请求下载:下载器从调度器中获取请求,发送HTTP请求到目标网站,并接收响应内容4解析响应:下载器将响应传递回Spider,Spider解析HTML内容,提取首页的新闻标题和链接。5生成新的请求和数据项:Spider将提取的标题和链接封装为数据项(Item),同时生成指向详细新闻页面的新请求,并将这些请求发送给调度器6数据处理与存储:Pipeline接收数据项,对数据进行清洗和验证后,存储到本地csv文件中。7继续抓取:调度器继续处理新生成的请求,下载器抓取详细新闻页面的内容,Spider继续解析和提取有用信息,直到所有请求处理完毕使用XPath和CSS选择器提取数据Scrapy自身配备了功能强劲的工具集,专门用以解析与提取网页数据,其中,XPath和CSS选择器当属最为常用的工具手段在Scrapy中,使用XPath非常方便。可以在Selector对象上调用xpath()方法,并传入一个XPath表达式来提取数据。下面通过案例展示Scrapy使用XPath获取百度热点新闻,代码如下所示:8.3.2classBaiduspiderSpider(scrapy.Spider):name='BaiduSpider'

allowed_domains=['']

start_urls=['/']defparse(self,response):results=response.xpath(‘//*[@id=“pane-news”]/div/ul/li’).getall()#使用Xpath提取数据,'//*[@id="pane-news"]/div/ul/li'是一个XPath表达式,它的含义是查找所有的‘<li>’标签,并提取标签内的文本内容。getall()方法获取所有匹配结果,get()方法用于返回匹配到的第一个结果#results=soup.find("div",class_="hotnews").find_all("li")forresinresults:item=AcqbaidunewsItem()item["title"]=res.a.string.strip()item["url"]=res.a.get("href").strip()item["source"]="百度新闻"yielditem使用XPath和CSS选择器提取数据Scrapy同样支持CSS选择器,只需在Selector对象上调用css()方法,并传入一个CSS选择器表达式。下面通过案例代码展示Scrapy使用CSS选择器获取百度热点新闻,代码如下所示:8.3.2classBaiduspiderSpider(scrapy.Spider):name='BaiduSpider'

allowed_domains=['']

start_urls=['/']defparse(self,response):fornewsinresponse.css(‘.hotnewsli’):#使用CSS选择器获取百度热点新闻item=AcqbaidunewsItem()item["title"]=news.css('a::text').get()#提取新闻标题

item["url"]=news.css('a::attr(href)').get()#提取新闻链接

yielditemPATR04拓展案例—采集微博搜索文章信息拓展案例—采集微博搜索文章信息在社交媒体蓬勃发展的背景下,微博作为中国最广泛使用的社交媒体平台之一,积累了大量的用户生成内容和实时信息。这些数据不仅对企业的市场分析、舆情监控有重要价值,也为大数据研究分析提供了丰富的素材。本案例将展示如何使用网络爬虫技术采集微博搜索结果中的文章信息。8.4本案例旨在采集微博搜索页面中关于特定关键词“大熊猫”的文章信息,包括文章内容、作者名称、发布时间和点赞数等。通过采集这些信息,可以进行舆情分析、热点话题研究以及用户行为分析。具体采集任务如下根据输入的关键词,搜索相关微博文章。获取每条微博的作者名称、发布时间、微博的文本内容、转发数量、评论数量、点赞数量。数据存储并进行词云分析。数据采集需求采集思路分析打开微博首页,使用个人账户登录,输入关键词“大熊猫”,可将地址栏的链接复制下来作为爬虫起始页。为了顺利进行信息爬取,右键选择检查,打开开发者工具,选择Elements面板,查看采集目标元素,如图8所示。采集思路分析为了后续顺利采集数据,需要将cookies复制出来备用,选择开发者工具的网络面板,刷新网页,在Fetch/XHR查看响应信息的请求标头,在请求标头中找到cookies,并将其复制备用,如图所示。数据采集代码实现在PyCharm中打开工程项目“CrwalProject”,选择Chapter8Code包。创建一个新的Scrapy项目可以看到将会在Chapter8Code中创建一个weibo文件夹,生成Scrapy工程目录结构。接下来打开items.py文件创建一个scrapy.Item

类用于映射采集到的数据结构,代码如下所示:scrapystartproject

weiboimportscrapyclassWeiboItem(scrapy.Item):author=scrapy.Field()#作者

content=scrapy.Field()#内容

time=scrapy.Field()#

时间

comment_num=scrapy.Field()#评论数

like_num=scrapy.Field()#点赞数

transfer_num=scrapy.Field()#转发数在当前目录下打开PyCharm终端,输入命令如下:scrapygenspider

startweibo"AcqWeibo"将在spider目录下创建一个名为AcqWeibo的爬虫接下来对项目中的Settings.py文件进行设置,代码如下:

数据采集代码实现ROBOTSTXT_OBEY=FalseCOOKIES_ENABLED=FalseTELNETCONSOLE_ENABLED=FalseDEFAULT_REQUEST_HEADERS={#":authority:":"",#":method:":"GET","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7","Accept-Encoding":"gzip,deflate,br,zstd","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Cookie":"PC_TOKEN=2350ead6e7;SCF=ArqZ1DQL1HunpdT3ZtRq2g2Epwt60MMtvuz0A4nyYbylR9q7IbFqBd6lFikO9FrjAtfE39YYKvCkvRwdcUY45fQ.;_s_tentry=;Apache=5895479271617.783.1723172196026;SINAGLOBAL=5895479271617.783.1723172196026;ULV=1723172196034:1:1:1:5895479271617.783.1723172196026:;SUB=_2A25LsfsjDeRhGeFJ7VAZ-SrMzD6IHXVoz3LrrDV8PUNbmtANLWPZkW9Nf2-TIxbmT3ceouPvtHVYTTVe5eG9HUcE;SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9W5yePZkAF3_AJczE0Q9Cmh.5NHD95QNS0qE1h.XehMEWs4DqcjGgHv2dc4rw5tt;ALF=02_1725765747",}LOG_LEVEL="WARNING"ITEM_PIPELINES={"weibo.pipelines.WeiboPipeline":300,}DEFAULT_REQUEST_HEADERS定义了爬虫在发送HTTP请求时使用的默认请求头。请求头是发送给服务器的附加信息,用于告诉服务器请求的具体细节,比如客户端的类型、支持的内容格式等。在此将之前复制的cookies替换过来。LOG_LEVEL="WARNING"表示只记录警告级别及以上的日志(即警告、错误和关键错误)。这样可以减少日志的冗余信息,只关注爬虫运行中的潜在问题。ITEM_PIPELINES设置为启用状态。Settings.py设置解析打开spider目录里的AcqWeibo.py文件,将start_urls的值修改为输入“大熊猫”关键词后的网址,修改parse()方法,获取相应网页中的目标信息,以爬取5页搜索文章为例。代码如右所示。

数据采集代码实现classAcqweiboSpider(scrapy.Spider):name="AcqWeibo"

allowed_domains=[""]

start_urls=[“/weibo?q=%E5%A4%A7%E7%86%8A%E7%8C%AB7”]#修改带关键词网址defparse(self,response):div=response.xpath(‘//div[@class=“card”]’)#使用Xpath解析数据foriinrange(len(div)):author=div[i].xpath(‘./div[1]/div[2]/div[1]/div[2]/a/text()’).extract_first()#作者字段time=div[i].xpath(‘./div[@class=“card-feed”]/div[@class=“content”]/div[@class=“from”]/a[1]/text()’).extract_first()#时间字段content=div[i].xpath(‘./div[@class=“card-feed”]/div[@class=“content”]/p/text()’).extract()#内容字段

transfer_num=div[i].xpath(‘./div[@class=“card-act”]/ul[1]/li[1]/a/text()’).extract()#转发数字段

comment_num=div[i].xpath(‘./div[@class=“card-act”]/ul[1]/li[2]/a/text()’).extract()#评论数字段

like_num=div[i].xpath(‘./div[@class=“card-act”]/ul[1]/li[3]/a/button/span[2]/text()’).extract()#点赞字段

itme=WeiboItem(author=author,time=time,content=content,transfer_num=transfer_num,

comment_num=comment_num,like_num=like_num)#数据打包yielditmeglobalcount_page

count_page+=1print("已获取第"+str(count_page)+"页数据")ifcount_page==5:return

next_url=“”+response.xpath(‘//a[@class=“next”]/@href’).extract_first()#获取下一页urlifnext_url:yieldscrapy.Request(next_url,callback=self.parse)打开pipelines文件,同时进行数据清洗和存储,关键代码如下:

数据采集代码实现classWeiboPipeline:def__init__(self)->None:

self.file_path=“weibo.csv“#定义本地csv文件路径及名称

self.f=open(self.file_path,'w',encoding='utf-8',newline='')

self.file_name=[“author”,“time”,“content”,“transfer_num”,“comment_num”,“like_num”]#定义文件字段

self.writer=csv.DictWriter(self.f,self.file_name)#指定文件的写入方式为csv字典写入,参数1为具体文件,参数2为指定字段名

self.writer.writeheader()#在CSV文件中写入表头defprocess_item(self,item,spider):#数据预处理item["time"]=item["time"].replace('\n','').replace('\r','').replace('\t','').replace('','')item["content"]=''.join(item["content"]).replace('\n','').replace('\r','').replace('\t','').replace('','')item["transfer_num"]=''.join(item["transfer_num"]).replace('\n','').replace('\r','').replace('\t','').replace('','')item["comment_num"]=''.join(item["comment_num"]).replace('\n','').replace('\r','').replace('\t','').replace('','')item["like_num"]=''.join(item["like_num"]).replace('\n','').replace('\r','').replace('\t','').replace('','')ifitem["transfer_num"]=="转发":item["transfer_num"]="0"ifitem["comment_num"]=="评论":item["comment_num"]="0"ifitem["like_num"]=="赞":item["like_num"]="0"

self.writer.writerow(item)returnitemdefclose_spider(self,spider):

self.f.close()在终端输入命令启动爬虫,如下所示:

数据采集项目启动scrapycrawlstartweibo执行完毕后,可见数据已经存储到当前目录的weibo.csv文件中,打开可见包含5页文章的作者、发布时间、内容、转发数、评论数及点赞数。微博文章信息采集工作完成后,可对所获数据作进行进一步的可视化分析处理,以实现对微博平台上特定关键词关联的热门话题更为直观地展示。词云图作为一类行之有效的文本数据可视化方式,具备展现文本数据里高频词汇的优势。借助词云图开展专项分析,能够迅速锁定微博内容里频繁出现的词汇,进而精准探知话题走向以及用户聚焦关切之所在,为深入剖析微博舆论生态与大众关注点提供可视化支撑与关键线索。在进行词云分析时,需要在PyCharm中安装使用以下Python库。jieba:用于中文分词。wordcloud:用于生成词云图。matplotlib:用于显示词云图。在进行词云分析之前,需要先从采集到的微博文章数据中提取文本内容,并进行必要的文本预处理。具体步骤包括:去除停用词:删除“的”、“是”、"的","我","有","这","不","也","很","说","都","等","我们","你","他"等无实际意义的高频词。分词处理:使用中文分词工具jieba对微博文本进行分词,便于生成词云。词频统计:统计分词后的词语出现频率,以便在词云图中展示。

词云分析在weibo目录下创建一个新的Python文件WordCloud.py用于生成词云图,关键代码如下:

词云代码编写importpandasaspdfromwordcloudimportWordCloudimportmatplotlib.pyplotaspltimportPIL.ImageasimageimportnumpyasnpimportjiebaimportrefromwordcloudimportImageColorGeneratorplt.rcParams[‘font.family’]=‘SimHei’#解决字体显示问题plt.rcParams['axes.unicode_minus']=False#解决坐标轴负数的负号显示问题data=pd.read_csv("weibo.csv")data["content"]#自定义停用词列表stopwords=set(["的","年","月","日","就","把","吧","与","又","是","号","在","和","了","我","有","这","不","也","很","说","都","等","我们","你","他"])text=''.join(list(data["content"]))#使用正则表达式去除非法字符,只保留中文字符、字母和数字text=re.sub(r'[^\u4e00-\u9fa5a-zA-Z0-9\s]','',text)words=jieba.cut(text)filtered_words=[wordforwordinwordsifwordnotinstopwords]根据词云模板图绘制词云图,本案例选择安心图模板,实现爱心词云图关键代码如下:

词云代码编写segmented_text=''.join(filtered_words)bg_pic=image.open(“mask.png”)#词云模板图bg_pic=np.array(bg_pic)wordcloud=WordCloud(background_color="white",font_path='c:\windows\Fonts\simhei.ttf',mask=bg_pic,scale=15)wordcloud.generate(segmented_text)image_color=ImageColorGenerator(bg_pic)#提取图片的色彩分布a=wordcloud.recolor(color_func=image_color)plt.figure(figsize=(10,5))plt.imshow(a,interpolation='bilinear')plt.axis('off')plt.show()运行WordCloud.py代码

温馨提示

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

评论

0/150

提交评论