宝哥软件园

ASP.NET c#方法抓取页面信息介绍

编辑:宝哥软件园 来源:互联网 时间:2021-10-07

1.网页更新我们知道,一般网页中的信息都在不断的被翻新,这也要求我们定期的去掌握这些新的信息。但是,如何理解这个“规律”,也就是页面需要被抓取的频率,其实就是页面缓存时间。我们没有必要在页面的缓存时间内再次抓取页面,但是会给别人的服务器带来压力。例如,如果我想抓取博客公园的主页,我应该首先清除页面缓存。

从上次修改到过期,我们可以看到博客公园的缓存时间是2分钟,我还可以看到当前的服务器时间日期。如果我再次刷新页面,这里的日期会变成下图中的If-Modified-before,然后发送给服务器判断浏览器缓存是否过期。

最后,当服务器找到if-modified-before=last-modified finish的时间时,服务器返回到304,但是发现小偷很多。

2min实际开发,如果知道网站的缓存策略,可以让爬虫每2分钟爬行一次。当然,这些可以由数据团队进行配置和维护。好,我们用爬虫来模拟一下。复制代码如下:使用系统;使用System.Net;命名空间ConsoleApplication2 {公共类Program { static void Main(字符串[]args){ DateTime prev DateTime=DateTime。MinValuefor(int I=0;i 10i ) {尝试{ var url=' http://cnblogs.comvar request=(Httpwebrequest)Httpwebrequest。创建(网址);请求。方法=' Headif (i 0) {请求。IfModifiedSince=prevDateTime}请求。超时=3000;var response=(HttpWebResponse)请求。GetResponse();var代码=响应。StatusCode//如果服务器返回的状态为200,则认为网页已经更新。记住服务器时间if(代码==httpstatuscode . ok){ prev datetime=convert . today time(response . headers[httpresponseheader . date]);}控制台。WriteLine('当前服务器的状态代码为:{0} ',代码);} catch (WebException ex) { if (ex。回应!=null) { var代码=(例如。响应为HttpWebResponse)。StatusCode控制台。WriteLine('当前服务器的状态代码为:{0} ',代码);} } } } } } } }

二:网页编码的问题有时候我们已经抓取了网页,准备解析的时候,所有的tmd都乱码了,真是操蛋,比如下面的

可能我们依稀记得html的meta中有一个叫charset的属性,记录了编码方式,另外一个关键点就是属性响应。CharacterSet也会记录编码模式,所以我们再试一次。

其实是乱码,蛋疼。这次我需要去官网看一下。http头信息中的交互是什么?为什么浏览器可以正常显示,爬虫却爬不过去?

查看了超文本传送协议(超文本传输协议的缩写)头信息,终于我们知道了,浏览器说我可以解析gzip,deflate,sdch这三种压缩方式,服务器发送的是gzip压缩,到这里我们也应该知道了常用的网性能优化。复制代码代码如下:使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;使用系统。穿线;使用HtmlAgilityPack使用系统。文本。正则表达式;使用系统。净值;使用系统IO;使用系统IO。压缩;命名空间控制台应用程序2 {公共类Program { static void Main(string[]args){//var current ul=' http://www。毫米。com/';var Currentrol=' http://www .搜狐。com/';var request=WebRequest .将(当前)创建为HttpWebRequestvar响应=请求GetResponse()作为HttpWebResponsevar encode=string .空的;如果(响应字符集==' ISO-8859-1 ')编码=' GB 2312else encode=响应。字符集;溪流;如果(响应内容编码。ToLower()==' gzip '){ stream=new gzipcalm(响应GetResponseStream(),压缩模式。解压);} else { stream=response .GetResponseStream();} var sr=新的StreamReader(流,编码GetEncoding(encode));var html=Sr . ReadToEnd();} } }

三:网页解析既然经过千辛万苦拿到了网页,下一个就要解析了,当然正则匹配是个好方法,毕竟工作量还是比较大的,可能业界也比较推崇HtmlAgilityPack这个解析工具,能够将超文本标记语言解析成XML,然后可以用XPath去提取指定的内容,大大提高了开发速度,性能也不赖,毕竟灵活也就是敏捷的意思,关于XPath的内容,大家看懂W3CSchool的这两张图就好了

复制代码代码如下:使用系统;使用系统。集合。通用;使用系统Linq .使用系统。文字;使用系统。穿线;使用HtmlAgilityPack使用系统。文本。正则表达式;使用系统。净值;使用系统IO;使用系统IO。压缩;命名空间控制台应用程序2 {公共类Program { static void Main(string[]args){//var current ul=' http://www。毫米。com/';var current ul=' http://www .搜狐。com/';var request=WebRequest .将(当前)创建为HttpWebRequestvar响应=请求GetResponse()作为HttpWebResponsevar encode=string .空的;如果(响应字符集==' ISO-8859-1 ')编码=' GB 2312else encode=响应。字符集;溪流;如果(响应内容编码。ToLower()==' gzip '){ stream=new gzipcalm(响应GetResponseStream(),压缩模式。解压);} else { stream=response .GetResponseStream();} var sr=新的StreamReader(流,编码GetEncoding(encode));var html=Sr . ReadToEnd();关闭();HTMl文档=新建HTMl文档();文件.加载HTMl(HTMl);//提取标题var title=文档文档节点。选择单个节点('//title ').InnerText//提取关键词定义变量关键词=文档文档节点。选择单个节点('//meta[@ name=' Keywords ']').属性['内容']。价值;} } }

好了,打完收工,睡觉。

更多资讯
游戏推荐
更多+