我使用过的聊天工具

今早突然不小心打开了Skype,看到仍有几个在线的好友。想了一下,应该有2年没打开Skype了。曾经,Skype占据了我社交生活的很大一部分。如今已经不登录了。
回忆了一下,曾经用过的聊天工具。
QQ,沿用至今
UC,昙花一现
MSN,上面都是同事 – 已经不存在了
Skype,上面都是同事 – 现在基本不联系了
WhatsApp,曾是跟欧洲人联系的工具
Wechat,现在成为生活工作的一部分

回顾我使用过的聊天工具的变迁过程,小小的自己就像被夹裹在历史的滚滚洪流中的一片小树叶,顺流而下。

爬虫新技巧,Power BI如何抓取网页数据?

前几天,Tony老师帮朋友写了一个爬虫工具,抓取网页上的股票信息,后来有人问我,有其它更方便的方法吗?
还真有!不用编程,鼠标点几下,就把网页的信息抓取到表格里面去,然后还能直接分析数据,而且软件也免费。。。
这么牛逼的软件是什么呢?那就是Power BI。
接下来,Tony老师会开一系列课程,教大家学习Power BI,如果你有兴趣学Power BI,欢迎加入QQ群,共同探讨:282308215

我们以一个实际案例来学习如何抓取网页数据:
统计过去一个月上海的天气情况。

在Google上搜索上海天气,第三个链接应该是这个:
http://tianqi.2345.com/wea_history/58362.htm

打开Power BI,在数据源的地方选择Web,并输入网址。

选择Table 0,点Load,我们看到天气的数据已经被我们抓取到表格里面了。

我们看到最高气温和最低气温是字符串28℃,这样没办法做数据对比,我们要把28和℃分开。
这就要用到一个Power Query的工具。
顺便提一下,使用Power BI的顺序(一定记住了):
Power Query -> Power Pivot -> Power View
在菜单栏点Edit Queries

选中要分列的字段点右键,选中【拆分列】-【按照从数字到非数字转换】

然后把数字字段转换为浮点数据类型,同样通过点右键【更改类型】-【小数】

我们可以点【高级编辑】,看一下M语言
Power BI里面有两种语言,一个是M语言,是在Power Query里整理数据源的时候的语言,另外一种是DAX语言,类似于Excel公式的一种语言。

点击左上角的【关闭并应用】,关闭Power Query。
在View界面的可视化点【折线】并设置如下参数:

点【堆积条形图】,并设置如下参数:

瞬间可以做出下面的图表:

是不是很神奇,Tony老师试了几个能够展现出Table样式的网页,基本上都能抓取成功,包括股票,天气,成绩。。。。。。
如果你想学Power BI,欢迎关注Tony老师。或者加入QQ群,共同学习:282308215
今天先讲到这里,谢谢。

自动保存邮件附件至指定文件夹

最近有个需求,ERP系统会自动发很多csv附件到我邮箱,我需要把这些附件上传到FTP服务器,服务器会把这些csv的数据写到另外一个系统的数据库。
每次大概有30个邮件,每个邮件有一个附件,而且附件的名字都一样,是一个csv的文件,我每次需要手动的把附件另存为一个新名字存到本地,然后FTP上传。
每次大概要浪费我10分钟时间,而且毫无价值。
于是我就写了一个VBA的自动处理程序,几秒搞定。

如果你也有类似的需求,或者把附件再进行写入数据库,或者附件是Excel,需要整合到数据库,可以再在服务器开发一个自动处理机器人,设置每5分钟检测一下是否有新文件,如果有就写入数据库或添加到一个总Excel表格。这些VBA 或 C#都可以完美处理。

话说把大象装进冰箱分三个步骤:
第一步:
打开Outlook – Option – Trust Center – Truster Center Settings – Macro Settings – 勾选Enable all macros。
打开Outlook – Option – Trust Center – Truster Center Settings – Email Security – 勾选Allow script in shared folders 和 All script in public folders
重点:重启Outlook,我因为没重启outlook,浪费了很多时间。
第二步:
编写宏程序,按下Alt+F11,创建新项目,把程序copy进去,文件夹地址改一下

Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Public Sub SaveAttach(MyItem As Outlook.MailItem)
    SaveAttachment MyItem, "C:\Data\MailAttached\"
    'MsgBox "附件已保存"
End Sub

