新闻爬虫及爬取结果查询网站的搭建(一)

实验要求

核心需求

1、选取3-5个代表性的新闻网站(比如新浪新闻、网易新闻等,或者某个垂直领域权威性的网站比如经济领域的雪球财经、东方财富等,或者体育领域的腾讯体育、虎扑体育等等)建立爬虫,针对不同网站的新闻页面进行分析,爬取出编码、标题、作者、时间、关键词、摘要、内容、来源等结构化信息,存储在数据库中。
2、建立网站提供对爬取内容的分项全文搜索,给出所查关键词的时间热度分析。

技术要求

1、必须采用Node.JS实现网络爬虫
2、必须采用Node.JS实现查询网站后端,HTML+JS实现前端(尽量不要使用任何前后端框架)

爬虫准备工作

一共选了三个新闻网站进行爬虫,分别是中国财经网雪球网东方财富网,并且将爬取结果存储在postgresql中。
在本实验中,基于Node.js用Cheerio和Request实现了爬虫。下面将详细介绍基本环境搭配,各个爬虫的实现,功能实现过程等内容。

Node.js 安装配置

node.js官网:https://nodejs.org/zh-cn/
安装非常简单,顺着点一点就好了。

vscode

Visual Studio Code(以下简称vscode)是一个轻量且强大的跨平台开源代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。
在本实验中,我使用的是vscode对node.js进行调试。
可以参考官网:https://code.visualstudio.com/

Request

Request也是一个Node.js的模块库,可以轻松地完成http请求。

  1. 安装
    npm install request
  2. 基本使用方法:
    在本实验中,主要是通过request来获取新闻页面。主要使用其默认的GET方法。
var request = require('request');
request('url', function (error, response, body) {
   
  if (!error && response.statusCode == 200) {
   
    console.log(body) // 请求成功的处理逻辑
  }
});

