文章来源
功能:从其他网站爬下Table资料,将资料转成二维码
步骤:
- 新建NetCore Web应用程序(带模型 视图 控制器)
二维码组件:
Install-Package QRCoder
- 修改Home/Index方法(爬数据,加工数据)
public async Task<IActionResult> Index()
{
//正则获取Table
string regExp = @"<table.*?>[\s\S]*?<\/table>";
Match match;
XmlDocument xmlDocument = new XmlDocument();
//1,发起请求获取资源
var request = new HttpRequestMessage(HttpMethod.Get,"https://www.youneed.win/free-ss");
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
//资源td列顺序对照:IP 端口 密码 加密方式 资源更新时间 资源节点==>SS://base64(加密方式:密码@IP:端口
var result = await response.Content.ReadAsStringAsync();
match = Regex.Match(result, regExp);
//2,匹配成功,开始获取资源
if (match.Success)
{
//对table标签做XML加载,以XML方式去节点信息
xmlDocument.LoadXml($@"<xml>{match.Value}</xml>");
XmlNodeList thNodeList = xmlDocument.SelectNodes("//table/thead/tr/th");
//2.1 获取标题
sSTableObj.TbHeader = new List<string>();
sSTableObj.SSObj = new List<SSObj>();
foreach (XmlNode xmlNode in thNodeList)
{
sSTableObj.TbHeader.Add(xmlNode.InnerText);
}
//2.2 获取资源
XmlNodeList trNodeList = xmlDocument.SelectNodes("//table/tbody/tr");
foreach (XmlNode node in trNodeList)
{
//tdNodeList = node.SelectNodes("td");
sSObjs.Add(new SSObj()
{
Region = node.SelectSingleNode("td[6]").InnerText,
UpdateTime = node.SelectSingleNode("td[5]").InnerText,
EnType = node.SelectSingleNode("td[4]").InnerText,
Password = node.SelectSingleNode("td[3]").InnerText,
IP = node.SelectSingleNode("td[1]").InnerText,
Port = node.SelectSingleNode("td[2]").InnerText
});
}
sSObjs = sSObjs.OrderBy(x => x.Region).ToList();
//2.3 资源转为ss url地址
sSObjs.ForEach((e) =>
{
string ssurl = @"ss://" + Convert.ToBase64String(Encoding.Default.GetBytes($"{e.EnType}:{e.Password}@{e.IP}:{e.Port}"));
//ssUrls.Add(ssurl);
QRCodeData qrCodeData = qrGenerator.CreateQrCode(ssurl,QRCodeGenerator.ECCLevel.Q);
QRCode qrCode = new QRCode(qrCodeData);
Bitmap qrCodeImage = qrCode.GetGraphic(20);
e.QrCode = BitmapToBytes(qrCodeImage);
e.SsUrl = ssurl;
});
}
//3,只提取日本与台湾地区的资源
return View(new SSTableObj() { TbHeader = sSTableObj.TbHeader, SSObj = sSObjs.Where(x => x.Region == "TW" || x.Region == "JP").OrderByDescending(x=>x.Region).ToList() });
}
else
{
return View();
}
}
- Index页面
@{
ViewData["Title"] = "Home Page";
}
@model SSTableObj
<style>
table tr td img {
width: 100px;
}
</style>
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<table class="table table-striped ">
<thead class="thead-dark">
<tr>
@foreach (string item in Model.TbHeader)
{
<th>@item</th>
}
<th>二维码</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.SSObj)
{
<tr>
<td class="align-middle">@item.IP</td>
<td class="align-middle">@item.Port</td>
<td class="align-middle">@item.Password</td>
<td class="align-middle">@item.EnType</td>
<td class="align-middle">@item.UpdateTime</td>
<td class="align-middle">@item.Region</td>
<td class="align-middle"><img src="@String.Format("data:image/png;base64,{0}", Convert.ToBase64String(@item.QrCode))" /></td>
@*<td>@item.SsUrl</td>*@
</tr>
}
</tbody>
</table>
</div>
- 效果
- 完整代码下载