python3 + webdriver, page_source無法獲取源碼等問題

在嘗試抓取某眼查,配置chrome options時候,如果添加了headless則拿不到源碼.而不加就可以.

不加(無頭模式)的源碼:

<html><head><title>403 Forbidden</title></head>
<body bgcolor="white">
<h1>403 Forbidden</h1>
<p>You don't have permission to access the URL on this server.</p><hr>Powered by Tengine

</body></html>

出現問題的原因: 前端加強了對瀏覽器各項特徵和屬性的檢測, 以下列出被檢測爲非法爬蟲的幾種可能

除去 User-Agent/Cookie/Referer等一些常規檢測外

 

第一種: 直接對headless判斷. 

if (/HeadlessChrome/.test(window.navigator.userAgent)) {
    console.log("Chrome headless detected");
}

 

第二種: 插件判斷

navigator.plugins 會返回一個數組,裏面是當前瀏覽器裏的插件信息。通常,普通Chrome瀏覽器有一些缺省插件,比如 Chrome PDF viewer 或 Google Native Client。相反,在無頭模式裏,沒有任何插件,返回的是個空數組。

if(navigator.plugins.length == 0) {
    console.log("It may be Chrome headless");
}

 

第三種: 語言判斷

在谷歌瀏覽器裏,有兩個JavaScript屬性可以獲取當前瀏覽器的語言設置: navigator.language 和 navigator.languages。頭一個是指瀏覽器界面的語言,後一個返回的是個數組,裏面存儲的是瀏覽器用戶的所有次選語言。然而,在無頭模式裏,navigator.languages 返回的是個空字符串。

if(navigator.languages == "") {
    console.log("Chrome headless detected");
}

 

第四種: WebGL 對照

WebGL 提供了一組能在HTML canvas 裏執行3D渲染的API。通過這些API,我們可以查詢出圖形驅動的 vendor 和 renderer 。 在linux上的普通谷歌瀏覽器裏,我們獲得的 renderer 和 vendor 值爲: “Google SwiftShader” 和 “Google Inc.”。 而在無頭模式裏,我們獲得的一個是 “Mesa OffScreen”——它是沒有使用任何 window 系統的渲染技術的名稱,和 “Brian Paul” ——開源 Mesa 圖形庫的最初的程序。並不是所有版本的無頭瀏覽器都有同樣的這兩個值。然而目前在無頭瀏覽器裏是“Mesa Offscreen” 和 “Brian Paul” 這兩個值。

var canvas = document.createElement('canvas');
var gl = canvas.getContext('webgl');

var debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
var vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
var renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);

if(vendor == "Brian Paul" && renderer == "Mesa OffScreen") {
    console.log("Chrome headless detected");
}

 

第五種: 瀏覽器檢測

Modernizr 可以探測出當前瀏覽器對HTML和CSS各種特性的支持程度。普遍的,無頭模式下Chrome沒有 hairline 特徵。

if(!Modernizr["hairline"]) {
    console.log("It may be Chrome headless");
}

如果能規避以上幾種檢測, 相信次問題將會迎刃而解.

前端的檢測方法來源於: 某位大佬

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章