一、制作新闻的Excel索引
-
观察网页
-
导入相关库
-
请求数据
-
解析数据
-
保存excel文件
二、将新闻正文内容保存为word
-
观察网页
-
导入相关库
-
对子网页的内容进行爬取并保存成word:以一个子网页为例
-
1、请求数据
-
2、解析数据并存储word
-
循环爬取多个子网页的内容并保存成word
三、全套代码及运行结果
一、制作新闻的Excel索引
观察网页
首先进入网页:http://news.china.com.cn/node_7247300.htm,再通过翻页,对比第1页,第2页以及最后1页的网址,发现它们之间存在着差别,则此网页为静态网页。
根据对比,除了第一页网址不同外,其他页面下的网址为http://news.china.com.cn/node_7247300_{i}.htm,i为其页码,在之后的爬取中,可用for循环和if-else来对不同的页面数据进行爬取。
导入相关库
引入所需的第三方库,代码如下:
import requests
import pandas as pd
from bs4 import Beautifulsoup
请求数据
对于静态网页,我们可用Requests库请求数据。先点击“网页”后刷新网页找到所需的第一个链接“node_7247300.htm”,再点击“标头”可知,网页的请求方式为“GET”。
运行代码,显示Requests[200],即请求成功,则无需伪装请求头。但为防止乱码,我们使用r.encoding=r.apparent_encoding。过程如下:
import requests
from bs4 import BeautifulSoup
import pandas as pd
items = []
url='http://news.china.com.cn/node_7247300.htm'
r=requests.get(url)
r.encoding=r.apparent_encoding
print(r)
解析数据
检查页面,发现所有新闻都储存在‘div’标签下的class_="layout_news"中,每行新闻在上述标签的‘div’,class_="plist1_p"标签下,且在此标签‘h2’下不同新闻的子链接位于’a’标签的’href’中,新闻标题位于’h2’标签中,对应新闻发布时间位于’div’,class_="time"标签中。因此,可以采用BeautifulSoup库解析数据。
由前面的分析,知除首页外,通用网址为http://news.china.com.cn/node_7247300_{i}.htm。因为本文在此处爬取了首页,所以需加上if-else语句。同时,在查找div元素之前,先使用一个for循环。最后,添加了一个append语句,不断将item添加至items。具体代码如下:
items=[] #定义一个空列表,存储信息
for i in range (1,4):
if i==1:
url='http://news.china.com.cn/node_7247300.htm'
else:
url=f'http://news.china.com.cn/node_7247300_{i}.htm'
r=requests.get(url)
r.encoding=r.apparent_encoding
soup=BeautifulSoup (r.text,'html.parser')
div=soup.find('div',class_="layout_news").find('div',class_="plist1").find('div',class_="plist1_p")
div_list=soup.find('div',class_="layout_news").find_all('div',class_="plist1")
for div in div_list:
title=div.find('h2').text
date=div.find('div',class_="time").text
href=div.find('h2').find('a').get('href')
item=[title,href,date]
items.append(item)
保存excel文件
使用pd.DataFrame方法将嵌套列表items转变为数据框。
df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
df
采用pandas库保存成excel文件具体代码如下:
df.to_excel(r'D:\中国网新闻索引.xlsx')
二、将新闻正文内容保存为word
观察网页
由于该网站有两种链接形式,无法用一套代码循环爬取所有的子链接新闻。故此处取其中一网页地址占多数的,以".shtml"结尾的网站运用if-else语句进行判断:若网页以".shtml"结尾,则爬取网页正文内容;否则跳过。
if href.endswith(".shtml"):
爬取正文内容
else:
pass
通过在网页空白处右击鼠标,选择检查,按下ctrl+f,来对网页下的一些内容进行查找,若能在检查框中找到相同的文字内容,则说明该网站为静态网站,反之则为动态网站。我们在搜索框中输入“本届”,发现可以找到相同内容,则该网站为静态网站。
导入相关库
import requests
import docx
from docx import Document
对子网页的内容进行爬取并保存成word:以一个子网页为例
请求数据
任意选取一个以".shtml"结尾的网站,先点击“网络”后刷新网页找到所需的第一个链接,再点击“标头”可知,网页的请求方式为“GET”。
运行代码,显示Requests[200],即请求成功,则无需伪装请求头。为防止乱码,我们使用r.encoding=r.apparent_encoding。过程如下:
import requests
href='http://news.china.com.cn/2023-12/10/content_116869341.shtml' # 子链接网址
r=requests.get(url=url)
r.encoding=r.apparent_encoding
解析数据并存储word
对页面的文本位置进行观察,发现新闻标题位于’div’,class_="content"的"h1"中。正文位于’div’,class_="article"下的’p’标签中。因此可用BeautifulSoup库解析数据,并利用for循环将段落爬取到Word。
doc = Document()
soup=BeautifulSoup(r.text,'html.parser')
if href.endswith(".shtml"):
title=soup.find('div',class_="content").find('h1').text
p_list=soup.find('div',class_="article").find_all('p')
doc.add_heading(title)
# 将文本内容爬到Word中
for p in p_list:
para=p.text
doc.add_paragraph(para)
else:
pass
doc.save(r'D:\中国网一个新闻要闻.docx') # 储存数据
循环爬取多个子网页的内容并保存成word
具体代码如下:
from docx import Document
doc = Document()
for i in range(len(df)):
title=df.iloc[i]['标题']
date=df.iloc[i]['发布时间']
href=df.iloc[i]['网页链接']
print(href)
r=requests.get(url=href,verify=False)
r.encoding=r.apparent_encoding
soup=BeautifulSoup(r.text,'html.parser')
if href.endswith(".shtml"):
title=soup.find('div',class_="content").find('h1').text
p_list=soup.find('div',class_="article").find_all('p')
doc.add_heading(title)
# 将文本内容爬到Word中
for p in p_list:
para=p.text
doc.add_paragraph(para)
else:
pass
doc.save(r'D:\中国网要闻.docx') # 储存数据
三、全套代码及运行结果
全套代码如下:
import pandas as pd
import requests
from bs4 import BeautifulSoup
items=[] #定义一个空列表,存储信息
for i in range (1,4):
if i==1:
url='http://news.china.com.cn/node_7247300.htm'
else:
url=f'http://news.china.com.cn/node_7247300_{i}.htm'
r=requests.get(url) #请求网页信息
r.encoding=r.apparent_encoding #防止乱码
soup=BeautifulSoup (r.text,'html.parser') # 解析数据
div=soup.find('div',class_="layout_news").find('div',class_="plist1").find('div',class_="plist1_p")
div_list=soup.find('div',class_="layout_news").find_all('div',class_="plist1")
# 爬取每一个网页中新闻的子链接信息
for div in div_list:
title=div.find('h2').text
date=div.find('div',class_="time").text
href=div.find('h2').find('a').get('href')
item=[title,href,date]
items.append(item)
df=pd.DataFrame(items,columns=['标题','网页链接','发布时间'])
df.to_excel(r'D:\中国网新闻索引.xlsx') # 储存excel索引
from docx import Document
doc = Document()
for i in range(len(df)):
title=df.iloc[i]['标题']
date=df.iloc[i]['发布时间']
href=df.iloc[i]['网页链接']
print(href)
r=requests.get(url=href,verify=False)
r.encoding=r.apparent_encoding
soup=BeautifulSoup(r.text,'html.parser')
if href.endswith(".shtml"):
title=soup.find('div',class_="content").find('h1').text
p_list=soup.find('div',class_="article").find_all('p')
doc.add_heading(title)
# 将文本内容爬到Word中
for p in p_list:
para=p.text
doc.add_paragraph(para)
else:
pass
doc.save(r'D:\中国网要闻.docx') # 储存word
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
