抓取网站编码信息及内容

news/2024/5/20 11:09:46/文章来源:https://blog.csdn.net/weixin_30446613/article/details/99479941
     最近在编写一个读取网站内容的小东西,在网上一搜很多,但是在拿过来用时不太理想,有些内容读取还是出现乱码问题。于是我在loafinweb 这位兄弟代码的基础上做了一些小的调整,以达到个人需求,如有不对之处还请loafinweb 见谅。
1、获取编码片段:
把 string html = reader.ReadToEnd();
改写成
 while ((temp = reader.ReadLine()) != null)
{
htmlBuilder.Append(temp);
html = htmlBuilder.ToString();
if (html.IndexOf("charset", StringComparison.InvariantCultureIgnoreCase) > 0)
{
break;
}
}
这样对读取速度有所改进,只需要读取页面头部的编码部分即可,不需要读取整个页面。
2、添加对response.StatusCode == HttpStatusCode.MovedPermanently ||response.StatusCode==HttpStatusCode.Found情况的判断,递归获取编码。
(相关 Response.StatusCode的HTTP状态代码 请参考http://wenku.baidu.com/view/cc274309bb68a98271fefada.html)
如新浪www.sina.com,默认会跳到www.sina.com.cn
通过Fiddler可以抓取到相关的跳转过程

   

   

//获取编码
public static string getEncoding(string url)
{
HttpWebRequest request = null;
HttpWebResponse response = null;
StreamReader reader = null;
string temp = string.Empty;
try
{
request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 30000;
request.AllowAutoRedirect = false;
string html = "";
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
{
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
else
reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

//此处不用ReadToEnd 方法,采用ReadLine 当读到charset时跳出。
//string html = reader.ReadToEnd();
StringBuilder htmlBuilder = new StringBuilder();
while ((temp = reader.ReadLine()) != null)
{
htmlBuilder.Append(temp);
html = htmlBuilder.ToString();
if (html.IndexOf("charset", StringComparison.InvariantCultureIgnoreCase) > 0)
{
break;
}
}

Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
if (reg_charset.IsMatch(html))
{
return reg_charset.Match(html).Groups["charset"].Value;
}
else if (response.CharacterSet != string.Empty)
{
return response.CharacterSet;
}
else
return Encoding.Default.BodyName;
}
else if (response.StatusCode == HttpStatusCode.MovedPermanently ||response.StatusCode==HttpStatusCode.Found)
{
//页面跳转返回301,如:www.sina.com
//重新读取跳转地址
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
else
reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);
html = reader.ReadToEnd();
Regex reg_href = new Regex("<a[\\s]+href[\\s]*=[\\s]*\"([^<\"]+)\"");
if (reg_href.IsMatch(html))
{
var targetUrl=reg_href.Match(html).Groups[1].Value;
if (!IsURL(targetUrl))
{
url = url + targetUrl;
}
else
{
url = targetUrl;
}
return getEncoding(url);
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (response != null)
{
response.Close();
response = null;
}
if (reader != null)
reader.Close();

if (request != null)
request = null;
}
return Encoding.Default.BodyName;
}
3、获取网页内容时添加对gzip情况的判断,否则可能出现乱码如www.sohu.com
//获取网页字符根据url  
public static string getHtml(string url)
{
try
{
string str = "";
Encoding en = Encoding.GetEncoding(getEncoding(url));
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Set("Pragma", "no-cache");
request.Timeout = 30000;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
{
//此处不要用StreamReader 直接读取,需要判断gzip情况
//否则可能出现乱码现象,如www.sohu.com
//Stream strM = response.GetResponseStream();
//StreamReader sr = new StreamReader(strM, en);
StreamReader sr;
if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
sr = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress),en);
else
sr = new StreamReader(response.GetResponseStream(), en);
str = sr.ReadToEnd();
//strM.Close();
sr.Close();
}
return str;
}
catch
{
return String.Empty;
}
}
代码下载
参考:http://www.cnblogs.com/clc2008/archive/2011/09/13/2174284.html

