爬虫自动化脚本+AI赋能

简介

估计大家对网页爬取和数据抓取已经有所了解,市面上也有许多现成的软件可供使用。例如,前几天群里有位朋友利用爬虫技术抓取了AV网站,并搭建了一个磁力链接站点😂。

本文将介绍如何模拟手动操作,将一些繁琐的固定操作转化为自动化流程。

声明

本文仅分享编写自动化脚本的心得,与其他内容及本人无关。

!!!

为了顺利发表文章,本文将展示如何登录博客园账号,并打印出所有评论。

亮点包括:

  • 如何绕过登录时的验证码?
  • 如何获取未经过 SSR 渲染且需要认证的评论列表?

这些奇淫技巧一应俱全,学习后受益匪浅,切记珍惜!

教程

1. 安装自动化脚本包

在项目文件中添加以下包引用:

xml 复制代码
<ItemGroup>
    <PackageReference Include="HtmlAgilityPack" Version="1.11.54" />
    <PackageReference Include="Selenium.WebDriver" Version="4.13.1" />
</ItemGroup>

2. 登录

使用以下 C# 代码进行登录操作:

csharp 复制代码
// 输入账号
IWebElement accountElement = webDriver.FindElement(By.CssSelector("#mat-input-0"));
accountElement.SendKeys(account);
var element_account = accountElement.GetAttribute("value");

// 输入密码
IWebElement passwordElement = webDriver.FindElement(By.CssSelector("#mat-input-1"));
passwordElement.SendKeys(password);
var element_password = passwordElement.GetAttribute("value");

// 核对账号密码是否正确输入
if (account != element_account || password != element_password)
{
    throw new Exception("页面账号密码输入有误!");
}

3. 点击验证按钮

csharp 复制代码
// 点击登录按钮
IWebElement loginBtnElement = webDriver.FindElement(By.CssSelector(@"body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button"));
loginBtnElement.Click(); // 第一次点击,弹出验证

// 点击验证按钮
IWebElement verifyBtnElement = webDriver.FindElement(By.CssSelector(@"#rectMask"));
// 注意:需要隐藏自动化特征,详见第27行代码
verifyBtnElement.Click();

4. 获取评论的三种方式

之所以提供三种方式,是因为部分网站对自己的接口进行了反自动化验证,但第三方接口通常可行!

4.1 通过页面元素爬取

csharp 复制代码
IWebElement tableElement = webDriver.FindElement(By.XPath(@"/html/body/cnb-root/cnb-app-layout/div[2]/as-split/as-split-area[2]/div/div/cnb-spinner/div/cnb-comment-main/cnb-spinner/div/div[2]/table"));
// 提取表格主体
IWebElement tbody = tableElement.FindElement(By.TagName("tbody"));
IList<IWebElement> rows = tbody.FindElements(By.TagName("tr"));

// 初始化列表存储表格数据
List<string> tableData = new List<string>();

foreach (var row in rows)
{
    IList<IWebElement> cells = row.FindElements(By.TagName("td"));

    // 处理表头单元格
    if (cells.Count == 0)
    {
        cells = row.FindElements(By.TagName("th"));
    }

    List<string> cellTexts = new List<string>();

    foreach (var cell in cells)
    {
        string cellText = cell.Text.Trim();
        cellTexts.Add(cellText);
    }

    // 使用管道符作为分隔符,避免与数据中的逗号冲突
    string rowData = string.Join(" | ", cellTexts);
    tableData.Add(rowData);
}

// 输出提取的数据
foreach (var row in tableData)
{
    Console.WriteLine(row);
}

4.2 直接请求接口获取

csharp 复制代码
// 导航到接口地址
webDriver.Navigate().GoToUrl(CnBlogs.CommentsGetApi);

var data = webDriver.PageSource;

Console.WriteLine(data);

4.3 伪造 HTML 元素,执行 Fetch 脚本获取内容

csharp 复制代码
webDriver.Navigate().GoToUrl(CnBlogs.CommentsUrl);
IJavaScriptExecutor executor = (IJavaScriptExecutor)webDriver;
executor.ExecuteScript(@"
    var container = document.createElement('div');
    container.id = 'hiddenDataDiv';
    container.style.display = 'none';
    document.body.appendChild(container);
    fetch('https://i.cnblogs.com/api/feedback/1?mine=false', {
        headers: {
            'accept': 'application/json, text/plain, */*',
            'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'priority': 'u=1, i',
            'sec-ch-ua': '\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"',
            'sec-ch-ua-mobile': '?0',
            'sec-ch-ua-platform': '\"Windows\"',
            'sec-fetch-dest': 'empty',
            'sec-fetch-mode': 'cors',
            'sec-fetch-site': 'same-origin'
        },
        referrer: 'https://i.cnblogs.com/comments',
        referrerPolicy: 'strict-origin-when-cross-origin',
        method: 'GET',
        mode: 'cors',
        credentials: 'include'
    })
    .then(response => response.json())
    .then(data => {
        document.getElementById('hiddenDataDiv').textContent = JSON.stringify(data);
    })
    .catch(error => console.error('Error:', error));
");
string jsonData = executor.ExecuteScript("return document.getElementById('hiddenDataDiv').textContent;").ToString();
Console.WriteLine(jsonData);

小彩蛋

博客园的登录 Bug

登录Bug视频, 下载观看, 浏览器不支持

AI赋能

复杂的验证码场景可以通过 AI 多模态模型解决,例如定位元素和移动鼠标等操作。此外,AI 还可以用于整理和分析数据,提高数据处理效率。

源码链接(可直接运行)

本项目基于 .NET 5 和 Edge 浏览器开发,源码已上传至 GitHub:

https://github.com/ZhangQueque/CrawlerScript


希望这篇优化后的博客对你有所帮助!如果有任何问题或需要进一步优化,欢迎随时联系。