klren0312 / ZSpider

基于Electron爬虫程序
https://www.bilibili.com/video/av78349186/
54 stars 18 forks source link

通过窗口选取爬取元素 #18

Open klren0312 opened 3 years ago

klren0312 commented 3 years ago

窗口植入自定义的js https://www.electronjs.org/docs/latest/api/web-contents#contentsexecutejavascriptcode-usergesture

childWindow.webContents.loadURL('http://localhost:8080')
childWindow.webContents.executeJavaScript(`
    const script = document.createElement('script')
    script.src = 'https://cdn.bootcdn.net/ajax/libs/eruda/2.4.1/eruda.min.js'
    document.head.appendChild(script)
    setTimeout(() => {
      const script2 = document.createElement('script')
      script2.innerText = 'eruda.init()'
      document.head.appendChild(script2)
    }, 3000)
  `, true)
    .then((result) => {
      console.log(result) // Will be the JSON object from the fetch call
    })
klren0312 commented 2 years ago

最新调研结果, 修改了chobitsu库, 支持点选获取css选择器

window.ipcRenderer = require('electron').ipcRenderer
window.onload = () => {
  const chobitsu = require('z-chobitsu')
  console.log(chobitsu)
  chobitsu.setOnMessage(message => {
    message = JSON.parse(message)
    switch (message.method) {
      case 'Overlay.nodeHighlightRequested':
        break
      case 'Overlay.inspectNodeRequested':
        let nodeId = null
        if (message.params.nodeId) {
          nodeId = message.params.nodeId
        } else if (message.params.backendNodeId) {
          nodeId = message.params.backendNodeId
          message.params.nodeId = message.params.backendNodeId
        }
        const dom = chobitsu.domain('DOM').getNodeByNodeId(nodeId)
        const selector = chobitsu.domain('CSS').getCssSelectorForNode(message.params)
        console.log(dom)
        console.log(selector)
        break
    }
  })
  chobitsu.domain('Overlay').enable()
  chobitsu.domain('Overlay').setInspectMode({
    highlightConfig: {
      showInfo: false,
      contentColor: 'rgba(111, 168, 220, .66)',
      paddingColor: 'rgba(147, 196, 125, .55)',
      borderColor: 'rgba(255, 229, 153, .66)',
      marginColor: 'rgba(246, 178, 107, .66)',
    }
  })
}