爬虫python 新闻,Python爬虫实例--爬取人民网新闻
我在那边评论区想要进行评论,结果发现发布的位置不足,于是决定开始撰写这篇博客.其中详细内容可参考我的转载文章,较为详尽地介绍了TXT格式转JSON的基本方法,而这里仅针对TXT格式转JSON的问题进行简要说明.
第一次写,格式可能很乱,见谅一下
话不多说,直接开始吧
这是未修改前得到的文本样式

在这一区域中可以观察到爬取的文章都是按照日期有序且整齐地排列着整体效果令人感到舒适便利
然后有些可能就算需要json格式来进行保存
当时浏览了评论区后
尝试了下,如下图

格式修改了是不错,不过看着好别扭(密集恐惧症的朋友就更不推荐了)
再次尝试了一下其他方法。主要的想法是希望能够从一开始运行所获得的文件夹中提取所有txt文档。
化,然后除了格式,命名啥的不变就完美了,主要是看着方便
于是网上找了一下,再请教了下我组长,得到了如下

在这一部分中涉及JSON格式,在对项目管理相关的字段进行配置时,默认对title字段进行了基本的命名设置。对于其他字段的需求,请自行进行命名设置。
就关于功能的部分而言,我认为应该彻底完成.为此,可以直接一次性全面转换系统中的所有数据.操作简便快捷的同时,运行效率同样不会低.
代码如下
import json import re def txtToJson(path, out_path): # 设置用于切割字符串的正则表达式 seq = re.compile(r':') result = [] # 打开并读取指定路径下的文本 file = open(path, 'r', encoding='utf-8') for line in file: # 使用正则表达式拆分每行内容 lst = seq.split(line.strip()) item = { "title": lst[0] } result.append(item) # 打印结果类型及结构 print(f"类型: {type(result)}") print(f"实例: {result}\n") # 将结果保存为JSON格式 with open(out_path, 'w', encoding='utf-8') as dump_f: json.dump(result, dump_f, ensure_ascii=False, indent=4) def txtToJson_ext(*paths): # 获取所有匹配路径 files = glob.glob(paths[0]) # 处理每个匹配的文本 for file in files: txtToJson(file, out_path + f'_{file.split("/")[-1]}')
指定目标文件夹路径out_root为./data_json文件夹。
遍历./data文件夹下所有包含.txt格式的文件。
输出当前处理的路径路径值。
获取文件名的名称.
从当前处理的路径中提取数据目录名称.
将后缀扩展为.json格式.
创建目标输出目录.
生成最终输出的JSON文件完整路径.
打印输出JSON文件完整路径.
定义函数test().
在函数内部调用自定义函数txtToJson()和txtToJson_ext().
若主程序模块运行,导入fire模块并执行脚本.
fire.Fire()
这里是转换格式部分的代码
这里的话直接运行test函数块部分就可以了
遍历了原来之前的data目录,然后生成新的文件夹将转换后的内容填入
爬取新闻部分代码
import requests import bs4 import os import datetime import time def fetchUrl(url): # 用于发起网络请求,可以访问目标URL,获取目标网页的html内容并返回 '''
功能:访问url的网页,获取页面内容并返回
参数:目标网页的url
返回:目标网页的html内容
headers = { 'accept': '文本HTML格式,应用/xhtml+xml,应用/xml;权重为0.9,图片webp,图片/apng,/;权重为0.8', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0;WOW64) AppleWebKit/537.36 (KHTML,如Following) Chrome/83.0.4103.97 Safari/537.36' }
The 'accept' attribute can be used by the browser to accept certain media types, indicating the supported formats.
用户代理:向HTTP服务器表明客户端使用的操作系统及其版本号以及所使用的浏览器名称和相应版本号。
以下是改写后的文本
功能:获取当天报纸的各版面的链接列表
参数:年,月,日
URL被构造为包含年份、月份和日期的链接。
HTML内容被获取。
BeautifulSoup对象被创建用于解析HTML内容。
pageList = bsobj.find('div', attrs={'id': 'pageList'}).ul.find_all(
'div', attrs={'class': 'right_title-name'})
网站兼容式更新
通过bsobj对象查找具有属性id为'pageList'的div元素存储于变量temp中;如果该元素存在(temp不为空):
遍历该元素的所有子节点,并提取具有class属性为'right_title-name'的所有div元素赋值给pageList;
否则:
通过bsobj对象查找具有属性class为'swiper-container'的div元素;
并对该元素下的所有子节点(类名为'swiper-slide')赋值给pageList;
初始化一个空列表linkList用于存储获取到的链接地址;
# 对待爬取网页的内容进行解析分析
遍历每个位于pageList中的网页链接:
获取当前页面地址中的超链接属性href值赋值给变量link;
构造完整链接地址并赋值给变量url;
year + '-' + month + '/' + day + '/' + link
将url插入到linkList中后并将其返回该列表
函数名为getTitleList它接受四个参数分别是年月日以及页码URL参数用于获取特定日期下报纸某版块的所有文章链接并将结果存储在一个数组中最后由该函数返回
生成特定日期下报纸某版块的所有文章链接(获取指定日期报纸指定版块的文章链接)
功能: 获取报纸某一版面的文章链接列表
参数: 年, 月, 日, 该版面的链接
''' html = fetchUrl(pageUrl) bsobj = bs4.BeautifulSoup(html, 'html.parser') '''
titleList = bsobj.find('div', attrs={'id': 'titleList'}).ul.find_all('li')
''' temp = bsobj.find('div', attrs={'id': 'titleList'}) if temp: titleList = temp.ul.find_all('li') else: titleList = bsobj.find( 'ul', attrs={'class': 'news-list'}).find_all('li') linkList = [] for title in titleList: tempList = title.find_all('a') for temp in tempList: link = temp["href"] if 'nw.D110000renmrb' in link: url = 'http://paper.people.com.cn/rmrb/html/' + \
year + '-' + month + '/' + day + '/' + link
linkList.push_back(url); send_back(linkList); def getContent(html): # 用于获取文章内容页, 爬取文章的标题和正文, 并返回 $$
功能: 解析HTML网页,获取新闻的文章内容
参数: HTML网页内容
使用bs4库中的_beautifulsoup对象解析html文档并提取其中的信息
提取网页标题信息
将各层次标题拼接成完整字符串
提取网页正文内容块
pList表示找到包含ozoom标签的div下的所有段落
遍历特定层级节点的子节点
content变量初始化为空串
将每个段落文本拼接到整体内容中
最后生成包含标题与正文的整体输出字符串
resp变量存储了合并后的结果信息
定义函数用于保存处理后的文本到指定路径下对应的文件夹中
功能: 将文章内容 content 保存到本地文件中
参数: 要保存的内容,路径,文件名
如果路径不存在,则自动创建路径:if not os.path.exists(path): os.makedirs(path)
使用with语句将内容写入指定文件:with open(path + filename, 'w', encoding='utf-8') as f: f.write(content)
根据指定日期和目标目录下载当天报纸文章内容:def download_rmrb(year, month, day, destdir):
可以根据year、month、day参数下载当天报纸文章内容,并遵循特定规则存储于destdir。
功能:爬取 人民日报 网站 某年,某月,某日的新闻内容,并保存在指定目录下
参数: 年,月,日,文件保存的根目录
''' pageList = getPageList(year, month, day) for page in pageList: titleList = getTitleList(year, month, day, page) for url in titleList: # 获取新闻文章内容 html = fetchUrl(url) content = getContent(html) # 生成保存的文件路径及文件名 temp = url.split('_')[2].split('.')[0].split('-') pageNo = temp[1] titleNo = temp[0] if int(temp[0]) >= 10 else '0' + temp[0] path = destdir + '/' + year + month + day + '/' fileName = year + month + day + '-' + pageNo + '-' + titleNo + '.txt' # 保存文件 saveFile(content, path, fileName) def gen_dates(b_date, days): day = datetime.timedelta(days=1) for i in range(days): yield b_date + day * i def get_date_list(beginDate, endDate): '''
获取日期列表
param start:开始日期
param end:结束日期
return:开始日期和结束日期之间的日期列表
''' start = datetime.datetime.strptime(beginDate, "%Y%m%d") end = datetime.datetime.strptime(endDate, "%Y%m%d") data = [] for d in gen_dates(start, (end-start).days): data.append(d) return data if name == 'main': '''
主函数: 程序入口
输入起止日期
beginDate = input("请输入开始日期:")
endDate = input("请输入结束日期:")
data = get_date_list(beginDate, endDate)
循环获取指定时间段内的所有新闻日期
for d in data:
# 提取年份
year = str(d.year)
# 提取月份
month_str = str(d.month)
if len(month_str) < 2:
month_str += '0' # 补前导零
# 提取日份
day_str = str(d.day)
if len(day_str) < 2:
day_str += '0' # 补前导零
# 下载对应的新闻文件
download_rmrb(f"{year}{month_str}{day_str}", 'E:/PYTHON/news require/data')
print(f"爬取完成: {year}{month_str}{day_str}")
添加循环提示信息
time.sleep(3)
就这个话题而言,我也曾试着将其两个部分整合在一起.随后立即将其转换成txt文件后进一步转换成json格式.然而始终遇到错误提示信息导致最终未能成功生成所需的数据结构.
在初学阶段接触Python的小白可能会对一些看似简单的问题感到困惑。
如果有大佬成功合并的话可以在评论区支呼一声
如您要是有关于本文的问题或建议,请直接点击留言回复,我们会有众多网友为您详细解答。
