标签: .net

  • .NET中如何使用PhantomJS与Selenium模拟采集数据

    在现代 web 开发中,数据采集是一个非常常见的需求。无论是从网站中提取信息,还是进行自动化测试,模拟用户行为都变得尤为重要。在 .NET 环境中,常见的两种模拟采集的工具是 PhantomJSSelenium。这两者各具特点,适用于不同的场景。本文将介绍这两款工具及其如何在 .NET 中使用。

    1. PhantomJS——无头浏览器的利器

    什么是 PhantomJS?

    PhantomJS 是一个无头浏览器(headless browser),意味着它没有图形界面,完全通过命令行操作。它可以模拟浏览器行为,执行网页中的 JavaScript 代码,获取渲染后的网页内容,并支持截图、页面交互等操作。由于它不需要图形界面,运行效率比普通浏览器更高,尤其适用于大规模的网页抓取和自动化测试。

    PhantomJS 在数据采集中的应用

    PhantomJS 非常适合用来进行 网页抓取,特别是当页面内容通过 JavaScript 动态生成时。很多现代网站的数据展示依赖于 JavaScript 渲染,传统的 HTML 解析工具(如 HtmlAgilityPack)在这种情况下无法直接提取数据,而 PhantomJS 可以通过模拟浏览器,渲染页面并抓取其中的数据。

    在 .NET 中使用 PhantomJS

    虽然 PhantomJS 自身是用 JavaScript 编写的,但我们可以通过使用外部库来在 .NET 中调用 PhantomJS。一个常用的库是 PhantomJS.Net,它提供了 .NET 与 PhantomJS 的接口,使得在 .NET 中模拟浏览器变得更加方便。

    使用 PhantomJS.NET 的示例代码:

    // language: csharp
    using System;
    using PhantomJS.Net;
    
    class Program
    {
        static void Main()
        {
            var driver = new PhantomJSDriver();
            driver.Navigate().GoToUrl("https://example.com");
    
            // 获取渲染后的网页内容
            var pageSource = driver.PageSource;
            Console.WriteLine(pageSource);
    
            driver.Quit();
        }
    }

    在这个示例中,我们首先初始化了一个 PhantomJS 驱动器,加载了目标网页,然后获取了渲染后的 HTML 内容。

    2. Selenium——强大的自动化测试工具

    什么是 Selenium?

    Selenium 是一款广泛使用的自动化测试工具,支持多种编程语言(包括 C#、Java、Python 等)。它不仅可以用来模拟浏览器行为,还支持模拟用户操作,如点击、输入、滚动等。Selenium 支持所有现代浏览器,包括 Chrome、Firefox 和 Safari 等,除了无头浏览器模式(headless mode)外,它还支持在有图形界面的环境下操作浏览器。

    Selenium 在数据采集中的应用

    Selenium 可以模拟真实的用户行为,因此非常适合 交互式数据采集。例如,你需要登录网站、填写表单、点击按钮来获取数据时,Selenium 是一个理想的选择。而且它支持 JavaScript 执行,因此可以抓取动态加载的网页内容。

    在 .NET 中使用 Selenium

    在 .NET 环境中使用 Selenium 需要安装相应的 NuGet 包。常见的库有 Selenium.WebDriverSelenium.WebDriver.ChromeDriver,这些包可以通过 NuGet 安装。

    使用 Selenium 的示例代码:

    // language: csharp
    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using System;
    
    class Program
    {
        static void Main()
        {
            // 设置 Chrome 驱动器
            var options = new ChromeOptions();
            options.AddArgument("headless"); // 无头模式
    
            var driver = new ChromeDriver(options);
            driver.Navigate().GoToUrl("https://example.com");
    
            // 获取渲染后的网页内容
            var pageSource = driver.PageSource;
            Console.WriteLine(pageSource);
    
            driver.Quit();
        }
    }
    

    这个示例展示了如何通过 Selenium 在无头模式下启动 Chrome 浏览器,加载目标网页,并获取渲染后的 HTML 内容。

    3. PhantomJS 与 Selenium 的对比

    虽然 PhantomJS 和 Selenium 都可以用来模拟采集,但它们有一些显著的区别:

    特性PhantomJSSelenium
    浏览器类型无头浏览器 (Headless Browser)可以支持有头和无头浏览器
    性能高效,启动速度快,适合大规模抓取启动速度稍慢,但更强大、灵活
    JavaScript 支持完全支持 JavaScript完全支持 JavaScript
    支持的浏览器仅 PhantomJS支持所有主要浏览器(Chrome, Firefox, Safari)
    适用场景爬虫和抓取静态页面自动化测试和交互式爬虫

    从对比表格中可以看出,PhantomJS 更适合于快速的网页抓取,尤其是当你只需要获取页面内容而不需要模拟用户交互时。而 Selenium 更适合需要复杂交互的场景,如登录、填写表单、点击按钮等。

    4. 总结

    PhantomJS 和 Selenium 都是强大的工具,能够帮助开发者在 .NET 中模拟浏览器行为进行数据采集。选择哪个工具取决于你的需求:

    • 如果你需要快速抓取页面并且不需要复杂的用户交互,PhantomJS 是一个不错的选择。
    • 如果你需要模拟更复杂的用户行为(如填写表单、点击按钮等),Selenium 会更为适合。

    无论你选择哪个工具,正确使用它们将能帮助你高效地进行数据采集工作。

  • Debian12安装dotnet sdk

    安装微软源:

    wget https://packages.microsoft.com/config/debian/12/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    
    sudo dpkg -i packages-microsoft-prod.deb
    
    rm packages-microsoft-prod.deb

    安装 SDK

    sudo apt-get update && sudo apt-get install -y dotnet-sdk-9.0

    安装运行时

    sudo apt-get update &&  sudo apt-get install -y aspnetcore-runtime-9.0

    作为 ASP.NET Core 运行时的一种替代方法,你可以安装不包含 ASP.NET Core 支持的 .NET 运行时:将上一命令中的 aspnetcore-runtime-9.0 替换为 dotnet-runtime-9.0:

    sudo apt-get install -y dotnet-runtime-9.0

    使用 apt 更新 .NET

    当有新的小版本更新时,只需使用以下命令通过 apt 进行升级:

    sudo apt-get update
    sudo apt-get upgrade

    参考:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux-debian?tabs=dotnet9

  • .NET 7 身份验证和授权的变化

    .NET 7 于今天(2022.11.9)发布了,在 ASP.NET Core 的身份验证和授权的配置上做了一些简化,变化如下:

    配置登录验证的方式,从 .NET 6 的:

    builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);

    变成了 .NET 7 的:

    builder.Services.AddAuthentication().AddCookie();

    ASP.NET Core 会自动对认证方案进行推断,从而省略了参数的配置。

    对于登录验证和授权的中间件,.NET 7 中不再需要手动引入,框架会自动推断是否使用,因此,app.UseAuthentication()app.UseAuthorization()也就不再需要了。

    从而,运行一个完整的 ASP.NET Core MVC 程序所需要的最简配置是这样的:

    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddControllersWithViews();
    builder.Services.AddAuthentication().AddCookie(); // new feature
    var app = builder.Build();
    app.UseStaticFiles();
    app.MapDefaultControllerRoute();
    app.Run();

    参考链接:https://auth0.com/blog/whats-new-in-dotnet-7-for-authentication-and-authorization/

  • Hello, Laravel

    经过一周的紧张开发,又一个面向银行的内部系统总算完成了。这个系统本来打算是用 .NET 来做,但这段时间一直心心念念 Laravel 框架,就像所有趁手好用的工具一样,只要用过一次,就忘不掉她的好。

    经过简单分析,发现这个系统其实并没有复杂的业务和计算,由于是内部系统,也不存在高并发的可能,所以,对于 Laravel 是适用的。本来 .NET 开发的系统已经完成了 70% ,花了一周不到的时间就用 Laravel 重写完成了,不得不感慨开发速度之快,同时开发体验拉满。

    这么多年来,虽说 PHP 也在断断续续的用,但从没怎么把它当回事,一般的项目主要还是使用 .NET 来做。对于自由开发者来说,.NET 可谓是相当的万金油,既可以做桌面开发,也可以做 Web 开发,关键时刻还可以拿来写一写安卓移动应用。由于是静态编译型语言,性能基本够用,配合 SQL Server 数据库,基本没有做不了的项目。

    但是,自从知道 Laravel 框架后,就在慢慢地在不断了解,越了解就越被她的优雅所打动,这里我也用了优雅这个词,因为实在没有想到更好的词能描述那种感觉。直到去年,尝试用她开发了一个小项目,由于当时对 Eloquent 了解还不够深入,甚至多对多、一对多这种关系的用法还不太清楚,就强行上了,结果也还行,顺顺利利的开发完成。

    这次的项目开发,在彻底弄清了 Eloquent 之后,就果断切换到 Laravel 来开发,真的是太好用了,再也不用定义 ASP.NET 里面的那一堆堆的实体类,再也不再需要 AutoMapper,再也不用那蹩脚的表单验证,再也不用等待编译生成,等等好处无法一一言说。总之就是开发轻量了,保存即生效,刷新即可看效果,整个过程轻松加愉快,身心愉悦!

    当然,Laravel 并不是完美的,并不适用于所有场景,比如高并发场景,计算密集、IO密集型应用,对于这些场景和应用,Laravel 不是不能做,而是不够好,性能不够高!当然,这不能怪 Laravel,这是 PHP 的问题,什么时候等 PHP 进化出高性能的运行模式,那 Laravel 就是完美的。

    最后,程序语言、程序框架始终是工具,只有根据需求和场景选择合适的工具才是真理。

    后记:该项目最终使用ASP.NET Core重新开发,重业务的项目还是要使用强类型语言,懂得都懂,不解释。

  • windows 安装自己开发的.NET Windows服务

    安装

    %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe  C:\Windows\service\tiegepushservice.exe

    卸载

    %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe    C:\Windows\service\tiegepushservice.exe   /u

  • ADO.NET和Dapper的ExecuteScalar说明

    ExecuteScalar函数只返回第一行第一列,不能返回一个对象。

  • 使用System.IO.File.Create(path);创建的文件如何关闭

    使用System.IO.File.Create(path);创建的文件如何关闭

    FileStream fs =  System.IO.File.Create(path);
    fs.Close();

  • ProcessStartInfo 一定要写全路径

    ProcessStartInfo 一定要写全路径,不然会出现一些莫明其妙的错误,比如开机自动启动时打不开。

    ProcessStartInfo p1 = new ProcessStartInfo($"{Application.StartupPath}\\PD101AHelper.exe", $"{address} \"{windowShowMsg.Trim()}\"  \"{zhShowMsg2 ?? ""}\"");
    
    p1.WindowStyle = ProcessWindowStyle.Hidden;
    Process.Start(p1);

  • web.config中配置数据库连接 

    asp.net的开发中,数据库连接信息一般都在是web.config中配置的,配置方法如下:

    <connectionStrings>
        <add name="conn" connectionString="Data Source=123.206.101.218;Initial Catalog=MyShop;Persist Security Info=True;User ID=sa;Password=123456" providerName="System.Data.SqlClient" />
    </connectionStrings>

    调用方法:

    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Web;
    namespace MyShop
    {
        class Db
        {
            public static SqlConnection GetConnection()
            {
                var connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
                var conn = new SqlConnection(connectionString);
                return conn;
            }
        }
    }
  • WinForm文本框上按回车切换到下一个输入

    WinForm文本框上按回车切换到下一个输入

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if ((ActiveControl is TextBox || ActiveControl is ComboBox) && keyData == Keys.Enter)
        {
            keyData = Keys.Tab;
        }
        return base.ProcessDialogKey(keyData);
    }