开发爬虫最基本的技能就是通过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
扫码联系船长