整体爬取论坛页面流程图: Created with Raphaël 2.1.0 开始 输入关键字 得到关键字搜索页面 是否是应用页面 登陆,否则无法获得posttime 下载该页面,并获得tid和posttime 使用tid和posttime回复该页面 再次下载该页面并爬取apk下载链接 结束 yes no SpiderTrigger调用Spider工作流程分析: Created with Raphaël 2.1.0 开始 Sipder.setDownloader() Sipder.addUrl() addUrl()中调用addRequest(new Request(url)),以及signalNewUrl() Spider.thread(20),启动20个线程 run() Spider工作流程分析: Created with Raphaël 2.1.0 Spider.run() checkRunningStat()检测怕成是否在运行 initComponent() start 判断downloader是否存在,若为空则使用默认的HttpClientDownloader downloader.setThread(int thread) setThread()调用httpClientGenerator.setPoolSize(thread) 根据thread数目建立threadPool initComponent() End toDoQueue中取到一个request request是否为空 即toDoQueue为空 threadPool中是否是否 还有存活的thread break() waitNewUrl() 将request赋值给final量requestFinal threadPool启动线程 调用processRequest() request是否需要重试 rmRetryRequestFromQueue(page) extractAndAddRequests(page, true); sleep(site.getSleepTime()) apk=pageProcessor.process(page) extractAndAddRequests(page, spawnUrl) yes no yes no yes no SpiderTirgger Spider 与MyhttpClientDownloader交互的顺序图如下: Created with Raphaël 2.1.0 SpiderTrigger SpiderTrigger Spider Spider MyHttpClientDownloader MyHttpClientDownloader PageProcessor PageProcessor setDownloader() addUrl() thread(20) 启动20个Spider线程进行爬取 run() 开始执行线程 checkRunningStat() 检测爬虫是否在运行 initComponent() 检查或初始化downloader线程池等Component processRequest() 启动子线程调用processRequest()方法 downloader.download(request, Spider) ProcessRequest()调用downloader的download方法,此处为GET请求 下载,得到page return page rquest重试 如果request需要重试,首先应该从donePushQueue中移除 移除的元素就是队列头部的元素 sleep() process(page) 获得Apk 返回Apk Downloader中的download(),下载page的流程图如下: Created with Raphaël 2.1.0 downloader.download()开始 site=task.getSite()其中Site()是在 创建Spider对象时PagePro给的 以下使用httpClient进行页面的下载 getHttpUriRequest()获得HttpUriRequest -getHttpUriRequest()开始 调用selectRequestMethod()获得requestBuilder --selectRequestMethod()开始 String method = request.getMethod() 得到请求方式,若null则默认get 设置请求方式,并返回对应的requestBuilder --selectRequestMethod()结束 设置header 配置requestConfigBuilder 包括代理、超时等 将requestConfigBuilder传给requestBuilder -getHttpUriRequest()结束 得到httpUriReauest,设置请求头等并执行 得到httpResponse 成功,通过handleResponse()得到page 返回page