天天看点

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

Hello,亲爱的小伙伴们,欢迎浏览“使用CefSharp和Javascript实现网络爬虫”。

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

本篇是第2篇,介绍在实现爬虫过程中会用到的Javascript和C#主要知识点。在使用CefSharp和Javascript实现网络爬虫过程中,我使用到的C#和Javascript知识主要包括三个方面:一是Javascript的Dom操作;二是CefSharp中Javascript和C#之间的调用和交互;三是C#委托使用,用于接收到数据后的回调处理。

网络爬虫采用Javascript的DOM操作来抓取目标数据,并通过CefSharp提供的Javascript和C#交互方法,把目标数据传递给C#代码进行处理。下面我将分别进行记录,分享给感兴趣的小伙伴。

一、Javascript原生DOM操作

HTML通过浏览器解析后形成DOM树,DOM中每个 HTML标签都是一个节点元素,包括属性、方法、子孙节点。Javascript有一套操作HTML的DOM编程接口,通过DOM编程接口能够操作到每个节点元素(即HTML标签),支持增、删、改、查操作。

1、查找获取节点

查找获取HTML节点元素,可能通过document的get方法,或者使用document 的querySelector()和querySelectorAll()方法实现。

方法1:通过document的get方法

var elem=document.getElementById(idName) ;//通过id号获取元素,返回一个元素对象
           
var elem=document.getElementsByClassName(className) ;//通过class获取元素,返回元素数组
           
var elem document.getElementsByTagName(tagName);//通过标签名获取元素,返回元素数组
           

以上方法可以串联使用,例如:

// 先定位ID为idName的节点,再返回其内部所有名称为tagName的节点:

var elem = document.getElementById(idName).getElementsByTagName(tagName);
           

// 先定位ID为idName的节点,再返回其内部所有class包含className的节点:

var elem = document.getElementById(idName).getElementsByClassName(className);
           

方法二:使用document 的querySelector()和querySelectorAll()方法

var elem = document.querySelector('# idName ');// 通过querySelector获取id为idName的节点
           
var elem = document.querySelectorAll('div');// 通过querySelectorAll获取所有的div节点
           

2、获取/设置元素的属性值

通过document的get方法,或者使用document 的querySelector()和querySelectorAll()方法,得到节点对象后,可进一步可获取节点的属性值。

elem.parentNode;//获取当前元素的父节点
           
elem.chlidren;//获取当前元素子节点
           
elem.chilidNodes;//获取当前元素子节点
           
elem.firstChild;//获取当前元素的第1个子节点
           
elem.lastChild;//获取当前元素的最后1个子节点
           
elem.innerHTML   //获取元素的内部文本
           
elem.innerText; //获取当前元素的内部文本值,只是文本内容,不包括html代码
           

此外,通过getAttribute、setAttribute可以实现对属性值的获取或设置。

elem.getAttribute(attributeName);//传入属性名称,获取对应属性的属性值
           
elem.setAttribute(attributeName,attributeValue); //传入属性名称,以及属性值
           

二、jQuery操作HTML的DOM

对于支持jQuery的站点,可以直接使用jQuery方便地进行DOM操作。

jQuery对Javascript的DOM操作方法进行了封装,通过jQuery 选择器能够对 HTML 节点元素或节点元素组进行操作。jQuery 选择器通过节点的 ID、类、类型、属性、属性值等查找/选择HTML 节点元素,jQuery 选择器以$符号开头。

1、查找获取节点

(1)元素选择器

使用节点名选取元素,例如在页面中选取所有

元素:$('div')

(2)#id选择器

使用 HTML 元素的 ID属性选取指定的元素,例如在页面中选取id='myid'的

元素:$('#myid')

(3).class 选择器

使用 class 查找元素,例如在页面中选取class='myclass'的

元素:$(".myclass")

2、获取/设置元素的属性值:

通过attr() 、html()、val()方法设置或返回被选元素的属性值:

$(selector).attr(attribute); //获取被选元素的属性值
           
$(selector).attr(attribute,value);//设置被选元素的属性和值
           
$(selector).html();//获取或设置被选元素的内容 (innerHTML)
           
$(selector).val();//获取或设置被选元素的值
           

三、DOM操作实践

使用Chrome浏览器,打开以下网址:

https://www.toutiao.com/c/user/3601650358695789/#mid=1652236062202883

(1)按“F12”打开 “开发者工具”窗口,在“Elements”面板可以看到页面的DOM结构。

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

(2)点击左上角"箭头"图标,在页面中选择文章标题,在“开发者工具”中可以看到被选中元素高亮显示。

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

(3)在“开发者工具”中“右键”点击高亮显示内容,在弹出菜单中选择Copy。

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

(4)选择“Copy selector”

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

(5)点击开发者工具的“Console”选项,在窗口中进行如下输入:

a) 输入"//" ,然后键盘按下"Ctrl"+"V" 粘贴上述操作获取的HTML元素选择字符串,或者在输入行“点击右键”,选择“粘贴(P)”,粘贴上述操作获取的HTML元素选择字符串,字符串为:

#wrapper > div.left > div:nth-child(2) > div > div:nth-child(3) > div > ul > li > div > div.normal.rbox > div > div.title-box > a
           

b) 输入 var elem=$("XXX"),其中XXX是"Ctrl"+"V" 粘贴的字符串

c) 输入 elem回车,即可获得我们选中的文章标题元素

d) 输入 elem.href ,即可获得文章标题的URL链接地址

e) 输入 elem.innerText,即可获得文章标题字符串。

cefsharp 打开页面慢_使用CefSharp和Javascript实现网络爬虫—DOM操作

这样我们就获得了文章标题和对应的URL地址,后面通过CefSharp中Javascript和C#之间的调用和交互方法,可将标题和对应的URL地址传递给C#进行处理存储、打开链接获取文章详细内容等。本篇介绍了Javascript的DOM操作,后面我将对C#委托使用、CefSharp中Javascript和C#之间的调用和交互进行介绍,敬请指正。

继续阅读