ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 9181|回复: 22

[分享] VBA调用PYTHON采集东方财富网公司聚焦信息

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-8-21 19:08 | 显示全部楼层 |阅读模式
东方财富网首页有个《公司聚焦》栏目,多数情况下是6条上市公司的负面消息。点击《公司聚焦》后进入上市公司频道,里头沪深上市公司的负面消息多一点。

关注这些信息,可主动回避一些问题股。但这些消息隔天就换一批,怎么把每天的这些上市公司信息下载下来,保存在自己的电脑上?


以下这个VBA小程序,可以解决这个问题。
因为PYTHON抓取数据比较方便,所以先用PYTHON抓取东方财富网两个页面的相关数据,再用VBA整理数据。

Sub 黑名单()
Call Shell("C:\Python\Python36\Python.exe D:\mypython\东方财富网-公司聚焦1.py", vbNormalFocus)
Application.Wait (Now + TimeValue("00:00:10"))
Call Shell("C:\Python\Python36\Python.exe D:\mypython\东方财富网-公司聚焦2.py", vbNormalFocus)
Application.Wait (Now + TimeValue("00:00:10"))
Set wkb1 = Workbooks.Open("D:\B001上市日期和所属概念.xlsx")
x1 = wkb1.Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
y1 = wkb1.Sheets("sheet1").Cells(1, Columns.Count).End(xlToLeft).Column
stockcodeandname = Range(Cells(1, 1), Cells(x1, 2))
Set wkb2 = Workbooks.Open("D:\mypython\公司聚焦.xlsx")
x2 = wkb2.Sheets("公司聚焦").Cells(Rows.Count, 1).End(xlUp).Row
y2 = wkb2.Sheets("公司聚焦").Cells(1, Columns.Count).End(xlToLeft).Column
m = Range("a2").Value
gsjj1 = Range(Cells(2, 1), Cells(x2, y2))
Set wkb3 = Workbooks.Open("D:\mypython\公司聚焦2.xlsx")
x3 = wkb3.Sheets("公司聚焦2").Cells(Rows.Count, 1).End(xlUp).Row
y3 = wkb3.Sheets("公司聚焦2").Cells(1, Columns.Count).End(xlToLeft).Column
gsjj2 = Range(Cells(2, 1), Cells(x3, y3))
ThisWorkbook.Activate
Sheets("黑名单").Activate
With Sheets("黑名单")
    x4 = .Cells(Rows.Count, 1).End(xlUp).Row
    y4 = .Cells(1, Columns.Count).End(xlToLeft).Column
    For Each rg2 In .Range("c2:c" & x4)
        View4 = CDate(m)
        If rg2 = View4 Then
            cnt = cnt + 1
        End If
    Next
    If cnt >= 1 Then
        MsgBox "已经保存过了"
    Else
        .Cells(x4 + 1, 3).Resize(UBound(gsjj1), UBound(gsjj1, 2)) = gsjj1
        .Cells(x4 + x2, 3).Resize(UBound(gsjj2), UBound(gsjj2, 2)) = gsjj2
        For Each rg In .Range(Cells(x4 + 1, 4), Cells(x4 + x2 + x3, 4))
            For i = 2 To UBound(stockcodeandname)
                view1 = rg.Value
                view2 = stockcodeandname(i, 2)
                If InStr(rg, stockcodeandname(i, 2)) Then
                    rg.Offset(0, -3) = stockcodeandname(i, 1)
                    rg.Offset(0, -2) = stockcodeandname(i, 2)
                End If
            Next
        Next
    End If
    Set r1 = .Range(Cells(2, 1), Cells(x4 + x2 + x3, 5))
    r1.Font.Name = "宋体"
    r1.Font.Size = "9"
End With
wkb1.Close
wkb2.Close
wkb3.Close
End Sub



输出结果:

输出结果:

TA的精华主题

TA的得分主题

发表于 2018-8-21 20:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不能通用吧,还要另外安装python,而且你也不把python代码分享出来,只贴这个没多大作用吧

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-21 20:11 | 显示全部楼层
说的有理,python代码来了
# -*- coding: utf-8 -*-

import xlsxwriter
import xlrd
import requests
import datetime
from bs4 import BeautifulSoup

book=xlsxwriter.Workbook(r'D:\mypython\公司聚焦.xlsx')
table = book.add_worksheet(u"公司聚焦")
row=1
r = requests.get("http://www.eastmoney.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text,'html.parser')
jd=soup.select('.newsboxb.gsjj-news-list')[0]
for reirong in jd.select('a'):
    if len(reirong.text)>4:
    #print(reirong)
        biaoti=reirong.text
        link=reirong['href']
        mydate=datetime.datetime.now().strftime('%Y-%m-%d')
        print(mydate,biaoti,link)
        table.write_row(0, 0, ['日期', '标题', '链接'])
        table.write(row,0,mydate)
        table.write(row,1,biaoti)
        table.write(row,2,link)
        row +=1
book.close()
        



   

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-21 20:16 | 显示全部楼层

# coding: utf-8

# In[1]:


# -*- coding: utf-8 -*-

import xlsxwriter
import xlrd
import requests
import datetime
from bs4 import BeautifulSoup

book=xlsxwriter.Workbook(r'D:\mypython\公司聚焦2.xlsx')
table = book.add_worksheet(u"公司聚焦2")
row=1
r = requests.get("http://finance.eastmoney.com/company.html")
r.encoding="utf-8"
soup=BeautifulSoup(r.text,'html.parser')
jd=soup.select('.list-ul')[0]
for reirong in jd.select('a'):
    if len(reirong.text)>4:
    #print(reirong)
        biaoti=reirong.text
        link=reirong['href']
        mydate=datetime.datetime.now().strftime('%Y-%m-%d')
        print(mydate,biaoti,link)
        table.write_row(0, 0, ['日期', '标题', '链接'])
        table.write(row,0,mydate)
        table.write(row,1,biaoti)
        table.write(row,2,link)
        row +=1
book.close()

TA的精华主题

TA的得分主题

发表于 2018-8-22 08:49 | 显示全部楼层
既然会python,为什么不一部到位,还要用vba来调用

TA的精华主题

TA的得分主题

发表于 2018-8-22 08:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
用python就可以了,为啥还多次一举用VBA.....
闲得慌么。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-8-22 16:03 | 显示全部楼层
jiangxiaoyun 发表于 2018-8-22 08:53
用python就可以了,为啥还多次一举用VBA.....
闲得慌么。。。。

这不是VBA平台嘛

TA的精华主题

TA的得分主题

发表于 2018-8-22 16:07 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-8-22 16:35 | 显示全部楼层

呵呵,这思路好。
其实你的Py 用pyinstaller 打个包更好,然后就直接调 exe 了。

TA的精华主题

TA的得分主题

发表于 2018-11-14 17:47 | 显示全部楼层
Call Shell("C:\Python\Python36\Python.exe D:\mypython\东方财富网-公司聚焦1.py", vbNormalFocus)
为什么我用上面语句在VBA调用时,窗口就闪了一下,然后就没有任何反应了,Python代码也没有执行……
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 04:43 , Processed in 0.032414 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表