如何获取并点击动态加载网站的URL?

问题描述 投票:0回答:1

我想从链接中抓取马拉松结果(称为页面A):https://www.marathon.tokyo/2023/result/index.php

假设我在第一个选项中选择“马拉松男子”然后搜索,我会看到以下显示结果的网页(称为页面 B):

当我点击名字时,我就会看到每个运动员的成绩(C 页):

我的问题是,如何从A页面转到C页面?我可以毫无问题地从页面 C 抓取所需的数据。问题是从页面 A 到页面 B,获取指向各个结果条目(页面 C)的所有 URL,然后导航到页面 C。

要从页面 A 到页面 B,我有类似以下内容:

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url = 'https://www.marathon.tokyo/2023/result/index.php'

driver = webdriver.Chrome()
driver.get(url)

options = driver.find_elements(By.TAG_NAME, "option")

for option in options:
    if 'Marathon Men' in option.text:
        print(option.text)
        option.click() # click on the option 100
        break

它确实会自动选择正确的选项(马拉松男子),但我不知道如何单击“搜索”按钮。

要从页面 B 到 C,我在页面 B 时尝试以下代码:

raw_links = driver.find_elements(By.XPATH, '//a [@href]')
for link in raw_links:
    l = link.get_attribute("href")
    print("raw_link:{}".format(l))

我得到以下输出:

raw_link:javascript:page(2);
raw_link:javascript:page(3);
raw_link:javascript:page(4);
# and so on

同样,问题是我不知道如何将它们转换为可点击的 URL 并导航到它们。

任何帮助我开始的帮助将不胜感激。

javascript python selenium-webdriver web-scraping beautifulsoup
1个回答
0
投票

这将使您从初始页面开始,搜索 Marathon Men,找到每个跑步者页面的链接,然后打印链接的文本。您需要做的就是添加代码以单击链接并抓取您所说的已生成的跑步者页面。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.select import Select

url = 'https://www.marathon.tokyo/2023/result/index.php'
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

wait = WebDriverWait(driver, 10)
Select(wait.until(EC.visibility_of_element_located((By.ID, "category")))).select_by_value("1")
wait.until(EC.element_to_be_clickable((By.ID, "btn_submit"))).click()

runners = wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "table.mb10 td > a")))
for runner in runners:
    print(len(runners))
    print(runner.text)
© www.soinside.com 2019 - 2024. All rights reserved.