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

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

在日常开发中,我们经常会遇到需要将.NET应用程序注册为Windows服务的场景。本文将手把手教你如何通过InstallUtil工具完成服务的安装与卸载,并附赠避坑指南。(搓手期待脸)

一、准备工作

在开始操作前,请确认以下三点:

  1. 已安装对应版本的.NET Framework(示例使用v4.0.30319)
  2. 服务程序myservice.exe已生成且经过测试
  3. 建议将服务文件存放在非系统目录(如D:\MyServices\)

💡小贴士:右键点击解决方案生成时,记得选”Release”模式哦~

二、详细安装步骤

第一步:启动管理员命令行

按住Win + X键,在弹出菜单中选择【Windows Terminal(管理员)】,就像开启魔法权限一样~

第二步:执行安装咒语

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

当看到这两句魔法生效提示时,说明安装成功啦:

正在提交安装阶段...

安装已成功完成。

三、验证服务安装

方法1:可视化检查

按下Win + R输入services.msc,在服务列表里找找你的服务名称,就像在人群中找老朋友一样~

方法2:命令行确认

sc query myservice

看到STATE显示为STOPPED就说明服务已经在乖乖待命啦!


四、卸载服务指南

当需要更新服务时,先来段优雅的卸载舞蹈:

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

成功时会收到这样的友好通知:

正在开始卸载的安装阶段...
卸载已成功完成。

五、避坑宝典

  1. ​权限不足:看到”拒绝访问”提示?请检查是否以管理员身份运行CMD
  2. ​路径陷阱:若出现”找不到文件”,请检查路径中的空格是否用双引号包裹
  3. ​依赖缺失:安装失败时记得检查是否缺少.dll文件
  4. ​版本迷思:使用.NET Core开发的服务请改用sc create命令

六、知识扩展

对于使用新版本.NET的同学,可以试试这个现代咒语:

sc create "myservice" binPath="D:\Services\myservice.exe"

希望这篇指南能像贴心助手一样,帮你顺利完成服务部署。如果在实践中遇到任何魔法失灵的情况,欢迎在评论区召唤技术支持哦!(ง •̀_•́)ง

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;
        }
    }
}