转载于:https://www.cnblogs.com/peak-weng/archive/2012/01/31/2333143.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_737386.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉冲击!12个精美绝伦的扁平化网站设计

越来越多的人崇尚简单&#xff0c;简约的扁平化设计风格。扁平化设计对于印刷品设计、网页设计和移动操作系统的设计来都带去了新的变化。扁平化网页设计是指设计形式摒弃图案纹理背景&#xff0c;阴影文字以及网站盒模型的部分。 下面手机了12个来自全球各地的设计师们精工雕琢…

在网站前端中,你可能会用到的这些…

一、设置字体的行间距为3PX &#xff1a; letter-spacing:3PX ; 二、为投票所显示分值设置首字下沉并变大点 &#xff1a; XXX:first-letter {font-size:150%;font-weight:bold;float:left;} 注&#xff1a; float:left; 有起到下沉的效果&#xff1b; 三、当字体与图片、表单标…

Asp.net网站管理工具来配置membership

1.安装好sql express,创建自己的数据库 2.VS命令行下运行aspnet_regsql命令&#xff0c;弹出ASP.NET SQL Server Setup Wizard 3.server填入.\sqlexpress,选择自己的数据库 4.完成后&#xff0c;会自动在选择的数据库中生成11张和membership相关的表 5.修改web.config 1 <…

2014年全球网站设计的15个趋势

2019独角兽企业重金招聘Python工程师标准>>> 1、超长网页设计 以往的长网页会挤满内容&#xff0c;我们习惯于下滑滚动网页来获取信息&#xff0c;但并非是挤满内容枯燥的长网页&#xff0c;而是由更多的留白空间以及快速响应技术合并而成的超长网页设计。这样的设计…

搜索引擎排名都选乐云seo_微信订阅号和微信服务号做SEO优化排名都需要注意哪些细节?优秀的公众号微信SEO是怎么做的?...

微信订阅号和微信服务号排名规则&#xff0c;优秀的微信微信订阅号和微信服务号排名百科。微信订阅号和微信服务号排名优化的注意事项和细节今天和大家分享。随着微信微信订阅号和微信服务号的排名优化&#xff0c;大部分人已经知道了这个渠道的存在。其实很多人在很多新的产品…

帝国网站模板怎么上传到服务器,有一个网站模板,怎么上传到空间里?

有一个网站模板&#xff0c;怎么上传到空间里&#xff1f;(2017-03-22 22:52:06)标签&#xff1a;杂谈《帝国网站管理系统》英文译为"EmpireCMS"&#xff0c;简称"Ecms"&#xff0c;它是基于B/S结构&#xff0c;且功能强大而帝国CMS-logo易用的网站管理系统…

adminer.php 使用,网站没有phpMyAdmin,就用Adminer插件

网站数据库管理是非常重要的一件事情&#xff0c;很多同学习惯了phpMyAdmin这个管理工具&#xff0c;主机商一般也会配置phpMyAdmin环境。不过&#xff0c;如果你的WORDPRESS网站正好没有phpMyAdmin怎么办呢&#xff1f;自己装一个&#xff0c;我可不会&#xff0c;也不想去学&…

linux安装redis需要网站支持吗,Linux安装redis服务器和部署

第一步&#xff1a;下载安装包wget http://download.redis.io/releases/redis-5.0.5.tar.gz访问https://redis.io/download 到官网进行下载。这里下载最新的5.0.5版本.第二步&#xff1a;安装1.通过远程管理工具&#xff0c;将压缩包拷贝到Linux服务器中&#xff0c;执行解压操…

c语言字符串输出大写字母个数,欧洲区预选赛视频直播 -官方网站

本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/cal…

网站负载均衡技术

DNS轮循  DNS轮循是指将相同的域名解释到不同的IP&#xff0c;随机使用其中某台主机的技术。但其具有明显的缺点&#xff1a;一旦某个服务器出现故障&#xff0c;即使及时修改了DNS设置&#xff0c;还是要等待足够的时间&#xff08;刷新时间&#xff09;才能发挥作用&#x…

