Python爬取新浪国内新闻课程设计实验报告(附代码)

1 引言

1.1 研究背景

自从大数据的概念被提出后,互联网数据成为了越来越多的科研单位进行数据挖掘的对象。网络新闻数据占据了互联网数据的半壁江山,相比传统媒体,其具有传播迅速、曝光时间短、含有网民舆论等相关特征,其蕴含的价值也愈来愈大。网络数据正成为潜在宝藏,大量商业信息、社会信息以文本等存储在网页中,这些具有相当大价值的信息不同于传统的结构化数据,属于非结构化数据,需要我们使用一定的技术和方法将其转化为计算机能够理解的特征信息,然后我们才能对其进行分析。

网络爬虫技术是近些年来成熟并流行起来的一项技术。现阶段研究通常集中在各种不同领域下的运用。其通俗的来说就是通过模拟客户端(各种浏览器)发送网络请求,以获取服务端的响应,并按照规则提取指定数据的程序。

利用相关网络爬虫技术与算法,实现网络媒体新闻数据自动化采集与结构化存储,并利用中文分词算法和中文相似度分析算法进行一些归纳整理,得出相关的新闻发展趋势,体现网络新闻数据的挖掘价值。

这里我们采用python爬虫提取新浪网站国内新闻,通过文本进行分析。

1.2 功能与要求

目的:熟悉Python网页爬取方法。分析新浪国内新闻首页页面组织,利用urllib及Beautifulsoup爬取新浪国内新闻。

实现功能:

1. 爬取至少20条新闻。

2. 获取其中一条新闻的具体内容。

3. 获取20条新闻的具体内容,并以单独的文本文档格式进行存储。

1.3 需求分析

1、确定目标网站和数据

在开始爬取新闻数据之前,首先需要确定目标网站和要抓取的数据。本次设计选取新浪新闻网站作为目标网站定要抓取的数据类型新闻标题、具体新闻内容等。

2、使用Python编写爬虫代码

Python提供了丰富的库和工具,用于编写爬虫代码。可以使用第三方库如Requests和BeautifulSoup,或者更高级的工具如Scrapy来构建和运行爬虫。本次实验使用urllib.requestBeautifulSoupos和json模块来进行。

3、数据清洗和处理

在获取到新闻数据后,可能需要进行一些数据清洗和处理,以便于后续的分析。这包括去除无关数据、处理重复项、格式化日期等操作,以确保数据的准确性和一致性。

4、结果可视化

为了更好地理解和展示本次实验的结果,我们采用生成文件夹来存储获取到的含有具体新闻内容的txt文本文件。

使用Python编写爬虫抓取和分析新闻数据,是一项非常有用的技能。通过构建爬虫,并利用Python的数据处理,我们可以快速地获取并分析新闻数据,了解公众的舆情态度。这对于企业的营销决策、舆论危机的处理以及个人的信息收集等方面都具有重要意义。

2 方案设计

该爬虫程序没有用户界面,基于python3.12windows10环境,运行在edit with IDLE3.12(64-bit) 

2.1 总体方案设计

使用流程:点击运行代码后等待爬取即可,爬取完成后显示20条新闻标题以及某一具体新闻内容,并在程序所在文件夹中创建独立文件夹以存放含有具体新闻内容的txt文件

工作流程如图1:根据新浪新闻网国内新闻栏目下的 URL,利用程序获取当天网页下各版面的信息列表,再解析网页得到数据,获取新闻的文章内容和标题。获取到文章标题和正文信息后写入到对的文件中,最后程序结束运行爬取完成。

图1系统总体设计框图

2.2 详细设计方案

2.2.1主要模块介绍

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块让使用者能够有逻辑地组织 Python 代码段把相关的代码分配到一个模块里能让代码更好用,更易懂。模块能定义函数,类和变量,模块里也能包含可执行的代码。

(1)urllib.request

urllib.request可以用来发送request和获取request的结果.

urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证), redirections (重定向), cookies (浏览器Cookies)以及其它内容。

  1.  BS4模块

BS4 (beautiful soup 4)是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间

  1. OS模块

os就是“operating system”的缩写,顾名思义,os模块提供的就是各种 Python 程序与操作系统进行交互的接口。通过使用os模块,一方面可以方便地与操作系统进行交互,另一方面页可以极大增强代码的可移植性。如果该模块中相关功能出错,会抛出OSError异常或其子类异常。

  1. Json模块

