Jak pobrać zawartość strony w trybie headless

Jak pobrać zawartość strony w trybie headless
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1599
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ę:

Kopiuj
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ę:

Kopiuj
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ł?

edytowany 1x, ostatnio: Riddle
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 godzin
  • Postów:4945
0

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


woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1599
0

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

DarekRepos
  • Rejestracja:prawie 3 lata
  • Ostatnio:4 dni
  • Postów:50
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

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 12 godzin
  • Postów:1599
0

Próbowałem też i tego i scrolowania

Kopiuj
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

edytowany 1x, ostatnio: Riddle
DarekRepos
  • Rejestracja:prawie 3 lata
  • Ostatnio:4 dni
  • Postów:50
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

Kopiuj
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)
edytowany 2x, ostatnio: DarekRepos
woolfik
dzięki zadziałało

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.