效果展示
安装所需的模块
requests模块:
- requests是python实现的简单易用的HTTP库,但因为是第三方库,所以使用前需要先安装(如果用的是Anaconda则不用安装),安装方法:
pip install requests
- 安装完成后,使用
import requests
导入该库测试一下,若没有报错则为安装成功
bs4模块:
- BS4全称是BeatifulSoup,它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能,但因为是第三方库,所以使用前需要先安装(如果用的是Anaconda则不用安装),安装方法:
pip install bs4
- 安装完成后,使用
import bs4
导入该库测试一下,若没有报错则为安装成功
获取最新新闻链接
- 进入新浪国际新闻页面 -> https://news.sina.com.cn/world/
进入页面后鼠标右击点检查
(或按快捷键F12
)打开开发人员工具,然后点击Network(网络)
,最后刷新一下页面,刷新后如图所示:
- 点击
world
文件 -> 点击Headers(标头)
,通过查看Request Method(请求方法)
发现该网页使用的是GET,复制该URL
- 利用
requests库
获取world文件的响应数据
import requests # 导入requests库
res = requests.get('https://news.sina.com.cn/world/') # 使用get请求方式
res.encoding = 'utf-8' # 把编码改为utf-8
print(res.text) # 以文本形式输出
获取新闻的标题、日期和链接:
- 在开发人员工具里,先点击左上角的
选择检查图标
,后点击页面上新闻的标题,在Elements(元素)
里会自动定位到当前标题所在的位置,如图所示:
- 通过上图可以看出,新闻的标题是在
news-item下的h2
内。 - 利用
bs4库
里的BeautifulSoup获取新闻的标题,代码如下:
import requests
from bs4 import BeautifulSoup
res = requests.get('https://news.sina.com.cn/world/')
res.encoding = 'utf-8'
# 实例化soup对象
soup = BeautifulSoup(res.text, 'html.parser')
# 标题存放在news-item下,class对应'.' id对应'#'
for news in soup.select('.news-item'):
# 如果h2标签里不为空
if (len(news.select('h2')) > 0) and count <= num:
title = news.select('h2')[0].text
time = news.select('.time')[0].text
links = news.select('a')[0]['href']
new_links_list.append(links)
data = title + "| 发布日期:" + time + "| 文章链接:\n" + links + "\n"
# 将获取新闻的链接保存到本地
with open("new_links.txt", "a", encoding='utf-8') as w:
w.write(data)
- 代码运行后部分效果如下:
获取新闻文章内容
获取文章的标题、日期、内容和作者:
- 先随便复制一篇新闻的链接,获取方法和上面的方法相同,具体步骤不再演示
import requests
from bs4 import BeautifulSoup
res = requests.get('https://news.sina.com.cn/w/2021-02-07/doc-ikftssap4647063.shtml')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
soup.select('.main-title')[0].text # 获取标题
- 获取日期和链接的方法和上面一样
soup.select('.date')[0].text #获取日期
' '.join([p.text.strip() for p in soup.select('#article p')[:-1]]) # 获取内容
soup.select('.show_author')[0].text.lstrip("责任编辑:") # 获取作者
完整代码
import json
import requests
from bs4 import BeautifulSoup
def getNewDetail():
global new_links_list
for i in range(0, len(new_links_list)):
result = {}
res = requests.get(new_links_list[i])
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
result['标题'] = soup.select('.main-title')[0].text
result['时间'] = soup.select('.date')[0].text
result['正文'] = ' '.join([p.text.strip() for p in soup.select('#article p')[:-1]])
result['作者'] = soup.select('.show_author')[0].text.lstrip("责任编辑:")
data = json.dumps(result, indent=1, ensure_ascii=False)
with open("new_content.txt", "a", encoding='utf-8') as w:
w.write(data)
print("文件内容写入完成!")
def run(num):
global new_links_list
count = 1
res = requests.get('https://news.sina.com.cn/world/')
res.encoding = 'utf-8'
soup = BeautifulSoup(res.text, 'html.parser')
for news in soup.select('.news-item'):
# 判断如果h2标签里不为空
if (len(news.select('h2')) > 0) and count <= num:
title = news.select('h2')[0].text
time = news.select('.time')[0].text
links = news.select('a')[0]['href']
new_links_list.append(links)
data = title + "| 发布日期:" + time + "| 文章链接:\n" + links + "\n"
with open("new_links.txt", "a", encoding='utf-8') as w:
w.write(data)
count += 1
print("文件链接写入完成!")
getNewDetail()
if __name__ == '__main__':
new_links_list = []
num = int(input("请输入需要保存的新闻个数:"))
run(num)