【爬取网易财经文章】

news2024/11/13 15:31:48

引言

在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用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账号。我会持续为大家带来更多有趣且实用的教程和资源。谢谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从IO操作与多线程的思考到Redis-6.0

IO操作->线程阻塞->释放CPU资源->多线程技术提升CPU利用率 在没有涉及磁盘操作和网络请求的程序中&#xff0c;通常不会出现线程等待状态。线程等待状态通常是由于线程需要等待某些事件的发生&#xff0c;比如I/O操作完成、网络请求返回等。如果程序只是进行计算或者简…

Unity多人游戏基础知识总结

作者简介: 高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…

ETCD跨城容灾与异地多活网络故障的相关表现分析

ETCD跨城容灾与异地多活网络故障的相关表现分析 1. 网络架构2. 单个网络中断-跟leader区中断2.1. 网络中断2.2. 网络恢复 3. 单个网络中断-跟非leader区中断4. 两个网络中断-leader区中断5. 两个网络中断-非leader区中断6. 两个网络中断-非leader区中断7. 总结8. 参考文档 etcd…

国内ip切换是否合规?

在网络使用中&#xff0c;IP地址切换是一种常见的行为&#xff0c;可以用于实现隐私保护、访问地域限制内容等目的。然而&#xff0c;对于国内用户来说&#xff0c;IP地址切换是否合规一直是一个备受关注的话题。在中国&#xff0c;网络管理严格&#xff0c;一些IP切换行为可能…

ArtDD 一键下载 掘金、CSDN、开源中国、博客园文章 文章的Chrome 插件

有想一键下载博客园、掘金、CSDN、开源中国等博客自己的文章到本地的可以使用这个插件 插件会根据当前页面链接自动分辨出文章所属平台&#xff0c;可能有些文章详情链接是不支持的&#xff0c;例如博客园存在很多个版本的文章详情页链接格式&#xff0c;想要支持所有的链接是…

MySQL Workbench连接云服务器内网数据库

在项目上遇到一个问题&#xff0c;生产环境是Centos&#xff0c;分配了两台云服务器&#xff0c;一台应用服务&#xff0c;一台数据库服务&#xff0c;应用服务与数据库服务采用内网连接。我作为开发和运维方&#xff0c;有权限直接访问应用服务&#xff0c;但是数据库服务器需…

vivado 增量实施

增量实施 增量实现是指增量编译的实现阶段设计流程&#xff1a; •通过重用参考设计中的先前布局和布线&#xff0c;保持QoR的可预测性。 •加快地点和路线的编制时间或尝试最后一英里的计时关闭。 下图提供了增量实现设计流程图。该图还说明了增量合成流程。有关增量的更多…

基于springboot+vue的毕业论文管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

文献速递:深度学习乳腺癌诊断---使用深度学习改善乳腺癌诊断的MRI技术

Title 题目 Improving breast cancer diagnostics with deep learning for MRI 使用深度学习改善乳腺癌诊断的MRI技术 01 文献速递介绍 乳腺磁共振成像&#xff08;MRI&#xff09;是一种高度敏感的检测乳腺癌的方式&#xff0c;报道的敏感性超过80%。传统上&#xff0c;其…

CorelDRAW2024中文最新版本新增功能及更新日志

作为一名软件工程师&#xff0c;对于各种软件&#xff0c;尤其是图形设计软件&#xff0c;如CorelDRAW的最新版本信息通常会有所了解。CorelDRAW作为一款功能强大的图形设计软件&#xff0c;其2024中文版的发布无疑为设计师们带来了全新的体验。以下是我为你整理的关于CorelDRA…

20240309web前端_第二周作业_完成游戏导航栏

作业&#xff1a;游戏导航栏 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

Docker构建多平台(x86,arm64)构架镜像

这里写自定义目录标题 背景配置buildx开启experimental重启检查 打包 背景 docker镜像需要支持不同平台架构 配置buildx 开启experimental vi /etc/docker/daemon.json {"experimental": true }或者 重启检查 # 验证buildx版本 docker buildx version# 重启do…

策略路由PBR

PBR策略路由_路由环路policy-based-routeing 1、路由策略&#xff1a; 首先要了解什么是路由策略&#xff1a;首先需要在路由器上运行路由协议&#xff0c;然后在路由协议进程中通过某些工具&#xff0c;对路由进行策略修改&#xff0c; 比如通过filter-policy import-route…

【规范】小程序发布,『小程序隐私保护指引』填写指南

前言 &#x1f34a;缘由 『小程序隐私保护指引』小程序发布&#xff0c;每次都躲不开&#xff01; &#x1f3c0;事情起因&#xff1a; 最近在帮朋友弄一个小项目&#xff0c;uniappunicloud壁纸小程序。虽然之前做过不少小程序&#xff0c;但是每次发布正式版本时都有一步『…

kafka面试篇

消息队列的作用&#xff1a;异步、削峰填谷、解耦 高可用&#xff0c;几乎所有相关的开源软件都支持&#xff0c;满足大多数的应用场景&#xff0c;尤其是大数据和流计算领域&#xff0c; kafka高效&#xff0c;可伸缩&#xff0c;消息持久化。支持分区、副本和容错。 对批处理…

python四川火锅文化网站的设计与实现flask-django-php-nodejs

四川火锅文化网站的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0c;…

Android ViewPager不支持wrap_content的原因

文章目录 Android ViewPager不支持wrap_content的原因问题源码分析解决 Android ViewPager不支持wrap_content的原因 问题 <androidx.viewpager.widget.ViewPagerandroid:id"id/wrap_view_pager"android:layout_width"match_parent"android:layout_he…

QT6 android下配置文件打包到APK

一.遇到问题 用QT做android开发&#xff0c;生成的apk文件默认不包含程序配置文件和png文件&#xff0c;导致程序在android上无法读取必要的参数和logo&#xff0c;本文主要解决这个问题&#xff0c;并详细讲述QT android 的apk程序打包流程。 二.APK打包流程 1.如何生成APK 当…

STM32关于使用定时器触发ADC转换的理解

以STM32 ADC的常规通道为例&#xff08;注入通道类似&#xff09;&#xff1a; 如上图&#xff0c;STM32 ADC的常规通道可以由以上6个信号触发任何一个&#xff0c;我们以使用TIM2_CH2触发ADC1&#xff0c;独立模式&#xff0c;每次仅测一条通道&#xff0c;则ADC的配置如下&am…