Python Selenium for Chrome)の_--headless
_モードについて質問があります。
コード
_ from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
CHROME_DRIVER_DIR = "Selenium/chromedriver"
chrome_options = webdriver.ChromeOptions()
caps = DesiredCapabilities().CHROME
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--remote-debugging-port=9222")
chrome_options.add_argument("--headless") # Runs Chrome in headless mode.
chrome_options.add_argument('--no-sandbox') # # Bypass OS security model
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--disable-gpu")
browser = webdriver.Chrome(desired_capabilities=caps, executable_path=CHROME_DRIVER_DIR, options=chrome_options)
browser.get("https://www.manta.com/c/mm2956g/mashuda-contractors")
print(browser.page_source)
browser.quit()
_
chrome_options.add_argument("--headless")
を削除すると、すべて正常に機能しますが、これにより_--headless*
_は次の問題を取得します
_Please enable cookies.
Error 1020 Ray ID: 53fd62b4087d8116 • 2019-12-04 11:19:28 UTC
Access denied
What happened?
This website is using a security service to protect itself from online attacks.
Cloudflare Ray ID: 53fd62b4087d8116 • Your IP: 168.81.117.111 • Performance & security by Cloudflare
_
通常モードと_--headless
_の違いは何ですか?
私はあなたのコードを取り、オプションの引数を削除し、いくつかの引数を追加して、次のようにテストを実行しました。
コードブロック:
from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_argument("--headless")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://www.manta.com/c/mm2956g/mashuda-contractors")
print(driver.page_source)
driver.quit()
コンソール出力:
<html class="js" lang="en-US" style="opacity: 1; visibility: visible;"><!--<![endif]--><head>
<title>Access denied | www.manta.com used Cloudflare to restrict access</title>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="robots" content="noindex, nofollow">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1">
<link rel="stylesheet" id="cf_styles-css" href="/cdn-cgi/styles/cf.errors.css" type="text/css" media="screen,projection">
<!--[if lt IE 9]><link rel="stylesheet" id='cf_styles-ie-css' href="/cdn-cgi/styles/cf.errors.ie.css" type="text/css" media="screen,projection" /><![endif]-->
<style type="text/css">body{margin:0;padding:0}</style>
<!--[if gte IE 10]><!--><script type="text/javascript" src="/cdn-cgi/scripts/zepto.min.js"></script><!--<![endif]-->
<!--[if gte IE 10]><!--><script type="text/javascript" src="/cdn-cgi/scripts/cf.common.js"></script><!--<![endif]-->
</head>
<body>
<div id="cf-wrapper">
<div class="cf-alert cf-alert-error cf-cookie-error" id="cookie-alert" data-translate="enable_cookies">Please enable cookies.</div>
<div id="cf-error-details" class="cf-error-details-wrapper">
<div class="cf-wrapper cf-header cf-error-overview">
<h1>
<span class="cf-error-type" data-translate="error">Error</span>
<span class="cf-error-code">1020</span>
<small class="heading-ray-id">Ray ID: 53fd7c2fca12d5fc • 2019-12-04 11:36:52 UTC</small>
</h1>
<h2 class="cf-subheadline">Access denied</h2>
</div><!-- /.header -->
<section></section><!-- spacer -->
<div class="cf-section cf-wrapper">
<div class="cf-columns two">
<div class="cf-column">
<h2 data-translate="what_happened">What happened?</h2>
<p>This website is using a security service to protect itself from online attacks.</p>
</div>
</div>
</div><!-- /.section -->
<div class="cf-error-footer cf-wrapper">
<p>
<span class="cf-footer-item">Cloudflare Ray ID: <strong>53fd7c2fca12d5fc</strong></span>
<span class="cf-footer-separator">•</span>
<span class="cf-footer-item"><span>Your IP</span>: 123.201.54.43</span>
<span class="cf-footer-separator">•</span>
<span class="cf-footer-item"><span>Performance & security by</span> <a href="https://www.cloudflare.com/5xx-error-landing?utm_source=error_footer" id="brand_link" target="_blank">Cloudflare</a></span>
</p>
</div><!-- /.error-footer -->
</div><!-- /#cf-error-details -->
</div><!-- /#cf-wrapper -->
<script type="text/javascript">
window._cf_translation = {};
</script>
</body></html>
抽出されたページソースから、--headless
引数を使用して、次のページにアクセスします。
Browsing ContextieChrome Browserセッションが[〜#〜] bot [〜#〜]およびナビゲーションはblocked 。
あなたはいくつかの関連する議論を見つけることができます:
Cloudflareはボットをブロックすることを目的としています。彼らはヘッドレスブラウザがデータスクレイパーによって使用されていると想定しているため、それをブロックしています。 Cloudflareから データスクレイピングとは
*ヘッドレスブラウザーは、ChromeまたはFirefoxによく似たタイプのWebブラウザーですが、デフォルトでは視覚的なユーザーインターフェースがなく、通常のWebブラウザーよりもはるかに高速に移動できます本質的にコマンドラインのレベルで実行することにより、ヘッドレスブラウザーはWebアプリケーション全体のレンダリングを回避できます。データスクレイパーは、スクレイピングされている各ページを人間が見ることがないため、ヘッドレスブラウザーを使用してデータをより速く要求するボットを作成します。
このサーバー側スクリプトを使用してテストしました。
_<?php
echo "<pre><code>";
var_dump($_SERVER);
echo "</code></pre>";
?>
<script>
var el = document.getElementsByTagName('code')[0];
for(var prop in window.navigator){
var str = JSON.stringify(window.navigator[prop])
el.innerHTML = el.innerHTML + "window.navigator." + prop + " = " + str + "\n";
}
var skip_props = ['parent', 'top', 'frames', 'self', 'window'];
for(var prop in window){
if (skip_props.indexOf(prop) > -1) { continue; }
el.innerHTML = el.innerHTML + "window." + prop + " = ";
var str = JSON.stringify(window[prop])
el.innerHTML = el.innerHTML + str + "\n";
}
</script>
_
このページは、_--headless
_を使用して、または使用せずにChromeDriverを使用してロードし、print(driver.find_element_by_tag_name('code').text)
を使用して出力を印刷しました。次に、両方の出力を比較しました。
これが私が見つけた違いです:
Accept-Language
_ヘッダー:_en-US,en;q=0.9
_ vs _en-US
_User-Agent
_ヘッダー:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
vs Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/83.0.4103.61 Safari/537.36
(2番目の文字列のHeadlessChrome
の言及に注意してください。)window.navigator.plugins
_:_{"0":{"0":{}},"1":{"0":{}},"2":{"0":{},"1":{}}}
_ vs _{}
_window.navigator.mimeTypes
_:_{"0":{},"1":{},"2":{},"3":{}}
_ vs _{}
_window.outerWidth
_:_1367
_ vs _0
_window.outerHeight
_:_641
_ vs _0
_注意:Python投稿したスクリプトでは、_window.webdriver
_プロパティを削除するための数行が欠落しています(これがないと、サーバーが使用していることをサーバーが検出するのは簡単です) WebDriver)[ ref ]:
_driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
_