Private Sub SaveAttachment(ByVal Item As Outlook.MailItem, path, Optional condition = "*")
    Dim olAtt As Outlook.Attachment
    Dim i As Integer
    Dim dateFormat
    dateFormat = Format(Now, "yyyy-mm-dd hh-mm-ss")
    If Item.Attachments.Count > 0 Then
        For i = 1 To Item.Attachments.Count
            Set olAtt = Item.Attachments(i)
            If olAtt.FileName Like condition Then
                olAtt.SaveAsFile path & dateFormat & "_" & olAtt.FileName
            End If
        Next
    End If
    Set olAtt = Nothing
    Sleep 1000
End Sub

如下图:保存解释一下,因为我每个附件名字都相同,用时间重命名,只能到秒这个级别,所以我每次处理都Sleep 1秒,否则有可能会覆盖掉上一个文件。

第三步:制作运行规则,这一步比较简单,只放一张图片,仔细看每个设定

C# 任务调度神器 FluentScheduler

最近几天在写一些自动执行的程序,按照古老的做法就是做成exe可执行文件,并且在任务执行完自动退出。然后用Windows的Task Scheduler按照要求设置执行时间和执行频率,可以做到近乎所有能想到的执行Job。

但是有一些很频繁的任务,秒级别的,这个就实现不了了,传统的做法是只能打包成服务,安装到服务器上执行。
今天在网上突然发现了这个神器,FluentSchedule,直接在Nuget里搜索安装,调用特别方便,简直是任务调度的神器!

FluentScheduler 中 对象: IJob(工作)、Registry(注册)、Schedule(计划)

首先做一个简单的实例

using FluentScheduler;
/// <summary>
///  工作类
/// </summary>
public class MyJob : IJob
{
    public void Execute()
    {
         //编写需要工作的内容
         //比如输出一句话
         Console.WriteLine("执行工作!");
    }
}
using FluentScheduler; 
/// <summary>
///  注册表
/// </summary>
public class MyRegistry : Registry
{   
    //无参构造函数
    public MyRegistry()
    {
        //安排任务运行在一个区间
        Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds(); 
        
        // 安排任务运行一次,由一个特定的时间间隔延迟。
        Schedule<MyJob>().ToRunOnceIn(5).Seconds(); 
        
        //安排一个简单的任务在一个特定的时间运行
        Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);
        
        //安排一个更复杂的行动,立即运行和每月的时间间隔
        Schedule(() =>
        {
            Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
            Thread.Sleep(1000);
            Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
        }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); 
        
        //计划多个任务在一个单一的日程安排中运行
        Schedule<MyJob>().AndThen<MyOtherJob>().ToRunNow().AndEvery(5).Minutes();
    }
}

在ASP.NET程序的Global.asax文件中,首先初始化管理器,这样定时器就开启了。

protected void Application_Start()
 {
     JobManager.Initialize(new MyRegistry());
 }

以上是第一种写法,下面介绍第二种写法,这里执行多个任务 不同时间段

protected void Application_Start()
 {
     JobManager.AddJob(t=>t.ToRunEvery(1).Days().At(24,00));//每天的凌晨12点 执行 
     JobManager.AddJob(t => t.ToRunEvery(1).Months().OnTheLastDay().At(8,30));//每个月的最后一天早上八点半 执行
     JobManager.Start();//启动任务管理器
 }

网页自动操作:爬虫 – 获取股票信息

上次写了《自动录入机器人》后,很多朋友问我能不能帮做各种场景的问题,回答了几个问题后,总结一下:需求集中在把Excel表中数据录入系统。我在这里统一回答:只要有网页端的系统,都可以自动录入!

最近有个朋友在分析股票,把相关股票信息收集到Excel里进行分析,包括历史记录及每天的更新。每天往Excel表里更新几十支股票的信息是一个没有任何价值但是不得不去做的事情。问我能不能帮忙搞一个自动抓取股票信息,包括股票代码,日期,开盘价,收盘价,最高价,最低价以及每天的交易量。

以Tesla为例:通过Yahoo可以看到详细的历史记录https://finance.yahoo.com/quote/TSLA/history?p=TSLA

数据都有,只要把网页的xPath分析出来,写入Excel就可以了。

目前能解析xPath的工具有:

  • HtmlAgilityPack (只有一个dll文件,不用引用其它dll)
  • AngleSharp
  • DotnetSpider(国产,要引用超级多dll,有40多个)

我选用的HtmlAgilityPack,因为它简单,只引用一个dll文件就可以了。
Excel操作用的微软官方的 Microsoft.Office.Interop.Excel

软件使用:
先在Excel文件的CompanyCode表中维护你要下载的股票代码,保存关闭Excel:

运行软件:选择你刚刚保存的Excel文件,点击Download

等运行完毕后,软件自动退出

打开Excel看一下结果吧

结果还不错吧。
如果你有相同的需求,欢迎加微信免费索取软件: