【爬取网易财经文章】

引言

在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章

1. 爬虫代码概述

本文将使用Python编写一个爬虫程序,该程序能够爬取网易财经下关于财经的文章,并将爬取的结果保存为JSON文件。爬虫程序的主要流程如下:

  • 设置请求头信息,模拟浏览器访问
  • 定义爬取函数,根据不同的文章类型爬取相应的URL
  • 解析爬取的网页内容,提取文章标题、链接等信息
  • 将爬取结果保存为JSON文件
  • 多线程并发爬取文章内容并保存

2. 网页分析与URL获取

在爬取网易财经的文章之前,我们需要先分析网页结构并获取相应的URL。通过分析,我们发现网易财经的财经文章分为股票、商业、基金、房产和理财五个类别。每个类别的文章都有对应的URL,我们可以根据这些URL来爬取相应的文章

base_url = ['https://money.163.com/special/00259BVP/news_flow_index.js?callback=data_callback',
            'https://money.163.com/special/00259BVP/news_flow_biz.js?callback=data_callback',
            'https://money.163.com/special/00259BVP/news_flow_fund.js?callback=data_callback',
            'https://money.163.com/special/00259BVP/news_flow_house.js?callback=data_callback',
            'https://money.163.com/special/00259BVP/news_flow_licai.js?callback=data_callback']

3. 爬虫实现

我们使用Python的requests库发送HTTP请求并使用BeautifulSoup库解析网页内容。以下是爬取网易财经文章的主要代码:

import requests
import re
from bs4 import BeautifulSoup
from tqdm import tqdm
import os
import bag
from concurrent.futures import ThreadPoolExecutor

# 设置请求头信息
session = requests.session()
session.headers['User-Agent'] = r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
session.headers['Referer'] = r'https://money.163.com/'
session.headers['Accept-Language'] = 'zh-CN,zh;q=0.9'

# 定义爬取函数
def get_url(url, kind):
    num = 1
    result = []
    while True:
        if num == 1:
            resp = session.get(url)
        else:
            if num < 10:
                resp = session.get(url.replace('.js?callback=data_callback', '') + f'_0{num}' + '.js?callback=data_callback')
            else:
                resp = session.get(url.replace('.js?callback=data_callback', '') + f'_{num}' + '.js?callback=data_callback')
        if resp.status_code == 404:
            break
        num += 1
        title = re.findall(r'"title":"(.*?)"', resp.text, re.S)
        docurl = re.findall(r'"docurl":"(.*?)"', resp.text, re.S)
        label = re.findall('"label":"(.*?)"', resp.text, re.S)
        keyword = re.findall(r'"keywords":\[(.*?)]', resp.text, re.S)
        mid = []
        for k in keyword:
            mid1 = []
            for j in re.findall(r'"keyname":"(.*?)"', str(k), re.S):
                mid1.append(j.strip())
            mid.append(','.join(mid1))
        for i in range(len(title)):
            result.append([
                title[i],
                docurl[i],
                label[i],
                kind,
                mid[i]
            ])
    return result

# 爬取文章内容
def get_data(ls):
    resp = session.get(ls[1])
    resp.encoding = 'utf8'
    resp.close()

    html = BeautifulSoup(resp.text, 'lxml')

    content = []
    p = re.compile(r'<p.*?>(.*?)</p>', re.S)
    contents = html.find_all('div', class_='post_body')
    for info in re.findall(p, str(contents)):
        content.append(re.sub('<.*?>', '', info))
    return [ls[-1], ls[0], '\n'.join(content), ls[-2], ls[1]]

# 主函数
def main():
    base_url = ['https://money.163.com/special/00259BVP/news_flow_index.js?callback=data_callback',
                'https://money.163.com/special/00259BVP/news_flow_biz.js?callback=data_callback',
                'https://money.163.com/special/00259BVP/news_flow_fund.js?callback=data_callback',
                'https://money.163.com/special/00259BVP/news_flow_house.js?callback=data_callback',
                'https://money.163.com/special/00259BVP/news_flow_licai.js?callback=data_callback']
    kind = ['股票', '商业', '基金', '房产', '理财']

    path = r'./财经(根数据).json'
    save_path = r'./财经.json'

    if os.path.isfile(path):
        source_ls = bag.Bag.read_json(path)
    else:
        source_ls = []

    index = 0
    urls = []
    for url in base_url:
        result = get_url(url, kind[index])
        index += 1
        urls = urls + result

    newly_added = []
    if len(source_ls) == 0:
        bag.Bag.save_json(urls, path)
        newly_added = urls
    else:
        flag = [i[1] for i in source_ls]
        for link in urls:
            if link[1] in flag:
                pass
            else:
                newly_added.append(link)
    if len(newly_added) == 0:
        print('无新数据')
    else:
        bag.Bag.save_json(newly_added + source_ls, path)
        if os.path.isfile(save_path):
            data_result = bag.Bag.read_json(save_path)
        else:
            data_result = []
        with ThreadPoolExecutor(max_workers=20) as t:
            tasks = []
            for url in tqdm(newly_added, desc='网易财经'):
                url: list
                tasks.append(t.submit(get_data, url))

            end = []
            for task in tqdm(tasks, desc='网易财经'):
                end.append(task.result())
            bag.Bag.save_json(end + data_result, save_path)