如何从网站上下载php文件在哪里,新手拿到PHP网站源代码和sql数据库文件,从哪下手开始部署?...

今天解决一下新手在入门时的疑惑&#xff1f;菜鸟拿到一套PHP网站程序源代码和sql数据库文件&#xff0c;应该如何下手&#xff1f;从哪开始去上传程序部署网站呢&#xff1f;必须先了解FTP软件的使用方法(这是基础)这个软件就是为了上传你的网站程序&#xff0c;后期更新程序的…

linux 目录同步 rsync,Linux rsync网站目录同步功能的实现

实现目标&#xff1a;172.16.1.64服务器上的/var/www/sw_service目录&#xff0c;与172.16.1.60服务器上的/var/www/sw_service目录实现同步&#xff0c;即1.60主动向1.64同步环境配置&#xff1a;Server-->172.16.1.64/var/www/sw_serviceClient-->172.16.1.60/var/www/…

普通网站需要什么服务器配置,普通网站服务器配置

普通网站服务器配置 内容精选换一换通过华为云注册的域名默认使用华为云DNS进行解析&#xff0c;其“DNS服务器”为&#xff1a;ns1.huaweicloud-dns.cn、ns1.huaweicloud-dns.com。当您想在Internet上通过域名访问您的网站时&#xff0c;可以参考本操作为域名添加解析记录。为…

高并发高流量网站架构

Web2.0的兴起&#xff0c;掀起了互联网新一轮的网络创业大潮。以用户为导向的新网站建设概念&#xff0c;细分了网站功能和用户群&#xff0c;不仅成功的造就了一大批新生的网站&#xff0c;也极大的方便了上网的人们。但Web2.0以用户为导向的理念&#xff0c;使得新生的网站有…

创建asp.net网站解决方案文件(.sln)不和项目在同一目录问题

创建ASP.NET网站.sln文件&#xff0c;不会和项目文件在一起&#xff0c;而是在 我的文档->vs2010->Project 文件夹里面&#xff0c;最后我们想打包的时候&#xff0c;这个文件要拷贝走&#xff0c;并且要修改里面的路径&#xff0c;可以是相对路径&#xff0c;也可以是绝…

【Android Wear】Android Wear开发很好的开发网站汇总

2019独角兽企业重金招聘Python工程师标准>>> 1.Android Wear中文开发教程 | 穿戴猫论坛 - Android Wear开发 http://dev.seacat.cn/ 2.google Android开发官网 http://developer.android.com/intl/zh-cn/training/index.html 转载于:https://my.oschina.net/u/199…

wp优秀个人博客网站模板推荐

做个人博客网站&#xff0c;选择合适的模板非常重要。而wordpress是一套十分流行的博客开源cms系统&#xff0c;所以今天就如何选取wordpress模板说一说我的观点和建议。而作为wp个人博客模板&#xff0c;并不是一定得照搬照就&#xff0c;而要加入一些先进的用户体验、界面优化…

列出IIS上的虚拟目录和网站信息。

以前一直想不通怎么用纯WEB来操作IIS&#xff08;以为必需要装插件&#xff09;&#xff0c;直到发现了很少用到的System.DirectoryServices才豁然开朗。 初探WEB设置IISImports SystemImports System.DirectoryServicesImports System.IOPublic Class WebForm5Class WebForm5 …

网站数据采集程序(爬虫)

采集数据无非就是三步&#xff0c;抓取页面&#xff0c;分析数据&#xff0c;入库。 一、抓取页面 抓取页面也是在网上找的例子&#xff0c;主要是用到了2个方法 1&#xff0c;获取网站类容&#xff1b;2&#xff0c;清除html标签。具体看代码&#xff1a; /// <summary>…

网站是否有播放音乐功能

以前开发的一个网站&#xff0c;昨晚吃晚饭时&#xff0c;客户来电说&#xff0c;网站是否有播放音乐功能&#xff0c;可更换乐曲&#xff0c;可控音量与停放。当时一心品尝美味晚餐&#xff0c;当时随口回答客户一切没有问题。 晚餐完毕&#xff0c;开始工作......第一步&…