Python实现新闻爬虫:从抓取到打包成exe的完整教程
本文介绍如何使用Python编写一个简单的新闻爬虫程序。通过requests获取网页HTML,利用bs4解析提取标题与正文,并结合Tkinter构建图形界面。最后使用PyInstaller将脚本编译为独立的exe文件,实现无需Python环境即可运行的新闻查看工具。
核心代码
主要依赖requests库下载HTML网页,并使用bs4.BeautifulSoup库对HTML内容进行解析分析。
from requests import get
from bs4 import BeautifulSoup as bs
from datetime import datetime as dt
def Today(style=1):
date = dt.today()
if style!=1: return f'{date.month}月{date.day}日'
return f'{date.year}-{date.month:02}-{date.day:02}'
def SinaNews(style=1):
url1 = 'http://news.***.com.cn/'
if style==1: url1 += 'world'
elif style==2: url1 += 'china'
else: url1='https://mil.news.sina.com.cn/'
text = get(url1)
text.encoding='uft-8'
soup = bs(text.text,'html.parser')
aTags = soup.find_all("a")
return [(t.text,t['href']) for t in aTags if Today() in str(t)]
爬取标题
for i,news in enumerate(SinaNews(1)):
print(f'No{i+1}:',news[0])
No1: 外媒:*****
No2: 日媒:******
......
......
内容已马赛克!!!
初次尝试爬虫开发时,为了降低难度,选择了一个无需复杂破解机制的新闻网站作为目标,直接下载网页即可获取内容。该程序主要抓取国际、国内和军事新闻三个频道的内容作为数据源。在通过requests.get下载网页后,对返回的HTML文本进行分析,发现所有带有日期的<a href=...>标签正是所需的数据。
爬取正文
随后,根据获取到的URL下载具体的正文网页。分析HTML结构可知,id为‘article’的<div>层即为正文所在区域。使用.get_text()函数提取文本是关键步骤,之后进行适当的格式处理:
>>> def NewsDownload(url):
html = get(url)
html.encoding='uft-8'
soup = bs(html.text,'html.parser')
text = soup.find('div',id='article').get_text().strip()
text = text.replace('点击进入专题:','相关专题:')
text = text.replace(' ','\n ')
while '\n\n\n' in text:
text = text.replace('\n\n\n','\n\n')
return text
>>> url = 'https://******/w/2021-09-29/doc-iktzqtyt8811588.shtml'
>>> NewsDownload(url)
'原标题:******************************************************'
>>>
界面代码
使用Python内置的图形界面库tkinter,主要控件包括Text、Listbox、Scrollbar和Button。通过设置基本属性、确定放置位置以及绑定命令,经过调试直至程序完工。
源代码 News.pyw :其中涉及的网站名称已马赛克!
from requests import get
from bs4 import BeautifulSoup as bs
from datetime import datetime as dt
from os import path
import tkinter as tk
def Today(style=1):
date = dt.today()
if style!=1: return f'{date.month}月{date.day}日'
return f'{date.year}-{date.month:02}-{date.day:02}'
def SinaNews(style=1):
url1 = 'http://news.****.com.cn/'
if style==1: url1 += 'world'
elif style==2: url1 += 'china'
else: url1='https://mil.****.com.cn/'
text = get(url1)
text.encoding='uft-8'
soup = bs(text.text,'html.parser')
aTags = soup.find_all("a")
return [(t.text,t['href']) for t in aTags if Today() in str(t)]
def NewsList(i):
global news
news = SinaNews(i)
tList.delete(0,tk.END)
for idx,item in enumerate(news):
tList.insert(tk.END,f'{idx+1:03} {item[0]}')
tText.config(state=tk.NORMAL)
tText.delete(0.0,tk.END)
tText.config(state=tk.DISABLED)
NewsShow(0)
def NewsList1(): NewsList(1)
def NewsList2(): NewsList(2)
def NewsList3(): NewsList(3)
def NewsShow(idx):
if idx!=0:
idx = tList.curselection()[0]
title,url = news[idx][0],news[idx][1]
html = get(url)
html.encoding='uft-8'
soup = bs(html.text,'html.parser')
text = soup.find('div',id='article').get_text().strip()
text = text.replace('点击进入专题:','相关专题:')
text = text.replace(' ','\n ')
while '\n\n\n' in text:
text = text.replace('\n\n\n','\n\n')
tText.config(state=tk.NORMAL)
tText.delete(0.0,tk.END)
tText.insert(tk.END, title+'\n\n'+text)
tText.config(state=tk.DISABLED)
def InitWindow(self,W,H):
Y = self.winfo_screenheight()
winPosition = str(W)+'x'+str(H)+'+8+'+str(Y-H-100)
self.geometry(winPosition)
icoFile = 'favicon.ico'
f = path.exists(icoFile)
if f: win.iconbitmap(icoFile)
self.resizable(False,False)
self.wm_attributes('-topmost',True)
self.title(bTitle[0])
SetControl()
self.update()
self.mainloop()
def SetControl():
global tList,tText
tScroll = tk.Scrollbar(win, orient=tk.VERTICAL)
tScroll.place(x=450,y=320,height=300)
tList = tk.Listbox(win,selectmode=tk.BROWSE,yscrollcommand=tScroll.set)
tScroll.config(command=tList.yview)
for idx,item in enumerate(news):
tList.insert(tk.END,f'{idx+1:03} {item[0]}')
tList.place(x=15,y=320,width=435,height=300)
tList.select_set(0)
tList.focus()
bW,bH = 70,35 #按钮的宽高
bX,bY = 95,270 #按钮的坐标
tBtn1 = tk.Button(win,text=bTitle[1],command=NewsList1)
tBtn1.place(x=bX,y=bY,width=bW,height=bH)
tBtn2=tk.Button(win,text=bTitle[2],command=NewsList2)
tBtn2.place(x=bX+100,y=bY,width=bW,height=bH)
tBtn3 = tk.Button(win,text=bTitle[3],command=NewsList3)
tBtn3.place(x=bX+200,y=bY,width=bW,height=bH)
tScroll2 = tk.Scrollbar(win, orient=tk.VERTICAL)
tScroll2.place(x=450,y=10,height=240)
tText = tk.Text(win,yscrollcommand=tScroll2.set)
tScroll2.config(command=tText.yview)
tText.place(x=15,y=10,width=435,height=240)
tText.config(state=tk.DISABLED,bg='azure',font=('宋体', '14'))
NewsShow(0)
tList.bind("<Double-Button-1>",NewsShow)
if __name__=='__main__':
win = tk.Tk()
bTitle = ('今日新闻','国际新闻','国内新闻','军事新闻')
news = SinaNews()
InitWindow(win,480,640)
此处提供全部代码,不再进行详细分析。如有需要,欢迎留言讨论。我的运行环境为Win7+Python3.8.8,在此环境下可无错运行!文中涉及的网站名称已进行打码处理,若猜不出具体网站,可私下联系作者。
软件编译
使用pyinstaller.exe将程序编译为单个运行文件。注意源码文件的后缀名应使用.pyw,否则会出现cmd黑窗口。另外有一个小知识点:任意网站的Logo图标icon文件,通常可以在网站根目录下载到,即: http(s)://websiteurl.com(.cn)/favicon.ico
编译命令如下:
D:\>pyinstaller --onefile --nowindowed --icon="D:\favicon.ico" News.pyw
编译完成后,在dist文件夹下生成一个News.exe可执行文件,大小约15M,这个体积还可以接受。
反正拿走就能直接用
以上就是Python小程序爬取今日新闻拿走就能用的详细内容,更多关于Python小程序的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













