QtWebKit爬虫与去重规则
字数 1359 2025-08-18 11:37:11

QtWebKit爬虫开发与去重规则详解

1. 基于QtWebKit的爬虫概述

传统爬虫(如urllib2、requests)的局限性:

  • 无法解析JavaScript
  • 难以抓取AJAX请求和动态生成的内容
  • 对交互式网页支持有限

QtWebKit爬虫的优势:

  • 完整的浏览器内核,能解析JavaScript
  • 可捕获动态生成的内容和事件触发的请求
  • 适合漏洞扫描程序的需求

2. 核心类解析

2.1 QNetworkAccessManager类

功能:网络请求管理,监控和拦截所有浏览器请求

关键方法:

  • createRequest: 创建请求前记录URL、请求方式和数据
  • _finished: 请求完成后获取响应信息

重要代码实现:

# 绑定网络访问管理器
page.setNetworkAccessManager(manager)

# 获取返回状态
url = str(reply.url().toString())
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
status, ok = status.toInt()

2.2 QWebView类

功能:浏览器控件,处理页面加载和JavaScript执行

关键特性:

  • 需要自定义超时处理
  • 可修改浏览器环境(如禁用弹窗)
  • 可触发页面事件

重要实现:

def load(self, url):
    self.loop = QEventLoop()
    timer = QTimer()
    timer.setSingleShot(True)
    timer.timeout.connect(self._loadFinished)
    timer.start(self.timeout * 1000)
    super(Browser, self).load(url)
    self.loop.exec_()
    if timer.isActive():
        timer.stop()
    else:
        print "Request time out:" + str(url.url().toString())

3. 页面加载处理

3.1 加载前处理(_loadStarted)

禁用可能阻碍JavaScript执行的浏览器功能:

def _loadStarted(self):
    frame = self.page().mainFrame()
    frame.evaluateJavaScript("window.alert=function(){}")
    frame.evaluateJavaScript("window.confirm=function(){return true}")
    frame.evaluateJavaScript("window.prompt=function(){return 0}")
    frame.evaluateJavaScript("window.open=function(){}")

3.2 加载后处理(_loadFinished)

触发各种DOM事件以捕获动态内容:

def _loadFinished(self):
    self.loop.quit()
    frame = self.page().mainFrame()
    
    # 转换a标签href为onclick并触发
    frame.evaluateJavaScript('selectdom=document.querySelectorAll("a");for(var i=0;i<selectdom.length;i++){if(!selectdom[i].getAttribute("onclick")){selectdom[i].setAttribute("onclick",selectdom[i].getAttribute("href"))}}')
    
    # 触发各种事件处理器
    frame.evaluateJavaScript('selectdom=document.querySelectorAll("[onerror]");for(var i=0;i<selectdom.length;i++){try{selectdom[i].onerror();}catch(err){continue;}}')
    frame.evaluateJavaScript('selectdom=document.querySelectorAll("[onchange]");for(var i=0;i<selectdom.length;i++){try{selectdom[i].onchange();}catch(err){continue;}}')
    # 其他事件类型类似处理...

4. 高效去重规则

4.1 URL规范化处理

  1. 去除netloc部分
  2. 将所有数字替换为{{{int}}}
    • 示例:www.anquanke.com/post/id/85596www.anquanke.com/post/id/{{{int}}}

4.2 参数分析去重

数据结构:

{
    netloc: [
        {
            参数1名称: [参数1内容1, 参数1内容2,...],
            参数2名称: [参数2内容1,...]
        }
    ]
}

去重规则:

  • 当某参数的值种类超过10个,则认为该参数无效
  • 后续比较时忽略该参数差异

复杂示例处理:
原始URL: http://tieba.baidu.com/home/main?un=_0d9y&fr=index&red_tag=p280448481

  1. 数字替换后:
    http://tieba.baidu.com/home/main?un=_{{{int}}}d{{{int}}}y&fr=index&red_tag=p{{{int}}}

  2. 参数分析:

    • 如果un参数出现超过10种不同值,后续忽略该参数差异