if __name__ == '__main__':
    main()

4. 结果保存与展示

爬取的结果将保存为JSON文件,方便后续处理和分析。可以使用bag库来保存和读取JSON文件。以下是保存结果的代码:

import os
import bag

# 保存结果
path = r'./财经(根数据).json'
save_path = r'./财经.json'

if os.path.isfile(path):
    source_ls = bag.Bag.read_json(path)
else:
    source_ls = []
...
...

if len(newly_added) == 0:
    print('无新数据')
else:
    bag.Bag.save_json(newly_added + source_ls, path)
    if os.path.isfile(save_path):
        data_result = bag.Bag.read_json(save_path)
    else:
        data_result = []
    with ThreadPoolExecutor(max_workers=20) as t:
        tasks = []
        for url in tqdm(newly_added, desc='网易财经'):
            url: list
            tasks.append(t.submit(get_data, url))

        end = []
        for task in tqdm(tasks, desc='网易财经'):
            end.append(task.result())
        bag.Bag.save_json(end + data_result, save_path)

5.运行结果

6. 总结

本文介绍了如何使用Python编写一个爬虫程序来爬取网易财经下关于财经的文章。通过分析网页结构,获取相应的URL,并使用requests和BeautifulSoup库来发送HTTP请求和解析网页内容。最后,将爬取的结果保存为JSON文件。该爬虫程序可以帮助投资者和金融从业者快速获取财经资讯,提高工作效率。

最后如果你觉得本教程对你有所帮助,不妨点赞并关注我的CSDN账号。我会持续为大家带来更多有趣且实用的教程和资源。谢谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/477994.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bilibili哔哩哔哩视频播放界面鼠标消失视频不能快进问题解决

问题环境&#xff1a; 在电脑哔哩哔哩视频播放鼠标在方框外使用&#xff0c;移动到方框内鼠标光标消失&#xff0c;快进等功能不能使用&#xff0c;严重影响使用体验。 问题解决&#xff1a; 因为使用了类似网页文本复制的插件导致出现这样的故障&#xff0c;删除或者临时关闭…

Python教程92:print实现的3个动画特效(打字机+旋转式进度+覆盖式打印显示)

print() 应该是初学者最先接触到的第一个 Python 函数&#xff0c;因为几乎所有的启蒙课程都是从 print(‘Hello world’) 开始的。事实上&#xff0c; print() 也是程序员使用频率最高的函数之一&#xff0c;同时也是很多程序员喜欢的代码调试利器。 1.打字机效果&#xff0c…

备考ICA----Istio实验4---使用 Istio 进行金丝雀部署

备考ICA----Istio实验4—使用 Istio 进行金丝雀部署 上一个实验已经通过DestinationRule实现了部分金丝雀部署的功能,这个实验会更完整的模拟展示一个环境由v1慢慢过渡到v2版本的金丝雀发布. 1. 环境清理 kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld…

redis瘦身版

线程模型 纯内存操作/非阻塞io多路复用/单线程避免多线程频繁上下文切换 基于Reactor模式开发了网络事件处理器&#xff1a;文件事件处理器&#xff0c;单线程的 io多路监听多个socket&#xff0c;据socket事件类型选择对应的处理器&#xff0c;高性能网络通信模型&#xff0c…

CTF题型 md5考法例题汇总

CTF题型 md5考法相关例题总结 文章目录 CTF题型 md5考法相关例题总结一.md5弱字符相等()[SWPUCTF 2021 新生赛]easy_md5 二.md5强字符相等()1)文件相等[2024 qsnctf 擂台赛 easy_md5]2)字符相等[安洵杯 2019]easy_web 三.md5哈希长度扩展攻击[NPUCTF2020]ezinclude文件包含利用…

配置视图解析器

我们在指定视图的时候路径是有重复的&#xff0c;重复的操作可以用视图解析器&#xff0c;让框架帮我们&#xff1a; mv.setViewName("/WEB-INF/view/show.jsp");mv.setViewName("/WEB-INF/view/other.jsp"); 配置视图解析器&#xff1a; 注册视图解析器:帮…

34 vue 项目默认暴露出去的 public 文件夹 和 CopyWebpackPlugin