json,全称为JavaScript Object Notation,也就是JavaScript对象标记,通过对象和数组的组合表示数据,虽然构造简洁但是结构化程度非常高,是一种轻量级的数据交换格式。主要用于将python对象编码为json格式输出或存储,以及将json格式对象解码为python对象。

2.2.2 获取网页URL

(1)静态网页

静态网页不能简单地理解成静止不动的网页,他主要指的是网页中没有程序代码,只有HTML(即:超文本标记语言),一般后缀为.html,.htm,或者.xml等。虽然静态网页的页面一旦做成,内容就不会再改变了。但是,静态网页也包括一些能动的部分,这些主要是一些GIF动画等

静态网页的打开,用户可以直接双击,并且不管任何人任何时间打开的页面的内容都是不变的。

  1. 动态网页

动态网页是指跟静态网页相对的一种网页编程技术。动态网页的网页文件中除了HTML标记以外,还包括一些特定功能的程序代码,这些代码可以使得浏览器和服务器可以交互,所以服务器端根据客户的不同请求动态的生成网页内容。即:动态网页相对于静态网页来说,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。

动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术(如PHP、ASP、JSP等)生成的网页都可以称为动态网页。

(3)两者在URL上的区别

静态网页的每个网页都有一个固定的URL,且网页URL以.htm、.html、.shtml等常见形式为后缀,而不含有“?”,可以直接双击打开

动态网页中的“?”对搜索引擎检索存在一定的问题,搜索引擎一般不可能从一个网站的数据库中访问全部网页,或者出于技术方面的考虑,搜索之中不去抓取网址中“?”后面的内容,不能直接双击打开

对于我们所要爬取的新浪新闻网站,结合概念可知为动态网页,所以我们需要获取该网页的URL。

3 实验过程

3.1获取网页URL

首先,打开新浪新闻网——国内部分,由于本案例中的新浪新闻网页是动态网页,所以不能直接对此网页进行爬取。通过上网查询资料,本次实验采用API遍历法爬取新闻。需要通过开发者工具,查看该网页的NetWork,找到该网页的API接口URL,并以此作为初始URL进行爬取。

3.1.1 找到API

在该网页下,右击——点击“检查”进入开发者模式,在network 模块中找所求的API,如图2。

2 进入网页开发者模式图

由于数据为json格式,需要在左侧网页部分右击——“重新加载”,以便于显示出全部数据。滑动新闻列表,耐心分析找到传输新闻列表数据的接口地址如图3在其条目下选择Headers,Request URL所包含的即为我们所需要的URL。为:https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1704791844084

3 该网页URL图

3.1.2 打开并读取URL

使用urllib.request中的urlopen()函数打开URL,用read().decode("utf-8")代码来读取并返回bytes对象转换为字符串。

3.2 Beautiful Soup模块使用

是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。

3.2.1 导入模块

from bs4 import beautifulsoup

3.2.2 选择解析器解析指定内容

函数:soup=beautifulsoup(解析内容,解析器)

常用解析器:html.parser,lxml,xml,html5lib

通常来说在选择解析器的时候需要记住两个点,一个是解析时间,另一个是兼容性。四种解析器的优缺点如图4所示:

4 解析器

3.2.3 安装解析器

如图5,在命令提示符中输入命令“pip install beautifulsoup4”来安装解析器。

5 安装解析器图

3.2.4 使用soup.select函数解析数据

soup.select()在源代码中的原型为:select(self, selector, namespaces=None, limit=None, **kwargs)

功能:查找html中我们所需要的内容。我们主要使用的参数是selector,其定义为”包含CSS选择器的字符串“。

我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select()。

(1)通过(HTML)标签名查找

print(soup.select('title'))

print(soup.select('a'))#输出的列表含有多个包含标签<a>的元素

(2)通过CCS类选择器查找

print(soup.select('.story'))

3.2 OS模块使用

os即operating system(操作系统),Python 的 os 模块封装了常见的文件和目录操作。

os.path模块主要用于文件的属性获取,exists是“存在”的意思,所以顾名思义,os.path.exists()就是判断括号里的文件是否存在的意思,括号内的可以是文件路径。

