El modo sin cabeza (headless) de Selenium webdriver puede hacer que falte el contenido de las cookies, y la solución

El modo sin cabeza (headless) es una función impulsada por el navegador webdriver de Selenium, que permite que el navegador siga accediendo e interactuando con páginas web sin aparecer, lo cual es muy útil para ejecutar pruebas automatizadas o captura de red, porque la velocidad de operación es más rápida y consume menos recursos. .

Sin embargo, el autor descubrió que cuando se ejecuta en modo sin cabeza, el contenido de las cookies generadas por el navegador que visita ciertos sitios web puede ser ligeramente diferente del modo normal (modo sin cabeza). Porque algunos sitios web usan tecnología para detectar si están siendo visitados por un navegador sin cabeza y pueden responder configurando cookies diferentes o comportándose de manera diferente.

Para ilustrar esta diferencia, podemos ejecutar un experimento simple usando la biblioteca Selenium WebDriver en Python. Primero, crearemos dos instancias del navegador Chrome: una en modo sin interfaz y otra en modo normal:

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options


# 初始化无头模式(headless)的webdriver
options = Options()
options.add_argument('--headless')
driver_headless = webdriver.Chrome(options=options)
# 设置window.navigator.webdriver为false
driver_headless.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => False}) "})
# 打开一个网站,输出cookies
driver_headless.get('http://。。。。。。')
sleep(3)
cookies_headless = driver_headless.get_cookies()
keys_headless = set([cookie['name'] for cookie in cookies_headless])
driver_headless.quit()


# 初始化正常模式的webdriver
options2 = Options()
# 取消chrome受自动控制提示
options2.add_experimental_option('useAutomationExtension', False)
options2.add_experimental_option('excludeSwitches', ['enable-automation'])
driver_normal = webdriver.Chrome(options=options2)
# 设置window.navigator.webdriver为false
driver_normal.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => False}) "})
# 打开同一个网站,输出cookies
driver_normal.get('http://。。。。。。')
sleep(3)
cookies_normal = driver_normal.get_cookies()
keys_normal = set([cookie['name'] for cookie in cookies_normal])
driver_normal.quit()


# 两相比较
keys_only_in_headless = keys_headless - keys_normal
keys_only_in_normal = keys_normal - keys_headless

if keys_only_in_headless:
    print(f'无头模式(headless)多出来的Cookie名称是: {keys_only_in_headless}')
if keys_only_in_normal:
    print(f'正常模式多出来的Cookie名称是: {keys_only_in_normal}')
if not keys_only_in_headless and not keys_only_in_normal:
    print('无头模式和正常模式的cookies都一样。')

Captura de pantalla del resultado de ejecución:

Probé el enlace para visitar el mismo sitio web en modo headless y modo normal, y las cookies obtenidas son diferentes. A las cookies en modo sin cabeza les faltan dos elementos en comparación con el modo normal: AlteonP, JSessionID.

Mi operación de seguimiento es exportar el contenido de las cookies de selenio a la sesión de la biblioteca de solicitudes para su uso. Si usa la cookie en el modo sin cabeza y luego usa la obtención y publicación de la biblioteca de solicitudes para acceder al sitio web, un error se informará (aparecerá status_code 400, 403, 412 y otros códigos anormales).

Todos sabemos que la obtención y publicación de la biblioteca de solicitudes visita el enlace de un sitio web para obtener el contenido de la cookie es escasa. Solo el controlador web de Selenium puede abrir el sitio web para obtener cookies enriquecidas. Por lo tanto, es muy necesario exportar las cookies de las cookies de Selenium al pide biblioteca. Para permitir que el modo sin cabeza de Selenium también obtenga cookies en modo normal, aquí están mis dos soluciones:

1. Agregar agente de usuario

Inserte las siguientes dos líneas de código en la línea de opciones:

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'
options.add_argument(f'user-agent={user_agent}')

Tal vez todos, como yo, piensen que el controlador web de Selenium viene automáticamente con el agente de usuario sin agregarlo repetidamente. Pero lo que es inesperado es que al visitar algunos sitios web en modo sin cabeza, el sitio web seguirá detectando que el selenio se está rastreando, por lo que el contenido de las cookies proporcionadas es muy pequeño, que es casi el mismo que el de las cookies obtenidas por solicitud. Entonces, después de intentar agregar manualmente el agente de usuario, el contenido de las cookies obtenidas en modo sin cabeza se vuelve más rico.Este método parece anticuado, pero funciona muy bien.

2. Establecer el tamaño de la ventana del navegador

Si la primera solución no funciona, intente configurar el tamaño de la ventana del navegador. Aunque el navegador es invisible en modo sin cabeza, es posible ocultarse de la detección de algunos sitios web configurando el tamaño de la ventana.

options.add_argument("--window-size=1920,1050") 

A continuación, puede exportar cookies de Selenium para solicitudes.

from requests.cookies import RequestsCookieJar

cookies = driver.get_cookies()
jar = RequestsCookieJar()
for cookie in cookies:
    jar.set(cookie['name'], cookie['value'])

se = requests.Session()
se.cookies = jar
se.headers.update({'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'})

res = se.get('http://。。。。。。', headers=headers)
assert res.status_code==200
res.encoding = 'utf-8'
print(res.text)

Supongo que te gusta

Origin blog.csdn.net/Scott0902/article/details/129384085
Recomendado
Clasificación