jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
优采云 发布时间: 2021-09-17 22:02jquery抓取网页内容(从网页中准确提取所需的内容,你知道吗?)
1.序言
我相信很多人在进行开发时都有这样的需求:从网页中准确地提取所需的内容。经过思考,方法不外乎以下:(我的经验还很浅,还有更好的方法,请给我一些建议)
1.使用正则表达式匹配所需的元素。(缺点:如果相同类型的元素具有不同的属性,例如
aaa
bbb
,如果您想匹配所有div元素,这将非常麻烦,而且很容易得到不需要的结果并错过所需的结果。)
2.使用LINQ转换为XML将网页转换为XML文档。(缺点:需要转换过程,效率不高。)
3.使用网站提供的web服务或web API直接获取所需数据。(缺点:需要先获取接口文档,一般不匿名提供)
近年来,随着前端的兴起,越来越多的人开始理解jQuery,并对它留下深刻印象。非常重要的一点是jQuery选择器。它的简单性、高效性和易学性使前端工程师大大提高了工作效率。想想看。提取web内容需要处理前端。如果您可以使用jQuery选择器,它将是完美的
2.理论准备
是否要在下创建选择器。网?不,这不是我和其他年轻人能做的。。。。既然有了jQuery,为什么不直接使用它的选择器呢
1.. Net获取web内容
您可以在此处选择WebBrowser控件。事实上,它是一个微型ie。它可以做任何ie可以做的事情。有人问为什么不使用webclient直接下载web内容?请看第二点
2.. Net与JS交互
使用WebBrowser控件,您不仅可以获取网页内容,还可以提供与网页交互的功能。使用内置的document属性,我们可以将所需的JS代码注入web页面并执行它
3.提取并返回所需内容
在。Net中的invokescript函数来执行相应的JS函数并得到返回结果
既然理论已经准备好了,让我们实施它吧
3.函数实现
测试页面:(福利网站Oh,但没有邪恶内容,请编辑明剑!)
功能要求:提取所有好处
从上图开始:
从图中可以看出,“福利”是准确提取的。您只能获得所需的属性值。你只需要输入15个字符
让我们看看代码实现:
WB是WebBrowser控件。本节主要用于将jQuery库注入到一些不收录jQuery库的网页中
void InjectJQuery()<br />
{<br />
HtmlElement jquery = wb.Document.CreateElement("script");<br />
jquery.SetAttribute("src", "http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js");<br />
wb.Document.Body.AppendChild(jquery);<br />
JQueryInjected = true;<br />
}
下面是要为注入执行的JS函数。因为不同的要求有不同的代码,所以不能重复注入。当需求改变时,您只需要改变注入的函数
JQScript = wb.Document.GetElementById("JQScript");
if (JQScript == null)<br />
{<br />
JQScript = wb.Document.CreateElement("script");<br />
JQScript.SetAttribute("id", "JQScript");<br />
JQScript.SetAttribute("type", "text/javascript");<br />
wb.Document.Body.AppendChild(JQScript);<br />
}
这里是关键代码,它根据是否提取属性生成不同的代码。注入的代码非常简单。我相信对前端略知一二的朋友会一目了然。最后一行代码是执行注入函数并获取返回值
if (txtAttribute.Text.Trim() == string.Empty)<br />
JQScript.SetAttribute("text", "function GetJQValue() { if ($('" + txtSelector.Text + "').length == 1) {" +<br />
"return $('" + txtSelector.Text + "')[0].outerHTML; }" +<br />
" else if ($('" + txtSelector.Text + "').length > 1) {" +<br />
" var allhtml = '';" +<br />
" $('" + txtSelector.Text + "').each(function() {allhtml=allhtml+$(this)[0].outerHTML+'\\r\\n';});" +<br />
" return allhtml;}" +<br />
" else return 'no item found.';}");<br />
else<br />
{<br />
JQScript.SetAttribute("text", "function GetJQValue() { if ($('" + txtSelector.Text + "').length == 1) {" +<br />
"return $('" + txtSelector.Text + "').attr('" + txtAttribute.Text + "'); }" +<br />
" else if ($('" + txtSelector.Text + "').length > 1) {" +<br />
" var allhtml = '';" +<br />
" $('" + txtSelector.Text + "').each(function() {allhtml=allhtml+$(this).attr('" + txtAttribute.Text + "')+'\\r\\n';});" +<br />
" return allhtml;}" +<br />
" else return 'no item found.';}");<br />
}<br />
textBox2.Text = wb.Document.InvokeScript("GetJQValue").ToString();
我相信一眼就可以看出,只需10行代码就可以使用功能强大的jQuery选择器,这比以前的旧方法效率高出许多倍。为什么不呢
4.知识扩展
1.只要您的前端知识足够难,您就可以注入更复杂的函数来实现更复杂的内容提取
2.在Android和IOS中,这些功能在理论上是可以实现的
3.也许有一天,我们会有一个类似的选择器来代替SQL,从而实现对数据库的高效查询
附言:我的写作很差,知识面也不广。如果有错误,请改正