前言 这里说一下 vue.config.js 中的一些 public 文件夹是怎么暴露出去的? 我们常见的 CopyWebpackPlugin 是怎么工作的 ? 这个 也是需要 一点一点积累的, 因为 各种插件 有很多, 不过 我们仅仅需要 明白常见的这些事干什么的即可 当然 以下内容会涉及到一部分vue-cli,…

Python爬虫实战—探索某网站电影排名

文章目录 Python爬虫实战—探索某网站电影排名准备工作编写爬虫代码代码解析运行情况截图进一步优化和说明完整代码总结 说明&#xff1a;本案例以XXX网站为例&#xff0c;已隐去具体网站名称与地址。 Python爬虫实战—探索某网站电影排名 网络爬虫是一种自动化程序&#xff0…

SQLiteC/C++接口详细介绍sqlite3_stmt类(十三)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;十二&#xff09; 下一篇&#xff1a; 待续 51、sqlite3_stmt_scanstatus_reset sqlite3_stmt_scanstatus_reset 函数用于重置指定语句对象最近一次执行的 WHER…

Vue3 Vite3 状态管理 pinia 基本使用、持久化、在路由守卫中的使用

参考https://juejin.cn/post/7152774411571953677&#xff0c;自己简洁化了一部分 1.安装pinia依赖 yarn add pinia 创建pini实例 根目录创建store文件夹&#xff0c;然后创建index.js import { createPinia } from piniaconst pinia createPinia()export default pinia …

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中&#xff0c;敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人&#xff1a;辜渝傧13037102709 题号&#xff1a;试题04 ZZ052-大数据应用与服务赛选赛题04 模块一&#xff1a;平台搭建…

一文带你看懂 前后端之间图片的上传与回显

一文带你看懂 前后端之间图片的上传与回显 前言 看了很多类似的文章&#xff0c;发现很多文章&#xff0c;要不就是不对&#xff0c;要不就是代码写的不通俗易懂&#xff0c;所以有了这篇文章&#xff0c;我将会从原理到实战&#xff0c;带你了解 实战包含前端 原生 vue3 rea…

阿里云OCR文字识别-Python3接口

1.注册/登录阿里云账号 官网链接注册登录 2.选择阿里云OCR产品 选择产品 3.开通阿里云OCR产品 开通服务&#xff08;每个月赠送200次&#xff0c;不用超就不额外收费&#xff09; 4.进入调试页面&#xff0c;下载SDK示例 下载SDK模板 5.创建 AccessKey密钥 RAM传送门 创建…

外腔激光器(ECL)市场发展空间大 外腔半导体激光器(ECDL)是主要产品类型

外腔激光器&#xff08;ECL&#xff09;市场发展空间大 外腔半导体激光器&#xff08;ECDL&#xff09;是主要产品类型 外腔激光器&#xff08;ECL&#xff09;&#xff0c;是一种利用外腔进行光反馈的激光器。根据新思界产业研究中心发布的《》2024-2029年中国外腔激光器&…

立体式学习灯最推荐哪款?书客、孩视宝、雷士等热销大路灯强势PK!

立体式学习灯是一款能够帮助长时间伏案工作以及学习人群的照明家电,正因为其优越的表现也受到了不少消费者的喜爱。作为一名电器博主,我也购入过不少立体式学习灯但时有买到一些光线不足、品质差的大路灯&#xff0c;呈现出来的光线不能提升照明条件&#xff0c;反而还会引起越…

LeetCode每日一题【19. 删除链表的倒数第 N 个结点】

思路&#xff1a;快慢指针 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x)…

瑞_Redis_商户查询缓存_什么是缓存

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 附&#xff1a;缓存封装工具类 &#x1f64a; 前言&#xff1a;本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓…

【数据库系统】数据库完整性和安全性

第六章 数据库完整性和安全性 基本内容 安全性&#xff1b;完整性&#xff1b;数据库恢复技术&#xff1b;SQL Server的数据恢复机制&#xff1b; 完整性 实体完整性、参照完整性、用户自定义完整性 安全性 身份验证权限控制事务日志&#xff0c;审计数据加密 数据库恢复 冗余…

Vue3 v-for绑定的dom获取ref为undefined

这是代码结构 <div class"playerInfo" v-for"(item, index) in data.playersInfo" :key"index" :ref"el > {if(el)playersRef[index] el}":style"left:${item.position[0]};top:${item.position[1]}"click"pla…

【ZooKeeper】2、安装

本文基于 Apache ZooKeeper Release 3.7.0 版本书写 作于 2022年3月6日 14:22:11 转载请声明 下载zookeeper安装包 wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz解压 tar -zxvf apache-zookeeper-3.7.0-b…