php抓取网页title(这里有新鲜出炉的精品教程,程序狗速度看过来!)
优采云 发布时间: 2021-11-23 09:06php抓取网页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;
}
}
}
好了,结束工作,去睡觉吧。. .