5. 优化与实践建议

  1. 多进程架构:由于QtWebKit的page资源不能共享,建议使用多进程而非多线程

  2. 数据记录

    • 表单提交按钮信息(用于CSRF检测)
    • 请求方法、内容、状态码和Cookie
    • 响应头信息(用于检测重定向等漏洞)
  3. 反爬策略

    • 在QNetworkAccessManager中随机生成User-Agent
    • 实现请求间隔和重试机制
  4. 漏洞检测准备

    • 记录的数据可用于检测SQL注入、XSS、JSON劫持、404js等漏洞

6. 替代方案

文中提到Google的Headless Chrome也是可行的替代方案,具有类似的功能但可能性能表现不同。

7. 总结

QtWebKit爬虫通过完整的浏览器环境解决了传统爬虫无法处理JavaScript动态内容的问题,配合精心设计的去重规则,能够高效地抓取网页内容,特别适合漏洞扫描程序的需求。关键点在于合理利用QNetworkAccessManager和QWebView类,实现完整的请求监控和页面交互,并通过参数分析和URL规范化实现高效去重。

QtWebKit爬虫开发与去重规则详解 1. 基于QtWebKit的爬虫概述 传统爬虫(如urllib2、requests)的局限性: 无法解析JavaScript 难以抓取AJAX请求和动态生成的内容 对交互式网页支持有限 QtWebKit爬虫的优势: 完整的浏览器内核,能解析JavaScript 可捕获动态生成的内容和事件触发的请求 适合漏洞扫描程序的需求 2. 核心类解析 2.1 QNetworkAccessManager类 功能:网络请求管理,监控和拦截所有浏览器请求 关键方法: createRequest : 创建请求前记录URL、请求方式和数据 _finished : 请求完成后获取响应信息 重要代码实现: 2.2 QWebView类 功能:浏览器控件,处理页面加载和JavaScript执行 关键特性: 需要自定义超时处理 可修改浏览器环境(如禁用弹窗) 可触发页面事件 重要实现: 3. 页面加载处理 3.1 加载前处理(_ loadStarted) 禁用可能阻碍JavaScript执行的浏览器功能: 3.2 加载后处理(_ loadFinished) 触发各种DOM事件以捕获动态内容: 4. 高效去重规则 4.1 URL规范化处理 去除netloc部分 将所有数字替换为 {{{int}}} 示例: www.anquanke.com/post/id/85596 → www.anquanke.com/post/id/{{{int}}} 4.2 参数分析去重 数据结构: 去重规则: 当某参数的值种类超过10个,则认为该参数无效 后续比较时忽略该参数差异 复杂示例处理: 原始URL: http://tieba.baidu.com/home/main?un=_0d9y&fr=index&red_tag=p280448481 数字替换后: http://tieba.baidu.com/home/main?un=_{{{int}}}d{{{int}}}y&fr=index&red_tag=p{{{int}}} 参数分析: 如果 un 参数出现超过10种不同值,后续忽略该参数差异 5. 优化与实践建议 多进程架构 :由于QtWebKit的page资源不能共享,建议使用多进程而非多线程 数据记录 : 表单提交按钮信息(用于CSRF检测) 请求方法、内容、状态码和Cookie 响应头信息(用于检测重定向等漏洞) 反爬策略 : 在QNetworkAccessManager中随机生成User-Agent 实现请求间隔和重试机制 漏洞检测准备 : 记录的数据可用于检测SQL注入、XSS、JSON劫持、404js等漏洞 6. 替代方案 文中提到Google的Headless Chrome也是可行的替代方案,具有类似的功能但可能性能表现不同。 7. 总结 QtWebKit爬虫通过完整的浏览器环境解决了传统爬虫无法处理JavaScript动态内容的问题,配合精心设计的去重规则,能够高效地抓取网页内容,特别适合漏洞扫描程序的需求。关键点在于合理利用QNetworkAccessManager和QWebView类,实现完整的请求监控和页面交互,并通过参数分析和URL规范化实现高效去重。