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规范化处理
- 去除netloc部分
- 将所有数字替换为
{{{int}}}- 示例:
www.anquanke.com/post/id/85596→www.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
-
数字替换后:
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规范化实现高效去重。