jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
优采云 发布时间: 2022-04-07 13:01jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
1. 前言
相信很多人在做开发的时候都有过这样的需求:准确的从网页中提取出需要的内容。想来想去,方法无外乎如下:(本人还是新手,有更好的方法,请指点)
1. 使用正则表达式来匹配所需的元素。(缺点:如果同一类型的元素具有不同的属性,例如
啊啊啊
bbb
, 如果要匹配所有的 div 元素,会比较麻烦,而且很容易得到不想要的结果而错过需要的结果。)
2. 使用 Linq to XML 将网页转换为 XML 文档。(缺点:需要一个转换过程,效率不高。)
3. 使用网站提供的WebServices或WebAPI等接口直接获取需要的数据。(缺点:需要先获取接口文档,一般不匿名提供。)
随着近几年前端的兴起,越来越多的人开始认可和信服JQuery这个强大的工具。其中最重要的一点是JQuery选择器,简洁、高效、易学,大大提高了前端工程师的工作效率。. 想想看,提取网页内容就是在处理前端。如果可以使用 JQuery 选择器,那就完美了!!!
2. 理论准备
您想在.NET 下自己制作选择器吗?不,这不是我可以等待年轻一代去做的事情。. . . 既然 JQuery 已经存在,为什么不直接使用它的选择器呢?
1. .NET 获取网页内容
在这里您可以选择 webbrowser 控件。事实上,它是一个微型 IE,它可以做 IE 能做的所有事情。有人会问为什么不用WebClient直接下载网页内容呢?请看第二点。
2. .NET 与 JS 交互
使用webbrowser控件,不仅可以获得网页的内容,更重要的是提供了与网页交互的功能。使用内置的 Document 属性,我们可以将所需的 JS 代码注入网页并执行。
3. 提取并返回所需内容
在 .NET 中,我们可以使用 Docment 的 InvokeScript 函数来执行相应的 JS 函数并获取返回结果。
现在理论已经准备好了,接下来让我们实现它。
3. 函数实现
测试页:(福利网站哦,不过绝对没有邪恶内容,请编辑明鉴!)
功能要求:提取所有“好处”!!!!
从图中可以看出,“福利”是准确提取出来的。而且您只能获得所需的属性值。您所要做的就是输入最短 15 个字符。
我们看一下代码实现:
其中wb为webbrowser控件,本节主要是将JQuery库注入到一些不收录JQuery库的网页中。
无效的 InjectJQuery()
{
HtmlElement jquery = wb.Document.CreateElement("script");
jquery.SetAttribute("src", "");
wb.Document.Body.AppendChild(jquery);
JQueryInjected = true;
}
这里是需要注入的JS函数。因为不同的需求有不同的代码,所以不能重复注入。当需求发生变化时,只需要更改注入的函数即可。
JQScript = wb.Document.GetElementById("JQScript");
如果(JQScript == null)
{
JQScript = wb.Document.CreateElement("script");
JQScript.SetAttribute("id", "JQScript");
JQScript.SetAttribute("type", "text/javascript");
wb.Document.Body.AppendChild(JQScript);
}
这是关键代码,根据是否要提取属性生成不同的代码。注入的代码很简单,相信稍微懂一点前端的朋友一看就懂。而最后一行代码是执行注入的函数并获取返回值。
if (txtAttribute.Text.Trim() == string.Empty)
JQScript.SetAttribute("text", "function GetJQValue() { if ($('" + txtSelector.Text + "').length == 1) {" +
"return $('" + txtSelector.Text + "')[0].outerHTML; }" +
" else if ($('" + txtSelector.Text + "').length > 1) {" +
“var allhtml = '';” +
" $('" + txtSelector.Text + "').each(function() {allhtml=allhtml+$(this)[0].outerHTML+'\\r\\n';});" +
"返回所有html;}" +
" else return '未找到项目。';}");
别的
{
JQScript.SetAttribute("text", "function GetJQValue() { if ($('" + txtSelector.Text + "').length == 1) {" +
"return $('" + txtSelector.Text + "').attr('" + txtAttribute.Text + "'); }" +
" else if ($('" + txtSelector.Text + "').length > 1) {" +
“var allhtml = '';” +
" $('" + txtSelector.Text + "').each(function() {allhtml=allhtml+$(this).attr('" + txtAttribute.Text + "')+'\\r\\n'; });" +
"返回所有html;}" +
" else return '未找到项目。';}");
}
textBox2.Text = wb.Document.InvokeScript("GetJQValue").ToString();
相信大家一眼就看出来了。只需 10 行代码,您就可以使用强大的 JQuery 选择器。效率比旧方法高出许多倍。为什么不这样做?