jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
优采云 发布时间: 2021-11-26 06:08jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
1. 前言
相信很多人在做开发的时候都有这样的需求:从网页中准确提取出需要的内容。想了想,方法无外乎如下:(本人经验少,如果有更好的方法请大家指教)
1. 使用正则表达式匹配需要的元素。(缺点:如果相同类型的元素有不同的属性,比如
啊啊啊
bbb
,如果要匹配所有的div元素,会比较麻烦,而且很容易得到不需要的结果,错过需要的结果。)
2. 要将网页转换为 XML 文档,请使用 Linq to XML。(缺点:需要一个转换过程,效率不高。)
3. 使用网站提供的WebServices或WebAPI直接获取需要的数据。(缺点:需要先获取接口文档,一般不会匿名提供。)
随着这几年前端的兴起,越来越多的人开始认识并相信JQuery这个强大的工具。最重要的一点之一是 JQuery 选择器。它的简单、高效、易学,让前端工程师的工作效率大大提高。. 如果你仔细想想,提取网页内容只是在处理前端。如果可以使用JQuery选择器就完美了!!!
2. 理论准备
你想在 .NET 下自己做一个选择器吗?不,这不是我等小辈做的。. . . 既然已经有了JQuery,为什么不直接使用它的选择器呢?
1. .NET 访问网络内容
在这里你可以选择webbrowser控件,其实它就是一个迷你IE,它可以做IE可以做的一切。可能有人会问为什么不直接用WebClient下载网页内容呢?请看第二点。
2. .NET 与 JS 交互
使用webbrowser控件,不仅可以获取网页的内容,更重要的是它提供了与网页交互的功能。使用内置的 Document 属性,我们可以将所需的 JS 代码注入网页并执行。
3. 提取并返回需要的内容
在.NET中,我们可以使用Documentation的InvokeScript函数来执行对应的JS函数并得到返回结果。
现在理论已经准备好了,让我们接下来实现它。
3. 功能实现
测试页:(福利网站哦,但绝对没有邪恶内容,请编辑明鉴!)
功能需求:提取所有“好处”!!!!
第一张图:
从图中可以看出,“福利”提取的很准确。并且您只能获得所需的属性值。您所要做的就是输入一个简短的 15 个字符。
我们来看一下代码实现:
其中,wb 为 webbrowser 控件。本段主要是将JQuery库注入到一些不收录JQuery库的网页中。
void InjectJQuery()
{
HtmlElement jquery = wb.Document.CreateElement("script");
jquery.SetAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js");
wb.Document.Body.AppendChild(jquery);
JQueryInjected = true;
}
这里是需要注入的JS函数。因为不同的需求有不同的代码,所以不能重复注入。当需求改变时,只需要改变注入的函数。
JQScript = wb.Document.GetElementById("JQScript");
if (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';});" +
" return allhtml;}" +
" else return 'no item found.';}");
else
{
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';});" +
" return allhtml;}" +
" else return 'no item found.';}");
}
textBox2.Text = wb.Document.InvokeScript("GetJQValue").ToString();
相信大家一看就明白,短短几行代码,就可以使用强大的JQuery选择器,效率比之前的老方法高很多倍,何乐而不为呢?
4. 知识扩展
1. 只要你的前端知识够硬,可以注入更复杂的函数,实现更复杂的内容提取。
2. 在Android和IOS中,理论上是可以实现这样的功能的。
3. 也许有一天,我们会有一个类似的选择器来代替SQL来实现高效的数据库查询?? ? ? ? ? ? ? ? ?
PS:我文笔极差,知识面也不广。如有错误,敬请指正!