Selenium 4 中加入了对新版 Chromium Edge 的支持,但其仍处于 alpha 阶段,没有正式发布

如果使用最新稳定版的 Selenium 操作 Chromium Edge,则需要一些其他的操作

环境

  • Windows 1909
    • macOS 和 Linux 的使用方式相同
  • dotnet core 3.1
    • 其他语言可能有其他方法
  • Microsoft Edge (Chromium)
  • Edge Webdriver

参考

步骤

  1. 环境准备
    • 根据已安装的 Edge 版本下载对应的 Webdriver
    • 将 Webdriver(名称为 msedgedriver.exe)移动到与 msedge.exe 同级目录下(默认安装路径为 C:\Program Files (x86)\Microsoft\Edge\Application
    • 将 Webdriver 的路径加入环境变量
  2. 实例
    • 在项目中引入 Selenium.WebDriverMicrosoft.Edge.SeleniumTools
    • 使用 dotnet core 打开一个页面
      using Microsoft.Edge.SeleniumTools;
      //...
      var options = new EdgeOptions();
      options.UseChromium = true;
      // options.BinaryLocation = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe";
      options.AddArgument("disable-gpu");
      options.AddArgument("--no-sandbox");
      options.AddArgument("--disable-dev-shm-usage");
      options.AddUserProfilePreference("profile.managed_default_content_settings.images", 2);
      
      string source = string.Empty;
      using (var edge = new EdgeDriver(options)) {
          edge.Navigate().GoToUrl(url);
          Thread.Sleep(5000);
          source = edge.PageSource;
          edge.Quit();
      }
      
      Console.WriteLine(source);
      //...

      注意不要引用 Selenium.WebDriver 官方的 OpenQA.Selenium.Edge,会与 Microsoft.Edge.SeleniumTools 包冲突

      前者的 EdgeOptions 内没有定义 UseChromium,无法正常使用新版 Edge

Continue reading “Dotnet Core Selenium 3 自动化 Chromium Edge”

昨天用 dotnet core 把在 python 下实现的爬虫重写了一遍,体验很好( Linq + HtmlAgilityPack + ScrapySharp ),做一些零碎的记录

轮子的选择

以下涉及到的库均可以使用 Nuget 安装

HTML 爬取库

如果遇到没有 DDOS 防护的静态页面,在 python 下用 urllib 库发送请求即可获取网页代码

// ...
req = request.Request(url, headers=HEAD)
response = request.urlopen(req)
html = response.read().decode('utf-8')
// ...

在 dotnet 下同样可以使用自带的 WebClient、WebRequest 实现,但既然使用了 ScrapySharp 这个解析库(原因见下文),这里也可以使用 ScrapySharp 自带的 Web Client 实现

using ScrapySharp.Network;
// ...
var browser = new ScrapingBrowser();
WebPage page = browser.NavigateToPage(new Uri("your url here"));
var html = page.Content;
// ...

除此之外,python 下万能的浏览器自动化工具 selenium 也同样支持 dotnet core,区别在于一些 Options 的添加

在 python 下(使用 Chrome)

chrome_options = Options()
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
prefs = {'profile.managed_default_content_settings.images': 2} # 不加载图片
chrome_options.add_experimental_option('prefs', prefs)
browser = webdriver.Chrome(options=chrome_options)

在 dotnet core 下,同样的打开方式变成了

var chromeOptions = new ChromeOptions();
chromeOptions.AddArgument("--no-sandbox");
chromeOptions.AddArgument("--disable-dev-shm-usage");
chromeOptions.AddUserProfilePreference("profile.managed_default_content_settings.images", 2); //这里
var mychrome = new ChromeDriver(chromeOptions);

HTML 解析库

对于 python 下常用的 html 解析库 BeautifulSoup4,在 dotnet core 下我选择了 HtmlAgilityPack

在 python 下,我通常使用以下方法将获取到的 html 源代码解析为 lxml (或其他)格式

# ...
soup = BeautifulSoup(html, 'lxml')
# ...

现在在 dotnet core 下,变成了

using HtmlAgilityPack;

// ...
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html);
///
htmlDoc.Load("/your/path/here/pageSource.html");
从文件中加载
///
// ...

HAP 默认使用 XPath 语法(在 XML 文档中查找信息的语言),且暂不支持 CSS 选择器

例如在 python 中,我通常以下面的手法筛选信息

# ...
result = soup.select("div.xxxclass")
# ...

因为懒得学习 XPath想尽快尝试 dotnet core 的爬虫,ScrapySharp 出现了,此框架是对 HtmlAgilityPack 的一次扩展,添加了其缺少的 CSS 选择器,并且自带一个 Web Client 用来获取网页代码

安装之后就可以使用 CssSelect 方法筛选网页代码

using ScrapySharp.Extensions;
// ...
var result = htmlDoc.DocumentNode.CssSelect("table tr.app");
// ...

稍微熟悉 XPath 语法后,也可以很方便提取信息,如下(单个节点中的信息):

using HtmlAgilityPack;
// ...
string subID = tds[1].SelectSingleNode(".//a[@href]").Attributes["href"].Value.Split('/')[2];
string name = tds[1].SelectSingleNode(".//b").InnerText;
string URL = tds[0].SelectSingleNode(".//a[@href]").Attributes["href"].Value.Split('?')[0];
// ...

Continue reading “从 Python 向 Dotnet Core 的爬虫迁移记录”

关键在环境变量的设定

环境

  • DS3617xs
    • DSM 6.1.7-15284 Update 3
  • Docker

步骤

  1. 下载 qibittorrent 映像
    • 打开 docker,在【注册表】中搜索 qbittorrent,选择 linuxserver/qbittorrent 下载
  2. 建立 qbittorrent 容器
    • 端口映射,如图其中前两个端口用于 bt 通信,最好设置为高位端口
      第三个端口为 Web UI 端口,可自行设置
    • 路径映射,如图/downloads 为 qbittorrent 的默认下载路径,/config 为 qbittorrent 的配置文件路径
    • 添加环境变量,如图注意:WEBUI_PORT 要与端口映射中设置的 Web UI 相同,否则无法访问 Web 控制台
      如果使用群晖默认的 admin 用户,则 PUID 为 图中的 1024,如果使用了其他账户,可以 ssh 连接到群晖,执行指令

      id

      来查看本用户的 PUID
      注意:PUID 设置不正确会导致 qbittorrent 没有正常的写入权限,最终导致无法正常下载

  3. 启动容器

Continue reading “黑群晖安装 qbittorrent”