Python基础教程项目四之新闻聚合攻略
1. 项目简介
本项目旨在通过爬取多个新闻网站的新闻,将其进行聚合并形成一个新的新闻列表,便于用户的浏览。可获取的新闻来源包括但不限于新华网、人民网、腾讯新闻等。
2. 实现步骤
2.1 网页分析
首先需要分析新闻网站的网页结构,确定需要爬取的内容和爬取方式,可以使用Chrome的开发者工具或者Firebug进行网页元素的分析。
2.2 爬取网页信息
使用Python的requests、urllib或者Scrapy等模块,通过HTTP请求获取新闻网站的HTML文件,从而得到网页源码。
2.3 解析网页信息
使用Python的BeautifulSoup或者lxml等模块对HTML文件进行解析,从而获取新闻信息。
2.4 存储新闻信息
将获取到的新闻信息存储到数据库或者文件中,方便后续处理和展示。
2.5 展示新闻信息
将存储在数据库或者文件中的新闻信息作为数据源,使用Web框架Flask或者Django进行数据的展示。
3. 示例说明
3.1 人民网新闻聚合
将人民网的新闻信息爬取并存储到MySQL数据库中,然后使用Flask框架展示新闻信息。
import requests
from bs4 import BeautifulSoup
import MySQLdb
# 爬取人民网的新闻信息
def get_news():
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
url = 'http://www.people.com.cn/'
res = requests.get(url, headers=header)
soup = BeautifulSoup(res.text, 'html.parser')
titles = soup.select('div.hdNews > h2 > a')
news = []
for title in titles:
href = title.get('href')
if href.startswith('http://'):
news.append((title.text, href))
return news
# 将新闻信息存储到MySQL数据库中
def save_news_to_database(news):
db = MySQLdb.connect("localhost", "root", "123456", "test", charset='utf8' )
cursor = db.cursor()
for n in news:
sql = "INSERT INTO news(title, url) VALUES ('%s', '%s')" % (n[0], n[1])
cursor.execute(sql)
db.commit()
db.close()
# 使用Flask框架展示新闻信息
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def news():
db = MySQLdb.connect("localhost", "root", "123456", "test", charset='utf8' )
cursor = db.cursor()
sql = "SELECT * FROM news"
cursor.execute(sql)
result = cursor.fetchall()
db.close()
news = []
for r in result:
news.append({'title': r[1], 'url': r[2]})
return render_template('news.html', news=news)
if __name__ == '__main__':
news = get_news()
save_news_to_database(news)
app.run()
3.2 腾讯新闻聚合
将腾讯新闻的新闻信息爬取并保存到本地文件中,然后使用Django框架展示新闻信息。
import requests
from bs4 import BeautifulSoup
import json
# 爬取腾讯新闻的新闻信息
def get_news():
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
url = 'https://www.qq.com/'
res = requests.get(url, headers=header)
soup = BeautifulSoup(res.text, 'html.parser')
titles = soup.select('div.Q-tpList > ul > li > a')
news = []
for title in titles:
href = title.get('href')
if href.startswith('http://nba') or href.startswith('http://finance') or href.startswith('http://stock'):
news.append((title.text, href))
return news
# 将新闻信息存储到本地文件中
def save_news_to_file(news):
with open('news.json', 'w', encoding='utf-8') as f:
json.dump(news, f, ensure_ascii=False)
# 使用Django框架展示新闻信息
from django.shortcuts import render
import json
def news(request):
with open('news.json', 'r', encoding='utf-8') as f:
news = json.load(f)
context = {'news': news}
return render(request, 'news.html', context=context)
4. 总结
通过以上示例,我们可以看到获取新闻信息的方法有很多,可以根据网页结构和需求进行选择。同时,存储新闻信息的方式也有多种,包括数据库、文件等。最后,使用Web框架进行展示可以实现更好的用户体验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python基础教程项目四之新闻聚合 - Python技术站