nyfok
2019-07-10 11:20:28 +08:00
你好,实现原理如下:
1、自己使用微软的 webbrowser 封装一个浏览器,并自定义鼠标右键事件。
2、当点击鼠标右键的时候,可以将右键事件对应的网页节点元素取出,包括节点的完整 html,以及节点的前一节点、后一节点、及父节点信息。
3、基于第 2 步骤获得的节点信息,再 htmlagility 的 document 寻找到对应节点,并获得 xpath。为什么要这么做,因为以后抓取的时候都是用 htmlagility 来解析 html document 和 xpath,这样性能才有保障。如果都 webbrowser 来加载页面,再解析,性能会很低。另外,webbrowser 的 html 都是经过处理过的 html,所以 xpath 和源网页可能会有差异,所以要将 webbrowser 的 node 信息转换为 htmlagility 的 node 信息。
4、日后抓取中,使用第 3 步的 xpath 信息即可取出对应的节点。
备注:
1、xpath 解析和寻找节点,不一定适用 htmlagility,因为这个对 document 的 xml 结构化要求比较高,可以自己尝试动手写一个。
2、建议对 xpath 进行一些扩展,包含上如 node id,node classname 等一些信息,这样会提高节点定位准确性。诸如:/html/body/div[id="MainContent" class="Main"]/span[id="PostTime"]
3、建议对 xpath 进行一些扩展,包含节点序号。譬如某个 span 节点,是父节点下第 2 个节点,可以书写如下:/html/body/div[id="MainContent" class="Main"]/span[2].
4、xpath 如果只用 full path,即从根节点 html 到节点的完整路径,有时候不能够很好的对抗对方网页的改版。所以可以将代码优化,支持相对路径的 xpath,而不是完整 xpath。譬如://div[id="MainContent" class="Main"]/span[id="PostTime"]
这个工具现在还不能开源,因为该工具也被应用到了别的商业项目中,要拆分出来还得需要花比较多的时间,暂时还没时间来弄这件事情。以上的信息,你可以借鉴来开发。