為了訓練我的 Python 技能,我嘗試從“Arbeitsagentur”(https://www.arbeitsagentur.de/jobsuche/)的網路存在中洗掉特定給定作業的空缺職位數量。我使用firefox瀏覽器的web-developer檢查工具從包含資訊的專案中提取文本,例如“12.231 Jobs für Informatiker/in”。我的代碼:
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait
content = "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Informatiker/in"
options = Options()
options.add_argument('--headless')
driver = webdriver.Firefox(executable_path="C:/Drivers/geckodriver/geckodriver.exe", options=options)
driver.get(content)
soup = BeautifulSoup(driver.page_source, 'html.parser')
num_jobs = soup.select_one('div[] h2')
print(num_jobs)
driver.close()
結果,我提取了正確的行,但它不包括查詢的資訊。翻譯成英文我得到這個輸出:
<h2 _ngcontent-serverapp-c39="" class="h6" id="suchergebnis-h1-anzeige">Jobs for Informatiker/in are loaded</h2>
在 Firefox 的網路檢查器中,我看到的是:
<h2 id="suchergebnis-h1-anzeige" class="h6" _ngcontent-serverapp-c39="">
12.231 Jobs für Informatiker/in</h2>
我嘗試了 WebDriverWait 方法和 driver.implicitly_wait() 等到網頁完全加載但沒有成功。可能這個值是由 js-script(?) 計算和插入的。因為我不是網路開發人員,所以我不知道這是如何作業的,也不知道如何正確提取給定數量的作業。我嘗試使用 firefox 開發人員工具的除錯器來查看值的計算位置/方式。但大多數腳本只是非常神秘的單行字。
(通過正則運算式從字串/文本行中提取數字/值完全沒有問題)。
我真的很感謝您的支持或任何有用的提示。
uj5u.com熱心網友回復:
由于內容是動態加載的,因此number of job result只有在某個元素可見后才能決議,在這種情況下,所有元素都將被加載,您可以成功決議所需的資料。
您還可以增加睡眠時間以加載所有資料,但這是一個糟糕的解決方案。
作業代碼 -
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
# options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1920x1080")
options.add_argument("--disable-extensions")
chrome_driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install()),
options=options
)
def arbeitsagentur_scraper():
URL = "https://www.arbeitsagentur.de/jobsuche/suche?angebotsart=1&was=Informatiker/in"
with chrome_driver as driver:
driver.implicitly_wait(15)
driver.get(URL)
wait = WebDriverWait(driver, 10)
# time.sleep(10) # increase the load time to fetch all element, not advised solution
# wait until this element is visible
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.liste-container')))
elem = driver.find_element(By.XPATH,
'/html/body/jb-root/main/jb-jobsuche/jb-jobsuche-suche/div[1]/div/jb-h1zeile/h2')
print(elem.text)
arbeitsagentur_scraper()
輸出 -
12.165 Jobs für Informatiker/in
uj5u.com熱心網友回復:
或者,您可以使用他們的 API URL 來加載結果。例如:
import json
import requests
api_url = "https://rest.arbeitsagentur.de/jobboerse/jobsuche-service/pc/v4/jobs"
query = {
"angebotsart": "1",
"was": "Informatiker/in",
"page": "1",
"size": "25",
"pav": "false",
}
headers = {
"OAuthAccessToken": "eyJhbGciOiJIUzUxMiJ9.eyAic3ViIjogIklkNFZSNmJoZFpKSjgwQ2VsbHk4MHI4YWpkMD0iLCAiaXNzIjogIk9BRyIsICJpYXQiOiAxNjU0MDM2ODQ1LCAiZXhwIjogMS42NTQwNDA0NDVFOSwgImF1ZCI6IFsgIk9BRyIgXSwgIm9hdXRoLnNjb3BlcyI6ICJhcG9rX21ldGFzdWdnZXN0LCBqb2Jib2Vyc2Vfc3VnZ2VzdC1zZXJ2aWNlLCBhYXMsIGpvYmJvZXJzZV9rYXRhbG9nZS1zZXJ2aWNlLCBqb2Jib2Vyc2Vfam9ic3VjaGUtc2VydmljZSwgaGVhZGVyZm9vdGVyX2hmLCBhcG9rX2hmLCBqb2Jib2Vyc2VfcHJvZmlsLXNlcnZpY2UiLCAib2F1dGguY2xpZW50X2lkIjogImRjZGVhY2JkLTJiNjItNDI2MS1hMWZhLWQ3MjAyYjU3OTg0OCIgfQ.BBkJbJ93fGqQQQGX4-VTzX8P6Twg8Rthq8meXV2WY_CoUmXQWhdgbjkFozP2BJXooSr7yLaTJr7JXEk8hDnCWA",
}
data = requests.get(api_url, params=query, headers=headers).json()
# uncomment to print all data:
# print(json.dumps(data, indent=4))
print(data["maxErgebnisse"])
印刷:
12165
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/484309.html
