經過研究,發現網頁統計瀏覽量主要是根據ip地址和cookie中的緩存,並且網站都會做防刷,
它會判斷url的來源,如:
來源URL:Request.UrlReferrer
瀏覽器類型:Request.UserAgent
遠程客戶端的DNS:Request.UserHostName
所以用httpclient去訪問頁面時,還要把userAgent修改一下,當然緊緊是修改userAgent是不行的,瀏覽器訪問網頁得到html,需要解析:
- 根據資源類型決定如何處理(假設資源為HTML文檔)
- 解析HTML文檔,構件DOM樹,下載資源,構造CSSOM樹,執行js腳本,這些操作沒有嚴格的先后順序,以下分別解釋
- 構建DOM樹:
- Tokenizing:根據HTML規范將字符流解析為標記
- Lexing:詞法分析將標記轉換為對象並定義屬性和規則
- DOM construction:根據HTML標記關系將對象組成DOM樹
- 解析過程中遇到圖片、樣式表、js文件,啟動下載
- 構建CSSOM樹:
- Tokenizing:字符流轉換為標記流
- Node:根據標記創建節點
- CSSOM:節點創建CSSOM樹
- 根據DOM樹和CSSOM樹構建渲染樹:
- 從DOM樹的根節點遍歷所有可見節點,不可見節點包括:1)
script
,meta
這樣本身不可見的標簽。2)被css隱藏的節點,如display: none
- 對每一個可見節點,找到恰當的CSSOM規則並應用
- 發布可視節點的內容和計算樣式
- 從DOM樹的根節點遍歷所有可見節點,不可見節點包括:1)
- js解析如下:
- 瀏覽器創建Document對象並解析HTML,將解析到的元素和文本節點添加到文檔中,此時document.readystate為loading
- HTML解析器遇到沒有async和defer的script時,將他們添加到文檔中,然后執行行內或外部腳本。這些腳本會同步執行,並且在腳本下載和執行時解析器會暫停。這樣就可以用document.write()把文本插入到輸入流中。同步腳本經常簡單定義函數和注冊事件處理程序,他們可以遍歷和操作script和他們之前的文檔內容
- 當解析器遇到設置了async屬性的script時,開始下載腳本並繼續解析文檔。腳本會在它下載完成后盡快執行,但是解析器不會停下來等它下載。異步腳本禁止使用document.write(),它們可以訪問自己script和之前的文檔元素
- 當文檔完成解析,document.readState變成interactive
- 所有defer腳本會按照在文檔出現的順序執行,延遲腳本能訪問完整文檔樹,禁止使用document.write()
- 瀏覽器在Document對象上觸發DOMContentLoaded事件
- 此時文檔完全解析完成,瀏覽器可能還在等待如圖片等內容加載,等這些內容完成載入並且所有異步腳本完成載入和執行,document.readState變為complete,window觸發load事件
- 顯示頁面(HTML解析過程中會逐步顯示頁面)
所以簡單獲取到html,只能稱為簡單的爬蟲,例如博客園網站,計算瀏覽量方法不是一個url請求就能算瀏覽,還需要把html解析得到的url請求完。
解決這個問題,想到兩個方法:
(1)寫個批處理,先設置瀏覽器的代理服務器,再自動啟動瀏覽器,然后在關閉 瀏覽器。
(2)將通過httpclient 爬到的html,解析,將所有資源都訪問一遍。
先說第一種方法:
批處理如下,讓Runtime這個類去執行:
cd \
C:
cd Users\jsonzb\AppData\Local\Google\Chrome\Application
chrome "https://www.cnblogs.com/fangxiaoneng/p/8302407.html"
執行批處理文件:Runtime.getRuntime().exec("Chrome.bat")
關閉瀏覽器:Runtime.getRuntime().exec("taskkill /f /im chrome.exe") 瀏覽器對同域名連接有最大限制,而http1.1的connection都是keep—alive
代理設置用com.alibaba.b2b.qa.browsers.compare.Browser這個類完成
經過測試可行,
測試過程:
1.我的chrome.bat
2.執行chrome
3.自動彈出瀏覽器訪問url
4.結果:我的瀏覽器ip是,183.208.20.54,而模擬服務器最后得到的是代理服務器的ip,說明這種方式可以
第二種方法:waiting..........