Jak pobrać zawartość strony w trybie headless

0

Witajcie,

Mam kawałek kodu w pythonie w oparciu o bs4 i selenium (chromium) pobierający jakaś tam zawartość strony. Na większości stron działa mi to porawnie ALE jedna ze stron działa
tylko gdy wyrzucę opcję:

chrome_options.add_argument("--headless")

co przekłada się na otwieranie chroma fizycznie przed oczami użytkownika. Normalnie mi to nie robi problemu ale chciałem kod przenieść na linuxa i tu jest problem bo nie da się otworzyć przeglądarki w konsoli natomiast w trybie headless dostaję:

Timeout: Message: 
Stacktrace:
	GetHandleVerifier [0x00007FF77B065E42+3538674]
	(No symbol) [0x00007FF77AC84C02]
	(No symbol) [0x00007FF77AB35AEB]
	(No symbol) [0x00007FF77AB7BF4E]
	(No symbol) [0x00007FF77AB7C0CC]
	(No symbol) [0x00007FF77ABBE477]
	(No symbol) [0x00007FF77AB9F0EF]
	(No symbol) [0x00007FF77ABBBDE3]
	(No symbol) [0x00007FF77AB9EE53]
	(No symbol) [0x00007FF77AB6F514]
	(No symbol) [0x00007FF77AB70631]
	GetHandleVerifier [0x00007FF77B096CAD+3738973]
	GetHandleVerifier [0x00007FF77B0EC506+4089270]
	GetHandleVerifier [0x00007FF77B0E4823+4057299]
	GetHandleVerifier [0x00007FF77ADB5C49+720121]
	(No symbol) [0x00007FF77AC9126F]
	(No symbol) [0x00007FF77AC8C304]
	(No symbol) [0x00007FF77AC8C432]
	(No symbol) [0x00007FF77AC7BD04]
	BaseThreadInitThunk [0x00007FFE76DE257D+29]
	RtlUserThreadStart [0x00007FFE77CEAA58+40]

Jakiś pomysł?

0

A nie możesz zassać html'a zwyczajnie?

0

No wlasnie z headless zwraca mu pustego html stąd problem

0

Może jakiś element strony jest dynamiczny i trzeba wywołać WebDriverWait tak jak tu:

https://stackoverflow.com/questions/75200764/cant-run-chrome-in-headless-mode-using-selenium

0

Próbowałem też i tego i scrolowania

chrome_options = Options()
#chrome_options.add_argument("--headless")
url = f'https://announcements.bybit.com/?page=1&category='
with webdriver.Chrome(options=chrome_options) as driver:
  driver.get(url)

  driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
  try:
    element_present = ec.presence_of_element_located((By.CLASS_NAME, 'article-item-content'))
    WebDriverWait(driver, 5).until(element_present)
  except Exception as e:
    print(f"Timeout: {e}")
    logging.error(e)
    exit(1)

  page_source = driver.page_source

  soup = BeautifulSoup(page_source, 'html.parser')

  class_pattern = re.compile(r'article-item-content')

i jeśli odkomentuję chrome_options.add_argument("--headless") to wali błędem z pierwszego posta

4

hmm sprawdzilem ten kod i wyglada na to jakby ta strona wykrywała selenium z headless mode. Spróbowałem wiec użyć useragent przez użycie options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36") no i cos wtedy wypluwa może to zadziała

a to kompletny skrypt co mi zadziałał. Może to pomoże. Dodałem też opóżnienie skryptu ( time.sleep(1) ), choc i bez tego działa

import logging
import re
from bs4 import BeautifulSoup
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.common.exceptions import TimeoutException, NoSuchElementException

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
)

url = f"https://announcements.bybit.com/?page=1&category="
with webdriver.Chrome(options=chrome_options) as driver:
    driver.get(url)
    time.sleep(1)
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try:
        element_present = ec.presence_of_element_located(
            (By.CLASS_NAME, "article-item-content")
        )
        WebDriverWait(driver, 10).until(element_present)
    except TimeoutException as te:
        print(f"Timeout: {te}")
        logging.error(f"Timeout: {te}")
        exit(1)
    except NoSuchElementException as nse:
        print(f"Element not found: {nse}")
        logging.error(f"Element not found: {nse}")
        exit(1)
    except Exception as e:
        print(f"Other error occurred: {e}")
        logging.error(f"Other error occurred: {e}")
        exit(1)

    page_source = driver.page_source

    soup = BeautifulSoup(page_source, "html.parser")

    class_pattern = re.compile(r"article-item-content")
    print(soup)

1 użytkowników online, w tym zalogowanych: 0, gości: 1