php抓取网页title(这里有新鲜出炉的精品教程,程序狗速度看过来!)

优采云 发布时间: 2021-11-23 09:06

  php抓取网页title(这里有新鲜出炉的精品教程,程序狗速度看过来!)

  这里是新鲜出炉的优质教程,看程序狗的速度!

  ASP.NET ASP.NET 是 .NET FrameWork 的一部分。它是微软公司的一项技术。它是一种服务器端脚本技术,可使嵌入在网页中的脚本由 Internet 服务器执行。它们是在服务器上动态创建的。指的是Active Server Pages,一个运行在IIS(Internet Information Server service,Windows开发的Web服务器)中的程序。

  我们知道一般网页中的信息都是在不断更新的,这也需要我们定期抓取这些新信息,但是如何理解这个“定期”,也就是页面需要多久被抓取一次,在其实这个时间段也是Page cache时间。在页面缓存期间,我们没有必要再次抓取网页,但会对其他服务器造成压力。

  一:网页更新

  我们知道一般网页中的信息都是在不断更新的,这也需要我们定期抓取这些新信息,但是如何理解这个“定期”,也就是页面需要多久被抓取一次,在其实这个时间段也是Page cache时间。在页面缓存期间,我们不需要再次抓取网页,但会对其他服务器造成压力。

  比如我想抓取博客园的首页,先清除页面缓存,

  

  从Last-Modified到Expires,可以看到博客园的缓存时间是2分钟,我还可以看到当前服务器时间Date,如果我再做一次

  如果页面刷新,这里的Date会变成下图中的If-Modified-Since,然后发送到服务器判断浏览器的缓存是否已经过期?

  

  最后服务端发现if-Modified-Since >= Last-Modifined时间,服务端也返回了304,但是发现cookie信息真的是很多小偷。

  

  在实际开发中,如果知道网站的缓存策略,就可以让爬虫每2分钟爬一次。当然,这些可以由数据团队进行配置和维护。好的,让我们使用爬虫。模拟它。

  

using System;

using System.Net;

namespace ConsoleApplication2

{

public class Program

{

static void Main(string[] args)

{

DateTime prevDateTime = DateTime.MinValue;

for (int i = 0; i < 10; i++)

{

try

{

var url = "http://cnblogs.com";

var request = (HttpWebRequest)HttpWebRequest.Create(url);

request.Method = "Head";

if (i > 0)

{

request.IfModifiedSince = prevDateTime;

}

request.Timeout = 3000;

var response = (HttpWebResponse)request.GetResponse();

var code = response.StatusCode;

//如果服务器返回状态是200,则认为网页已更新,记得当时的服务器时间

if (code == HttpStatusCode.OK)

{

prevDateTime = Convert.ToDateTime(response.Headers[HttpResponseHeader.Date]);

}

Console.WriteLine("当前服务器的状态码:{0}", code);

}

catch (WebException ex)

{

if (ex.Response != null)

{

var code = (ex.Response as HttpWebResponse).StatusCode;

Console.WriteLine("当前服务器的状态码:{0}", code);

}

}

}

}

}

}

  

  二:网页编码的问题

  有时候我们已经抓取了网页,准备解析的时候,tmd全是乱码,真他妈的,比如下面这样,

  

  可能我们依稀记得html的meta中有一个叫做charset的属性,里面记录了编码方式。另一个重要的一点是 response.CharacterSet 也记录了编码方式。让我们再试一次。

  

  还是乱码,蛋疼。这个时候需要去官网看看http头信息里面交互的是什么。为什么浏览器能正常显示,爬虫就爬不过去了。

  

  查看http头信息后,我们终于知道了。浏览器说可以解析gzip、deflate、sdch三种压缩方式。服务器发送 gzip 压缩。至此,我们也应该知道常用的web性能优化了。

  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using HtmlAgilityPack;

using System.Text.RegularExpressions;

using System.Net;

using System.IO;

using System.IO.Compression;

namespace ConsoleApplication2

{

public class Program

{

static void Main(string[] args)

{

//var currentUrl = "http://www.mm5mm.com/";

var currentUrl = "http://www.sohu.com/";

var request = WebRequest.Create(currentUrl) as HttpWebRequest;

var response = request.GetResponse() as HttpWebResponse;

var encode = string.Empty;

if (response.CharacterSet == "ISO-8859-1")

encode = "gb2312";

else

encode = response.CharacterSet;

Stream stream;

if (response.ContentEncoding.ToLower() == "gzip")

{

stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);

}

else

{

stream = response.GetResponseStream();

}

var sr = new StreamReader(stream, Encoding.GetEncoding(encode));

var html = sr.ReadToEnd();

}

}

}

  

  三:网页分析

  现在网页经过一番折腾得到了,接下来就解析下一个。当然,正则匹配是一个不错的方法。毕竟工作量还是比较大的。或许业界也推荐HtmlAgilityPack,一个可以将Html解析成XML的解析工具,然后可以使用XPath提取指定的内容,大大提高了开发速度,性能也不错。毕竟,敏捷意味着敏捷。关于XPath的内容,可以看一下W3CSchool的两张图。

  

  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using HtmlAgilityPack;

using System.Text.RegularExpressions;

using System.Net;

using System.IO;

using System.IO.Compression;

namespace ConsoleApplication2

{

public class Program

{

static void Main(string[] args)

{

//var currentUrl = "http://www.mm5mm.com/";

var currentUrl = "http://www.sohu.com/";

var request = WebRequest.Create(currentUrl) as HttpWebRequest;

var response = request.GetResponse() as HttpWebResponse;

var encode = string.Empty;

if (response.CharacterSet == "ISO-8859-1")

encode = "gb2312";

else

encode = response.CharacterSet;

Stream stream;

if (response.ContentEncoding.ToLower() == "gzip")

{

stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress);

}

else

{

stream = response.GetResponseStream();

}

var sr = new StreamReader(stream, Encoding.GetEncoding(encode));

var html = sr.ReadToEnd();

sr.Close();

HtmlDocument document = new HtmlDocument();

document.LoadHtml(html);

//提取title

var title = document.DocumentNode.SelectSingleNode("//title").InnerText;

//提取keywords

var keywords = document.DocumentNode.SelectSingleNode("//meta[@name='Keywords']").Attributes["content"].Value;

}

}

}

  

  好了,结束工作,去睡觉吧。. .

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线