os.path.dirname(file) __file__的含义及解释__file__不是通配符,而是一个变量,表示的是当前py文件的绝对路径(包括当前文件)。在python中双下划线属性和方法用于特殊目的。

os.path.dirname(file)表示py文件的绝对路径(不包括当前文件)。

os.mkdir是Python标准库中的一个函数,用于在当前文件目录下创建新目录。

4 代码实现

#python3.12 windows10
#edit with IDLE3.12(64-bit)

import urllib.request
import json   #处理json格式的数据
import os
from bs4 import BeautifulSoup  #导入类

#读取新浪国内新闻数据
url='https://feed.sina.com.cn/api/roll/get?pageid=121&lid=1356&num=20&versionNumber=1.2.4&page=1&encode=utf-8&callback=feedCardJsonpCallback&_=1701244697056'
res=urllib.request.urlopen(url).read().decode("utf-8")   #打开和读取url返回bytes对象转换为字符串(解码为utf-8)

#解析Json
res=res.split("try{feedCardJsonpCallback(")[1].split(");}catch(e){};")[0]   #split函数用来分离字符串
jsonData = json.loads(res)   #将其他类型的对象转换为python对象

#抓取数据
newslist = []   #创建列表以存放数据
for ent in jsonData['result']['data']:    #通过遍历获取数据
    
    #读取详情页
    restemp=urllib.request.urlopen(ent['url']).read()
    soup = BeautifulSoup(restemp,'html.parser')    #解析restemp

    newstemp={}
    #解析新闻标题
    newstemp['title']=soup.select('.main-title')[0].text  #通过标签名查找标题(文本形式)
    #解析新闻内容
    newstemp['article']=soup.select('#article')[0].text  #通过ccs id选择器查找

    #存入数组
    newslist.append(newstemp)  #向列表末尾添加函数

#打印第一个新闻详情
print('新闻详情:',newslist[0]['article'])
print('  ')

#打印所有新闻标题
print('新闻标题:')
for news in newslist:
    print(news['title'])

#写出所有新闻,到py脚本文件目录下的news文件夹内
path = os.path.dirname(__file__) + '\\news\\'  #获取路径
if not os.path.exists(path):     #如果文件不存在
    os.mkdir(path)      #创建文件
for news in newslist:
    file = open(path + news['title'] + '.txt', "w", encoding='utf-8') #生成并打开txt文件
    file.write(news['article'])            #将数据写入文件
    file.close()             #关闭文件

5 实验结果

5.1 运行结果

6 运行结果

  如图6所示,每次运行所显示的内容为当天的网页新闻。由不同日期显示不同的运行结果可以反过来验证新浪新闻网为动态网页。

如图789,打开代码所在文件夹,生成存放具体新闻内容的文件夹“news”。

7 代码所在文件夹中生成news文件夹

8 文件夹中显示结果

9 某一具体新闻内容

6 课程设计总结

本课题主要通过Python语言,实现了将网页数据抓取并分类提取的任务。课题的设计过程主要完成了以下工作:

(1)整体实现思维设计。

(2)查询相应资料尝试编写代码。

(3)进行代码的功能测试,查询出现问题的解决方法并进行调试。

(4)将各功能实现模块进行合并调试。

(5)结果显示界面进行美化。

本次实验中,通过为了获取网页能用的URL查询资料反复试验的过程,逐步了解到网页有静态网页和动态网页的区分以及获取其各自URL的不同方法。了解到了网页背后数据的模式以及如何去从长篇的代码中利用关键字找到想要获取的内容。在爬取具体某一类数据时,学会了怎样使用解析器和用soup.select函数的不同功能获取不同格式的数据内容。本次实验让我对Python常用模块和函数的使用方法有了进一步的了解。

通过收到课题,到了解课题的目的与要求,再到分析和查找如何分模块实现所要求的功能,体会到了一个课题从提出到调试、改进、实现一步步的过程,对我之后编写一定功能的代码在思路和方法上有很深刻的影响。

7 参考文献

[1]杨露,葛文谦. 基于Python的制造业数据分析可视化平台设计[J]. 《信息化研究》,2018年10月第44卷第5期.

[2]左薇,张熹,董红娟. 主题网络爬虫研究综述[J]. 《软件导刊》,2020年2月第19卷第2期.

[3]董付国,Python程序设计基础(第2版).清华大学出版社,2018.

  • 34
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值