基于xPath的Javascript模拟操作

开发爬虫最基本的技能就是通过xPath定位获取数据,无论是Beautiful Soup还是Lxml这些包,通过xpath定位数据节点并提取数据都是非常高效且方便的。除了xPath以外,也可以使用正则表达式进行数据提取,但是在表达式的编写上要复杂许多。

除了在提取数据方面会用到xPath以外,xPath也可以进行模拟用户操作,比如点击,输入等。通过使用JS模拟用户事件,可以实现一些动态页面的模拟操作。在继续阅读本文之前,如果不了解如何调试Javascript,如何使用Javascript定位HTML中的DOM元素,可以参考以下两篇文章:

Chrome – JavaScript调试技巧总结(浏览器调试JS)
JavaScript DOM查询,原生js实现元素子节点的获取

使用xPath和JS模拟用户输入操作

在动态页面中,比如搜索、翻页跳转,一般会用到用户输入关键字或者跳转到第几页的问题。这时就需要使用keyin操作。通过以下代码,可以使用JS实现模拟用户输入:

var renderObj =  document.evaluate("//input[@id='cpfxjg']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
renderObj.focus(); 
renderObj.value = '建信理财有限责任公司'; 
renderObj.blur(); 
renderObj.dispatchEvent(new Event("change")); 
renderObj.dispatchEvent(new Event("input"));

使用xPath和JS模拟用户点击操作

在动态页面中,用户点击事件用的情况也非常多,比如板块选择,排序选择等。这时就需要使用click操作。通过以下代码,可以使用JS实现模拟用户点击:

document.evaluate("//input[@class='searchBut']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();

在实际案例中,有些网站使用pointerevent处理click事件,因此就需要通过模拟PointerEvent事件达到点击效果。例如:

let ele = document.evaluate("//a[@data-value='Img_Count|1']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
let pointEvent = new PointerEvent('click');
ele.dispatchEvent(pointEvent);

使用xPath和JS模拟用户输入回车操作

有些网站中输入内容后,没有搜索按钮或者跳转按钮。而是用户直接收入回车进行输入和确认。这时就需要使用JS代码模拟用户输入回车操作。一般来说,用户按下回车分别会触发keydown、keyup、和keypress事件。一般的网站可能会捕获keypress事件,但是不同网站可能在实现方案上略有不同。因此,比较稳妥的方案是以上三种事件都尝试一下。或者为了更真是的模拟输入回车事件,三种事件都发出也是可以的。例如:

var valueEle = document.getElementsByClassName('lucidity_pgCurrentPage')[0]; 
var simulatedEvent = new KeyboardEvent('keydown', {key: 'Enter', code: 'Enter', keyCode:13, which: 13}); 
valueEle.dispatchEvent(simulatedEvent); 
var simulatedEvent = new KeyboardEvent('keyup', {key: 'Enter', code: 'Enter', keyCode:13, which: 13}); 
valueEle.dispatchEvent(simulatedEvent); 
var simulatedEvent = new KeyboardEvent('keypress', {key: 'Enter', code: 'Enter', keyCode:13, which: 13}); 
valueEle.dispatchEvent(simulatedEvent); 

参考:https://stackoverflow.com/questions/596481/is-it-possible-to-simulate-key-press-events-programmatically

Captain QR Code

扫码联系船长

发表回复

您的电子邮箱地址不会被公开。