基于搜狗搜索的微信公众号爬虫实现(C#版本)

article/2025/10/6 16:33:18

为什么80%的码农都做不了架构师?>>>   hot3.png

Author: Hoyho Luo

Email: luohaihao@gmail.com

Source Url:http://here2say.me/11/

转载请保留此出处

 

   本文介绍基于搜狗的微信公众号定向爬虫,使用C#实现,故取名WeGouSharp。本文中的项目托管在Github上,你可以戳WeGouSharp获取源码,欢迎点星。关于微信公共号爬虫的项目网上已经不少,然而基本大多数的都是使用Python实现 鉴于鄙人是名.NET开发人员,于是又为广大微软系同胞创建了这个轮子,使用C#实现的微信爬虫 蓝本为Chyroc/WechatSogou, 在此还请各位大佬指教。

 

目录

1.项目结构

2.数据结构

3.xpath介绍

4.使用HtmlAgilityPack解析网页内容

5.验证码处理以及文件缓存

 

一、 项目结构

如下图

API类:

所有直接的操作封装好在API类中,直接使用里面的方法

Basic类:

主要处理逻辑

 

FileCache:

主要出现验证码的时候需要使用Ccokie验证身份,此类可以加密后序列化保存UIN,BIZ,COOKIE等内容以供后续使用

 

HttpHelper类:

网络请求,包括图片

 

Tools类:

图片处理,cookie加载等

 

依赖包可以直接使用package文件夹的版本

也可以自行在NuGet添加 如(visual studio-->tools-->Nuget Package Manager-->Package Manager Console):

Install-Package HtmlAgilityPack

 

 

二、 数据结构

本项目根据微信公账号以及搜狗搜索定义了多个结构,可以查看模型类,主要包括以下:

公众号结构:

public struct OfficialAccount{public string AccountPageurl;public string WeChatId;public string Name;public string Introduction;public bool IsAuth; public string QrCode;public string ProfilePicture;//public string RecentArticleUrl;} 

字段含义

字段含义
AccountPageurl微信公众号页
WeChatId公号ID(唯一)
Name名称
Introduction介绍
IsAuth是否官方认证
QrCode二维码链接
ProfilePicture头像链接

 

 

公号群发消息结构(含图文推送)

public struct BatchMessage{public int Meaasgeid;public string  SendDate;public string Type; //49:图文,1:文字,3:图片,34:音频,62:视频public string Content; public string ImageUrl; public string PlayLength;public int FileId;public string AudioSrc;//for type 图文public string ContentUrl;public int Main;public string Title;public string Digest;public string SourceUrl;public string Cover;public string Author;public string CopyrightStat;//for type 视频public string CdnVideoId;public string Thumb;public string VideoSrc;//others}

字段含义

字段含义
Meaasgeid消息号
SendDate发出时间(unix时间戳)
Type消息类型:49:图文, 1:文字, 3:图片, 34:音频, 62:视频
Content文本内容(针对类型1即文字)
ImageUrl图片(针对类型3,即图片)
PlayLength播放长度(针对类型34,即音频,下同)
FileId音频文件id
AudioSrc音频源
ContentUrl文章来源(针对类型49,即图文,下同)
Main不明确
Title文章标题
Digest不明确
SourceUrl可能是阅读原文
Cover封面图
Author作者
CopyrightStat可能是否原创?
CdnVideoId视频id(针对类型62,即视频,下同)
Thumb视频缩略图
VideoSrc视频链接

 

 

文章结构

  public struct Article{public string Url;public List<string>Imgs;public string Title;public string Brief;public string Time;public string ArticleListUrl;public OfficialAccount officialAccount;}
字段含义
字段含义
Url文章链接
Imgs封面图(可能多个)
Title文章标题
Brief简介
Time发表日期(unix时间戳)
OfficialAccount关联的公众号(信息不全,仅供参考)

 

 

搜索榜结构

 public struct HotWord{public int Rank;//排行public string Word;public string JumpLink; //相关链接public int HotDegree; //热度}

 

 

 

三 、xpath介绍

 什么是 XPath?

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

简而言之,Xpath是XML元素的位置,下面是W3C教程时间,老鸟直接跳过

XML 实例文档

我们将在下面的例子中使用这个 XML 文档。

<?xml version="1.0" encoding="ISO-8859-1"?><bookstore><book><title lang="eng">Harry Potter</title><price>29.99</price>
</book><book><title lang="eng">Learning XML</title><price>39.95</price>
</book></bookstore>

 

选取节点

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点。
..选取当前节点的父节点。
@选取属性。

实例

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。

来源: http://www.w3school.com.cn/xpath/xpath_syntax.asp

 

 

如图,假设我要抓取首页一个banner图,可以在chrome按下F12参考该元素的Xpath,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

即该图片对应的Xpth为: //*[@id="loginWrap"]/div[4]/div[1]/div[1]/div/a[4]/img

解读:该图片位于ID= loginWrap下面的第4个div下的...的img标签内

 

为什么这里介绍Xpath,是因为我们网页分析是使用HtmlAgilityPack来解析,他可以把根据Xpath解析我们所需的元素。

比如我们调试确定一个文章页面的特定位置为标题,图片,作者,内容,链接的Xpath即可完全批量化且准确地解析以上信息

 

 

四、 使用HtmlAgilityPack解析网页内容

  Httptool类里封装了一个较多参数的HTTP GET操作,用于获取搜狗的页面:

因为搜狗本身是做搜索引擎的缘故,所以反爬虫是非常严厉的,因此HTTP GET的方法要注意携带很多参数,且不同页面要求不一样.一般地,要带上默认的referer和host 然后请求头的UserAgent 要伪造,常用的useragent有

public static List<string> _agent = new List<string>
{
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
"Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
"Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
};
 

自定义的GET 方法

  /// <summary>/// 指定header参数的HTTP Get方法/// </summary>/// <param name="headers"></param>/// <param name="url"></param>/// <returns>respondse</returns>public string Get(WebHeaderCollection headers, string url ,string responseEncoding="UTF-8",bool isUseCookie = false){string responseText = "";try{var request = (HttpWebRequest)WebRequest.Create(url);request.Method = "GET";foreach (string key in headers.Keys){switch (key.ToLower()){case "user-agent":request.UserAgent = headers[key];break;case "referer":request.Referer = headers[key];break;case "host":request.Host = headers[key];break;case "contenttype":request.ContentType = headers[key];break;case "accept":request.Accept = headers[key];break;default:break;}}if (string.IsNullOrEmpty(request.Referer)){request.Referer = "http://weixin.sogou.com/";};if (string.IsNullOrEmpty(request.Host)){request.Host = "weixin.sogou.com";};if (string.IsNullOrEmpty(request.UserAgent)){Random r = new Random();int index = r.Next(WechatSogouBasic._agent.Count - 1);request.UserAgent = WechatSogouBasic._agent[index];}if (isUseCookie){CookieCollection cc = Tools.LoadCookieFromCache();request.CookieContainer = new CookieContainer();request.CookieContainer.Add(cc);}HttpWebResponse response = (HttpWebResponse)request.GetResponse();if (isUseCookie && response.Cookies.Count >0){var cookieCollection = response.Cookies;WechatCache cache = new WechatCache(Config.CacheDir, 3000);if (!cache.Add("cookieCollection", cookieCollection, 3000)) { cache.Update("cookieCollection", cookieCollection, 3000); };}// Get the stream containing content returned by the server.Stream dataStream = response.GetResponseStream();//如果response是图片,则返回以base64方式返回图片内容,否则返回html内容if (response.Headers.Get("Content-Type") == "image/jpeg" || response.Headers.Get("Content-Type") == "image/jpg"){Image img = Image.FromStream(dataStream, true);using (MemoryStream ms = new MemoryStream()){// Convert Image to byte[]//img.Save("myfile.jpg");img.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);byte[] imageBytes = ms.ToArray();// Convert byte[] to Base64 Stringstring base64String = Convert.ToBase64String(imageBytes);responseText = base64String;}}else //read response string{// Open the stream using a StreamReader for easy access.Encoding encoding;switch (responseEncoding.ToLower()){case "utf-8":encoding = Encoding.UTF8;break;case "unicode":encoding = Encoding.Unicode;break;case "ascii":encoding = Encoding.ASCII;break;default:encoding = Encoding.Default;break;}StreamReader reader = new StreamReader(dataStream, encoding);//System.Text.Encoding.Default// Read the content.if (response.StatusCode == HttpStatusCode.OK){responseText = reader.ReadToEnd();if (responseText.Contains("用户您好,您的访问过于频繁,为确认本次访问为正常用户行为,需要您协助验证")){_vcode_url = url;throw new Exception("weixin.sogou.com verification code");}}else{logger.Error("requests status_code error" + response.StatusCode);throw new Exception("requests status_code error");}reader.Close();}dataStream.Close();response.Close();}catch (Exception e){logger.Error(e);}return responseText;}

 

前面关于Xpath废话太多,直接上一个实例,解析公众号页面:

 public List<OfficialAccount> SearchOfficialAccount(string keyword, int page = 1){List<OfficialAccount> accountList = new List<OfficialAccount>();string text = this._SearchAccount_Html(keyword, page);//返回了一个搜索页面的html代码HtmlDocument pageDoc = new HtmlDocument();pageDoc.LoadHtml(text);HtmlNodeCollection targetArea = pageDoc.DocumentNode.SelectNodes("//ul[@class='news-list2']/li");if (targetArea != null){foreach (HtmlNode node in targetArea){try{OfficialAccount accountInfo = new OfficialAccount();//链接中包含了&amp; html编码符,要用htmdecode,不是urldecodeaccountInfo.AccountPageurl = WebUtility.HtmlDecode(node.SelectSingleNode("div/div[@class='img-box']/a").GetAttributeValue("href", ""));//accountInfo.ProfilePicture = node.SelectSingleNode("div/div[1]/a/img").InnerHtml;accountInfo.ProfilePicture = WebUtility.HtmlDecode(node.SelectSingleNode("div/div[@class='img-box']/a/img").GetAttributeValue("src", ""));accountInfo.Name = node.SelectSingleNode("div/div[2]/p[1]").InnerText.Trim().Replace("<!--red_beg-->", "").Replace("<!--red_end-->", "");accountInfo.WeChatId = node.SelectSingleNode("div/div[2]/p[2]/label").InnerText.Trim();accountInfo.QrCode = WebUtility.HtmlDecode(node.SelectSingleNode("div/div[3]/span/img").GetAttributeValue("src", ""));accountInfo.Introduction = node.SelectSingleNode("dl[1]/dd").InnerText.Trim().Replace("<!--red_beg-->","").Replace("<!--red_end-->", "");//早期的账号认证和后期的认证显示不一样?,对比 bitsea 和 NUAA_1952 两个账号//现在改为包含该script的即认证了if (node.InnerText.Contains("document.write(authname('2'))")){accountInfo.IsAuth = true;}else{accountInfo.IsAuth = false;}accountList.Add(accountInfo);}catch (Exception e){logger.Warn(e);}}}return accountList; }

以上,说白了,解析就是Xpath调试,关键是看目标内容是是元素标签内容,还是标签属性,

如果是标签内容即形式为 <h>我是内容</h>

则: node.SelectSingleNode("div/div[2]/p[2]/label").InnerText.Trim();

 

如果要提取的目标内容是标签属性,如 <a href="/im_target_url.htm" >点击链接</a>

则node.SelectSingleNode("div/div[@class='img-box']/a").GetAttributeValue("href", "")

 

其他同理

 

 

 

五 、验证码处理以及文件缓存

 

  公众号的主页(示例广州大学公众号https://mp.weixin.qq.com/profile?src=3×tamp=1505923231&ver=1&signature=gWXdb*Jzt1oByDAzW5aTzEWnXo6mkUwg3Ynjm3CYvKV0kdCLxALBR7JJ-EheLBI-v6UcocJqGmPbUY2KMXuSsg==)因为页面是属于微信的,发爬虫非常严格,因此多次刷新容易产生要输入验证码的页面

多次刷新此页面会出现验证码

 

 

此时要向一个网址post验证码才可以解封

 

解封操作如下

/// <summary>/// 页面出现验证码,输入才能继续,此验证依赖cookie, 获取验证码的requset有个cookie,每次不同,需要在post验证码的时候带上/// </summary>/// <returns></returns>public bool VerifyCodeForContinute(string url ,bool isUseOCR){bool isSuccess = false;logger.Debug("vcode appear, use VerifyCodeForContinute()");DateTime Epoch = new DateTime(1970, 1, 1,0,0,0,0);var timeStamp17 = (DateTime.UtcNow - Epoch).TotalMilliseconds.ToString("R"); //get timestamp with 17 bitstring codeurl = "https://mp.weixin.qq.com/mp/verifycode?cert=" + timeStamp17;WebHeaderCollection headers = new WebHeaderCollection();var content = this.Get(headers, codeurl,"UTF-8",true);ShowImageHandle showImageHandle = new ShowImageHandle(DisplayImageFromBase64);showImageHandle.BeginInvoke(content, null, null);Console.WriteLine("请输入验证码:");string verifyCode = Console.ReadLine();string postURL = "https://mp.weixin.qq.com/mp/verifycode";timeStamp17 = (DateTime.UtcNow - Epoch).TotalMilliseconds.ToString("R"); //get timestamp with 17 bitstring postData = string.Format("cert={0}&input={1}",timeStamp17,verifyCode );// "{" + string.Format(@"'cert':'{0}','input':'{1}'", timeStamp17, verifyCode) + "}";headers.Add("Host", "mp.weixin.qq.com");headers.Add("Referer", url);string remsg = this.Post(postURL, headers, postData,true);try{JObject jo = JObject.Parse(remsg);//把json字符串转化为json对象  int statusCode = (int)jo.GetValue("ret");if (statusCode == 0){isSuccess = true;}else{logger.Error("cannot unblock because " + jo.GetValue("msg"));var vcodeException = new WechatSogouVcodeException();vcodeException.MoreInfo = "cannot jiefeng because " + jo.GetValue("msg");throw vcodeException;}}catch(Exception e){logger.Error(e);}return isSuccess;}

 

解释下:

先访问一个验证码产生页面,带17位时间戳

var timeStamp17 = (DateTime.UtcNow - Epoch).TotalMilliseconds.ToString("R"); //get timestamp with 17 bit

string codeurl = "https://mp.weixin.qq.com/mp/verifycode?cert=" + timeStamp17;

 

再向这个url query post你的验证码:

https://mp.weixin.qq.com/mp/verifycode

?cert=YourTimeStamp17bit&input= YourverifyCode

 

 

此处一个大坑,由于HttpWebRequest 默认是不带cookie也不产生的,而这样的严重是依赖cookie ,产生验证码的页面会生成一个cookie,每次不同,post验证码的时候要带上这cookie,

因此这里记得要启用HttpWebRequest cookie

如果启用了cookie,会通过FileCache类将cookie保存在缓存文件,下次请求如果开启cookie container的话就会带上此cookie

CookieCollection cc = Tools.LoadCookieFromCache();
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(cc);

 

 

 

六、后话

   

    上面只是一部分,刚开始写的时候也没想到会有这么多坑,但是没办法,坑再多只能自己慢慢填了,比如OCR,第三方打码接入,多线程等等后期再实现。一个人的精力毕竟有限,相对满大街的Python爬虫,C#的爬虫性质的项目本来就不多,尽管代码写得非常粗糙,但是我选择了开放源码希望更多人参与,欢迎各位看官收藏,可以的话给个星或者提交代码

项目地址

 

 

转载于:https://my.oschina.net/hoyho/blog/1546632


http://chatgpt.dhexx.cn/article/PK1Mc9q8.shtml

相关文章

fiddle python抓取微信公众号文章

分析 1&#xff0c;先进行准备工作&#xff1a;使用fiddle抓包&#xff08;大家可以自行百度怎么使用哦&#xff09; 2&#xff0c;打开电脑端微信&#xff0c;找到需要爬取的公众号 点击进入公众号&#xff0c;再打开fiddle&#xff0c;微信停留在这一步 打开fiddle后再点击…

Java Selenium 爬取微信公众号文章图片.md

项目地址结尾 一、前期准备 1. 下载selenium的驱动 Chrome http://chromedriver.storage.googleapis.com/index.html Firefox https://github.com/mozilla/geckodriver/releases/ IE http://selenium-release.storage.googleapis.com/index.html 下载好驱动然后放到、对…

python爬虫(17)爬出新高度_抓取微信公众号文章(selenium+phantomjs)

个人博客请访问 http://www.x0100.top 一.思路分析 目前所知晓的能够抓取的方法有&#xff1a; 1、微信APP中微信公众号文章链接的直接抓取&#xff08;http://mp.weixin.qq.com/s?__bizMjM5MzU4ODk2MA&mid2735446906&idx1&snece37deaba0c8ebb9badf07e5a5a3bd…

获取微信公众号文章内视频真实地址

PHP获取微信公众号文章内视频与音频真实地址 微信公众号的文章的爬取可以看到这个项目&#xff1a;github 基于QueryList的微信公众号文章获取工具 有任何问题可以留言。 返回数据&#xff1a; 包含音频和视频包含多个视频 原有找到的文章 如何抓取微信公众号文章里面的视频…

Python爬取微信公众号文章、点赞数

代码还是热乎的&#xff0c;只要你细心一步步的慢慢调试&#xff0c;绝壁没问题 前期准备 订阅号&#xff1b;Python&#xff1b;Fiddler&#xff1b;微信账号&#xff1b; 流程 使用用微信公众号生成cookie使用Fiddler抓取微信公众号数据&#xff0c; 获取阅读数通过cooki…

如何爬取微信公众号文章(二)

在如何爬取微信公众号&#xff08;一&#xff09;中完成了将爬取公众号文章的元数据存入数据库&#xff0c;其中包括文章的连接、标题、发布时间、摘要和封面图片等信息。下面介绍如何根据文章链接来爬取文章内容。 开发环境 windows 7 x64python3.7 (Anaconda)vscode 编辑器…

如何爬取微信公众号文章(一)

微信公众号是目前最为流行的自媒体之一&#xff0c;上面有大量的内容&#xff0c;如何将自己感兴趣的公众号内容爬取下来&#xff0c;离线浏览&#xff0c;或者作进一步的分析呢&#xff1f; 下面我们讨论一下微信公众号文章的爬取。 环境搭建 windows 7 x64python3.7 (Anac…

Python 爬虫之微信公众号

Python 爬虫之微信公众号 源代码放在文末。 本次爬虫需要的工具如下: selenium 驱动器对应浏览器的 webdriver一个微信订阅号在 2017 年 6 月左右,微信官方发布一篇文章 https://mp.weixin.qq.com/s/67sk-uKz9Ct4niT-f4u1KA,大致意思就是以后发布文章的时候可以插入其他公…

公网访问局域网家用nas

提到外网访问不得不说说家里局域网的搭建结构了&#xff0c;就拿大众最常用的方式举例&#xff0c;网络运营商的光纤入户&#xff0c;通过运营商提供的光猫直接pppoe进行拨号&#xff0c;再连接自己的路由器&#xff0c;分配至各网口。 自从上次充当灵魂画手被嘲笑了以后就改用…

外网访问群晖NAS VMM搭建Openwrt的admin界面

偶然在网上看到很多的帖子使用群晖搭建openwrt搭建旁路由,心血来潮体验了一把,记录一下自己的搭建的整个过程,并最终实现外网访问Openwrt的admin界面。 本人使用的群晖nas DS220+,其他品牌未尝试。 一、前期配置 1、先在套件中心下载VMM(Virtaul Machine Manager) 2、下…

2022年10月 cpolar软件实现内网穿透连接群晖NAS

前言 1.cpolar简介 cpolar是一款拥有远程控制和内网穿透功能的软件。而且还可以监控端口的HTTP请求&#xff0c;利用实时的cpolar Web UI开发者工具&#xff0c;让您调试代码更容易。您可以监听所有隧道上的HTTP消息包&#xff0c;分析消息包的结构内容&#xff0c;找出问题点…

群晖内网穿透 实现外网快速访问 无需公网

有群晖的情况下&#xff0c;在内网我们可以通过ip正常访问我们的群晖/NAS;但是我们想要在外网访问的时候该怎么办&#xff0c;没有公网ip&#xff0c;扯专线太贵&#xff0c;自己搭建太麻烦。这无疑是个难题&#xff1b; 今天&#xff0c;小编找到了一款免费的内网穿透工具来实…

通过公网+域名访问家里的群晖服务器

公网域名访问群晖服务器 前言准备的东西如何判断你家里的宽带是公网IP通过公网IP网访群晖&#xff0c;端口映射申请域名和DDNS添加DDNS映射写在最后 前言 最近换了个工作&#xff0c;然后有代码的托管需求。想想用GitHub太卡了&#xff0c;国内的开源托管网站因为一些国人的素…

猫盘群晖外部网络访问的三种方法:公网IP、内网穿透、qc的实际评测

目录 具体过程概述内网穿透公网IPQuickconnect(QC&#xff09;结语 具体过程 概述 最近想入手一个NAS&#xff0c;由于我是新手入门&#xff0c;就选择入手了便宜的猫盘。我的猫盘是白群晖系统所以支持QC的功能&#xff0c;因此对目前猫盘群晖的DiskStation Manager&#xff…

特征值和特征矩阵

写一点对矩阵特征值和特征矩阵的理解 1. A是一个矩阵&#xff0c;它作用在向量v上。如果A是2阶对角阵的话&#xff0c;它起到的作用是将向量v在横纵方向拉伸 2. 当A是一个普通2阶矩阵时&#xff0c;它对v的拉伸不再是横纵方向&#xff0c;而是任意方向的&#xff0c;这取决于实…

三阶矩阵求特征值的快速算法

一般的三阶矩阵求特征值其实是解析不了的&#xff0c;因为特征方程对应的是三次方程&#xff0c;对于一般的三次方程&#xff0c;是很难求解的。要想方程有三个整数根&#xff0c;并且能够不用完全暴力展开三阶行列式这样的矩阵实际是很特殊的。 1.某一行有两个0的情况是最好算…

用R求矩阵的特征值和特征向量

最近在学习多元统计分析的主成分分析时&#xff0c;发现需要经常计算矩阵的特征值和特征向量&#xff0c;自己就找了下用R来做计算的函数。 我们可以用sigen()函数来计算特征对。 #创建一个矩阵 a <- matrix(c(11,sqrt(3)/2,3/2,sqrt(3)/2,21/4,5*sqrt(3)/4,3/2,5*sqrt(3)/…

怎么算特征值和特征矩阵?

怎样更通俗的理解特征值和特征矩阵&#xff1f; 设A是一个n阶矩阵&#xff0c;若数和n维非零列向量满足&#xff0c;数称为A的特征值&#xff0c;x称为A对应于特征值的特征向量。此时叫做特征多项式&#xff0c;若特征多项式为0则称为A的特征方程&#xff08;齐次线性方程组&a…

矩阵特征值和特征向量的求取

最近项目中有一个模块需要求矩阵的最大特征值和特征值对应的特征向量&#xff0c;无奈&#xff0c;又重新将以前学习的这方面的知识重新温习了一遍&#xff0c;感觉还是当时学的不够深&#xff0c;所以谢谢感悟&#xff0c;顺便对知识点进行一个总结。 首先特征值和特征向量的…

matlab如何求矩阵特征值

根据线性代数理论&#xff0c;特征值与特征向量只存在于方阵。如下所示为一方阵A&#xff1a; 在matlab输入矩阵&#xff1a; A [1 2 4; 4 0 7 9 1 3]; 查阅matlab help可以知道&#xff0c;利用eig函数可以快速求解矩阵的特征值与特征向量。 格式&#xff1a;[V,D] eig(A) 说…