Cheerio简介

  • Cheerio介绍与安装
    cheerio是jquery核心功能的一个快速灵活而又简洁的实现,主要是为了用在服务器端需要对DOM进行操作的地方。
    cheerio官网: https://cheerio.js.org/.
    也可以参考中文翻译:https://www.jianshu.com/p/629a81b4e013
    安装:在项目目录下执行 npm install cheerio
  • 主要功能
    在本次实验中,主要用到的功能将在本节进行一个简单介绍。
  1. 解析HTML(load)
    首先需要手动加载html文档,使用的方式如下,其他更多的加载方式可以参考官方文档
       var cheerio = require('cheerio'),
       $ = cheerio.load('<ul id = "fruits">...</ul>');
    
  2. 选择器(selecter)
    cheerio选择器几乎和jQuery一模一样。选择器是文档遍历和操作的起点。如同在jQuery中一样,它是选择元素节点最重要的方法,但是在jQuery中选择器建立在CSS选择器标准库上。
    在本实验中,主要用到了以下几种选择器方法。
    选取页面中所有的超链接。首先获取页面中所有<a>标签,再遍历获取其href属性的值,具体的局部代码如下:
    try {
         
            seedurl_news = $(
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计思路: 1. 首先确定要爬取新闻网站,并了解该网站的网页结构和新闻分类方式。 2. 使用 Python 爬虫库 requests 和 BeautifulSoup 进行网页爬取和解析,获取新闻的标题、时间、正文、链接等信息。 3. 将获取到的新闻信息存储在本地数据库中,方便后续的数据处理和可视化。 4. 使用 Python 数据处理和可视化库 pandas、numpy、matplotlib、seaborn 等进行数据处理和可视化,分析新闻的热点话题、关键词、时间分布等信息。 5. 通过 Flask Web 框架,将分析结果可视化展示在网页上,并提供搜索和筛选功能,方便用户查找感兴趣的新闻。 实现步骤: 1. 确定要爬取新闻网站,例如新浪新闻、腾讯新闻等。 2. 使用 requests 库获取网页的 HTML 内容,使用 BeautifulSoup 库进行解析,获取新闻的标题、时间、正文、链接等信息。 3. 使用 Python 数据库操作库 pymysql,将获取到的新闻信息存储到本地 MySQL 数据库中。 4. 使用 pandas 库进行数据处理,包括数据清洗、数据转换等操作,生成统计分析结果。 5. 使用 matplotlib、seaborn 等库进行数据可视化,生成图表展示新闻热点话题、关键词、时间分布等信息。 6. 使用 Flask Web 框架搭建 Web 服务器,将分析结果以网页的形式展示出来,并提供搜索和筛选功能。 代码实现: 1. 网页爬取和解析: ```python import requests from bs4 import BeautifulSoup def get_news(): base_url = 'http://news.sina.com.cn/china/' news_list = [] for i in range(1, 11): url = base_url + 'index_{}.shtml'.format(i) resp = requests.get(url) resp.encoding = 'utf-8' soup = BeautifulSoup(resp.text, 'html.parser') news_items = soup.select('.news-item') for item in news_items: title = item.select_one('h2').text.strip() time = item.select_one('.time').text.strip() link = item.select_one('a')['href'] content = get_news_content(link) news_list.append({'title': title, 'time': time, 'link': link, 'content': content}) return news_list def get_news_content(url): resp = requests.get(url) resp.encoding = 'utf-8' soup = BeautifulSoup(resp.text, 'html.parser') content = '' p_list = soup.select('#article p') for p in p_list: content += p.text.strip() return content ``` 2. 数据库存储: ```python import pymysql def save_news(news_list): db = pymysql.connect(host='localhost', user='root', password='password', database='news', charset='utf8mb4') cursor = db.cursor() for news in news_list: sql = "INSERT INTO news(title, time, link, content) VALUES (%s, %s, %s, %s)" cursor.execute(sql, (news['title'], news['time'], news['link'], news['content'])) db.commit() db.close() ``` 3. 数据处理和可视化: ```python import pandas as pd import matplotlib.pyplot as plt import seaborn as sns def analysis_news(): db = pymysql.connect(host='localhost', user='root', password='password', database='news', charset='utf8mb4') df = pd.read_sql('SELECT * FROM news', con=db) df['date'] = pd.to_datetime(df['time'].str.slice(0, 10)) df['hour'] = df['time'].str.slice(11, 13).astype(int) df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month df['weekday'] = df['date'].dt.weekday df['keyword'] = df['title'].str.extract('(疫情|防控|复工|复产|经济|政策|医疗|物资|援助|志愿者)') # 热点话题 keyword_count = df['keyword'].value_counts().head(10) plt.figure(figsize=(8, 6)) sns.barplot(x=keyword_count.values, y=keyword_count.index) plt.title('Top 10 Keywords', fontsize=15) plt.xlabel('Count', fontsize=12) plt.ylabel('Keyword', fontsize=12) plt.show() # 时间分布 time_count = df.groupby(['year', 'month'])['title'].count().reset_index(name='count') plt.figure(figsize=(12, 6)) sns.lineplot(x='month', y='count', hue='year', data=time_count) plt.title('Monthly News Count', fontsize=15) plt.xlabel('Month', fontsize=12) plt.ylabel('Count', fontsize=12) plt.show() # 关键词分布 keyword_hour_count = df.groupby(['keyword', 'hour'])['title'].count().reset_index(name='count') plt.figure(figsize=(12, 6)) sns.lineplot(x='hour', y='count', hue='keyword', data=keyword_hour_count) plt.title('Keyword Hourly News Count', fontsize=15) plt.xlabel('Hour', fontsize=12) plt.ylabel('Count', fontsize=12) plt.show() db.close() ``` 4. Web 可视化: ```python from flask import Flask, render_template, request import pymysql app = Flask(__name__) @app.route('/') def index(): return render_template('index.html') @app.route('/search') def search(): db = pymysql.connect(host='localhost', user='root', password='password', database='news', charset='utf8mb4') keyword = request.args.get('keyword') if keyword: sql = "SELECT * FROM news WHERE title LIKE %s" cursor = db.cursor() cursor.execute(sql, ('%' + keyword + '%',)) news_list = cursor.fetchall() else: news_list = [] db.close() return render_template('search.html', keyword=keyword, news_list=news_list) @app.route('/analysis') def analysis(): analysis_news() return 'Analysis Completed!' if __name__ == '__main__': app.run(debug=True) ``` 5. 网页模板: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>News Crawler</title> </head> <body> <h1>News Crawler</h1> <form action="/search" method="get"> <input type="text" name="keyword"> <input type="submit" value="Search"> </form> <br> <a href="/analysis">Analysis</a> </body> </html> ``` ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Search Results: {{ keyword }}</title> </head> <body> <h1>Search Results: {{ keyword }}</h1> {% if news_list %} <ul> {% for news in news_list %} <li> <a href="{{ news[3] }}">{{ news[1] }}</a> <span>{{ news[2] }}</span> <p>{{ news[4][:100] }}</p> </li> {% endfor %} </ul> {% else %} <p>No results found.</p> {% endif %} </body> </html> ``` 运行方式: 1. 安装 Python 爬虫库 requests、BeautifulSoup 和数据库操作库 pymysql。 2. 确定要爬取新闻网站,并运行 get_news 函数爬取新闻信息,将结果保存到 MySQL 数据库中。 3. 运行 analysis_news 函数进行数据分析和可视化,生成图表展示新闻热点话题、关键词、时间分布等信息。 4. 运行 Flask Web 服务器,将分析结果以网页的形式展示出来,并提供搜索和筛选功能。 参考资料: 1. requests:https://requests.readthedocs.io/en/master/ 2. BeautifulSoup:https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 3. pymysql:https://pymysql.readthedocs.io/en/latest/ 4. pandas:https://pandas.pydata.org/docs/ 5. matplotlib:https://matplotlib.org/stable/contents.html 6. seaborn:https://seaborn.pydata.org/ 7. Flask:https://flask.palletsprojects.com/en/2.0.x/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值