技巧:如何高效、准确、自动识别网页编码
优采云 发布时间: 2020-09-07 00:25如何高效,准确和自动识别网页编码
发件人:
Tiandilian 站群可以根据用户输入的初始关键词来获取关键词搜索引擎的搜索结果,然后依次获取相关的文章内容。这样,您需要面对无数网页的各种编码。为了解决此问题,引入了以下解决方案:
在引入自动编码识别之前,我们有两种获取网页编码信息的方法:
它的一、是通过服务器返回的标头中的charset变量获得的
二、是通过页面上的元信息获得的。
在通常情况下,如果服务器或页面提供了这两个参数,并且参数正确,那么在爬网该网页时就不会出现编码问题。
但是对于我们程序员来说,现实总是很困难。搜寻网页时,通常会发生以下情况:
1.这两个参数缺失
2.尽管提供了两个参数,但它们不一致
3.提供了这两个参数,但它们与网页的实际编码不一致
为了尽可能自动地获取所有网页的编码,引入了自动编码识别
我记得在php中有一个mb_detect函数,它似乎可以识别字符串编码,但是它的准确性很难说,因为编码的自动识别是一个概率事件,仅当识别出的字符串的长度时足够大(例如,超过300个单词),它可能会更可靠。
所有浏览器都支持自动识别网页编码,例如IE,firefox等。
我使用mozzila提供的Universalchardet模块,据说它比IE随附的识别模块准确得多
universalchardet项目的地址为:
目前,universalchardet支持python java dotnet等,php不知道它是否支持
我更喜欢编写C#,因为VS2010 + viemu是我的最爱,所以我使用C#版本。通用字符有很多C#移植版本,我使用的版本是
以下是一个使用示例,与其他C#实现相比,这有点麻烦:
Stream mystream = res.GetResponseStream();
MemoryStream msTemp = new MemoryStream();
int len = 0;
byte[] buff = new byte[512];
while ((len = mystream.Read(buff, 0, 512)) > 0)
{
msTemp.Write(buff, 0, len);
}
res.Close();
if (msTemp.Length > 0)
{
msTemp.Seek(0, SeekOrigin.Begin);
byte[] PageBytes = new byte[msTemp.Length];
msTemp.Read(PageBytes, 0, PageBytes.Length);
msTemp.Seek(0, SeekOrigin.Begin);
int DetLen = 0;
byte[] DetectBuff = new byte[4096];
CharsetListener listener = new CharsetListener();
UniversalDetector Det = new UniversalDetector(null);
while ((DetLen = msTemp.Read(DetectBuff, 0, DetectBuff.Length)) > 0 && !Det.IsDone())
{
Det.HandleData(DetectBuff, 0, DetectBuff.Length);
}
Det.DataEnd();
if (Det.GetDetectedCharset()!=null)
{
CharSetBox.Text = "OK! CharSet=" + Det.GetDetectedCharset();
PageBox.Text = System.Text.Encoding.GetEncoding(Det.GetDetectedCharset()).GetString(PageBytes);
}
}
可以在上面识别网页的编码,看起来很简单,不是吗?如果您以前曾对此问题感到困扰,并且有幸看到这篇文章,那么这种类型的问题将得到彻底解决,并且您将永远不会遇到很多问题,因为您不知道网页编码? ? ? ? ?回号;从那以后,生活是如此美好。 。 。
我也这么认为
如上所述,代码识别是一个概率事件,因此不能保证它是100%正确的。因此,我仍然发现由识别错误引起的一些错误。 ?就数字而言,真的没有办法完美地解决这个问题吗?
我坚信,世界上没有完美的事物。
幸运的是,我们只需要一个完美的解决方案:我们需要让程序知道何时可以自动识别错误;如果错误,请读取并使用服务器和网页提供的编码信息。
我花了一段时间的脑子,想出了一种本地方法:对于我们中文,中文网页存在编码问题。如果正确识别了中文网页,则其中必须收录中文字符。宾果游戏,我从互联网上找到了前N个汉字(例如“的”)。只要网页收录这N个汉字之一,识别就成功,否则识别就失败。
这样,基本上可以轻松解决网页编码识别问题。
后记:
我不知道是否有人对此感兴趣。如果是这样,我想在这方面写一篇文章文章。标题也被深思熟虑:“网络IO,异步无处不在”,这里指的是仅HTTP请求的网络IO
Tiandilian 站群使用此代码识别方法解决了采集领域中的一个主要问题。从那时起,我可以从这个问题中汲取精力,研究和解决其他问题。