python爬取网页新闻内容_python爬取某站新闻,并分析最近新闻关键词

2024-02-15 20:30

本文主要是介绍python爬取网页新闻内容_python爬取某站新闻,并分析最近新闻关键词,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错:

一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任何规律的升序。

解决办法:

使用 range 顺序爬取,错误的网站在页面会报如图错误:

这时我们首先去判断返回页面是否包含 str 'Sorry, Page Not Found',如果包含则跳过,不包含则爬取页面关键信息

1736986-20200227130311298-939817471.png

二、在爬取过程中发现有其它页面,该内容已经被撤销,这时我正常去判断页面,并跳过,发现无法跳过

1736986-20200227130745752-1249884744.png

1736986-20200227131001058-19616511.png

解决办法:

查看页面编码为:UTF-8

1736986-20200227131102193-1598045933.png

在用 if 判断页面是否存在 str 时,首先将页面内容进行UTF-8编码即可解决:

response.encoding = 'utf-8'

三、在爬取网站时,遇到了没有 text 的主页面,新闻全部为图片

解决办法:这时查看图片页面和新闻页面的不同

图片页面关键标签:

1736986-20200227131648681-511037001.png

新闻页面关键标签:

1736986-20200227131828268-1808113689.png

发现div标签下的 ID 不同,这时我们就跳过 id = 'vsb_content' 即可,在跳过时,判断页面内容应当先判断id = 'vsb_content_4' ,因为 vsb_content_4 包含了 vsb_content

四、在爬取新闻后,将新闻写入csv文件时出现BUG,文件内容有重复

解决办法:

在写入文件的列表写入后将列表清空,因为在循环执行跳过不存在页面时会有空隙,这时的data_list里面是有内容的

1736986-20200227132445540-1412071141.png

五、在写入csv文件后,新闻文本乱码

解决办法:使用utf-8-sig编码

为什么不用utf-8?

原因如下:

1、”utf-8“ 是以字节为编码单元,它的字节顺序在所有系统中都是一样的,没有字节序问题,

因此它不需要BOM,所以当用"utf-8"编码方式读取带有BOM的文件时,它会把BOM当做是文件内容来处理, 也就会发生类似上边的错误.

2、“uft-8-sig"中sig全拼为 signature 也就是"带有签名的utf-8”,

因此"utf-8-sig"读取带有BOM的"utf-8文件时"会把BOM单独处理,与文本内容隔离开,也是我们期望的结果.

最终代码:

ContractedBlock.gif

ExpandedBlockStart.gif

1 #!/user/bin/env python

2 #-*- coding:utf-8 -*-

3 #Author: Mr.riy

4

5

6 importre7 importrequests8 importcsv9 importtime10 importjieba11 importjieba.analyse12 from requests.exceptions importRequestException13 from bs4 importBeautifulSoup14

15

16 classDownloader:17 def __init__(self):18 self.data_list =[]19

20 def download(self, url, num_retries=3):21 '判断页面'

22 print('Downloading:', url)23 globalresponse24 response =requests.get(url)25 response.encoding='utf-8'

26 try:27 if 'Sorry, Page Not Found' inresponse.text:28 print(url, '页面不存在')29 elif '该内容已经被撤销' inresponse.text:30 print(url, '页面不存在')31 elif response.status_code == 200:32 print('下载成功,开始执行......')33 #print(response.text)

34 #print(response.encoding)

35 page =response.content36 self.find_all(page)37 time.sleep(1)38 else:39 if num_retries > 0 and 500 <= response.status_code <= 600:40 html = self.download(url, num_retries-1)41 exceptRequestException as e:42 print(e)43

44 deffind_all(self, page):45 '爬取内容'

46 soup_title = BeautifulSoup(page, 'lxml')47 sp_title_items = soup_title.find('h2', attrs={'align': 'center'})48 title =sp_title_items.text49 print(title)50

51 sp_time_items = soup_title.find('div', attrs={'style': 'line-height:400%;color:#444444;font-size:14px'})52 times =sp_time_items.text53 #print(times)

54 time = re.findall(r'\d{4}年\d{2}月\d{2}日 \d{2}:\d{2}', times)55 #print(time)

56 author = re.findall(r'作者:(.*)', times)57 #print(author)

58 globalresponse59 if 'vsb_content_4' inresponse.text:60 sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content_4'})61 elif 'vsb_content_501' inresponse.text:62 sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content_501'})63 else:64 sp_words_items = soup_title.find('div', attrs={'id': 'vsb_content'})65

66 words =sp_words_items.text67 #print(words)

68 row =[]69 row.append(time)70 row.append(author)71 row.append(words)72 self.data_list.append(row)73

74 defwrite_csv(self, filename, all_list):75 '写入csv文件'

76 with open(filename, 'w', encoding="utf-8-sig", newline='') as f:77 writer =csv.writer(f)78 fields = ('时间', '作者', '内容')79 writer.writerow(fields)80 for row inall_list:81 writer.writerow(row)82

83 deffetch_data(self):84 '设置爬取页面'

85 all_list =[]86 for page in range(13795, 14000, 1): #设置爬取的页面范围

87 url = f'http://www.xxxxxx.cn/info/1013/{page}.htm'

88 self.download(url)89 all_list +=self.data_list90 self.data_list =[]91

92 self.write_csv('data.csv', all_list)93

94

95 classanalyze:96 defget_all_text(self, filename):97 '取出所有评价的句子'

98 comment_list =[]99 with open(filename, encoding="utf-8-sig") as f:100 rows =csv.reader(f)101 for row inrows:102 one_comment = row[-1]103 comment_list.append(one_comment)104

105 return ''.join(comment_list[1:])106

107 defcut_text(self, all_text):108 '找到评价中重要关键词'

109 jieba.analyse.set_stop_words('stop_words.txt')110 text_tags = jieba.analyse.extract_tags(all_text, topK=30)111 returntext_tags112

113

114 defmain():115 temp =Downloader()116 temp.fetch_data()117 b =analyze()118 all_text = b.get_all_text('data.csv')119 text_tags =b.cut_text(all_text)120 print(text_tags)121

122

123 if __name__ == "__main__":124 main()

View Code

运行截图:最近新闻出现最多的关键字为:防疫,疫情,工作

1736986-20200227132849933-1112653463.png

这篇关于python爬取网页新闻内容_python爬取某站新闻,并分析最近新闻关键词的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712462

相关文章

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python清空Word段落样式的三种方法

《Python清空Word段落样式的三种方法》:本文主要介绍如何用python-docx库清空Word段落样式,提供三种方法:设置为Normal样式、清除直接格式、创建新Normal样式,注意需重... 目录方法一:直接设置段落样式为"Normal"方法二:清除所有直接格式设置方法三:创建新的Normal样

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

Python标准库datetime模块日期和时间数据类型解读

《Python标准库datetime模块日期和时间数据类型解读》文章介绍Python中datetime模块的date、time、datetime类,用于处理日期、时间及日期时间结合体,通过属性获取时间... 目录Datetime常用类日期date类型使用时间 time 类型使用日期和时间的结合体–日期时间(

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