Python webScraping - Betclic URL's

Python webScraping - Betclic URL's

编辑:
所以我找到了一种方法,通过单击“国家/地区”元素来实现,请参阅我的答案。
还有一个问题可以使这个更好:
当我在一个国家 <li> 上执行 scrollIntoView(true) 时,它进入另一个元素 (<div class="sportList_subtitle">Desportos</div>) 并且不可点击。

是否有一些 javascript 或像“scrollIntoClickable”这样的 selenium 函数?

原文:
我正在尝试使用 python 和 BeautifulSoup + Selenium 从 Betclic 网站抓取信息。
鉴于每个游戏的 URL 具有结构:“域”/“sports_url”/“competition_url”/“match_url”
示例:https://www.betclic.pt/futebol-s1/liga-dos-campeoes-c8/rennes-chelsea-m2695669
您可以尝试使用您的语言,他们翻译实际的 URL 字符串,但结构和 ID 是相同的。 唯一剩下的就是抓住所有不同的“competition_url”

所以我现在的问题是来自“sports_url”(https://www.betclic.pt/futebol-s1)我怎样才能得到所有子“competition_url”?
问题出在左侧面板上每个国家/地区名称下方的“隐藏”URL。只有在您单击每个国家/地区名称旁边的箭头后,它们才会出现,就像一个下拉列表。单击事件实际上为该国家/地区的 <li> 添加了一个 class“处于活动状态”,并且 <li> 末尾的 <ul>。这是添加的 <ul>,其中包含我要获取的 URL 的列表。

点击前代码:

<!---->
<li class="sportList_item has-children ng-star-inserted" routerlinkactive="active-link" id="rziat-DE">
    <div class="sportList_itemWrapper prebootFreeze">
        <div class="sportlist_icon flagsIconBg is-DE"></div>
        <div class="sportlist_name">Alemanha</div>
    </div>
<!---->
</li>

点击后的代码(为演示而缩减):

<li class="sportList_item has-children ng-star-inserted is-active" routerlinkactive="active-link" id="rziat-DE">
    <div class="sportList_itemWrapper prebootFreeze">
        <div class="sportlist_icon flagsIconBg is-DE"></div>
        <div class="sportlist_name">Alemanha</div>
    </div>

    <!---->
    <ul class="sportList_listLv2 ng-star-inserted">
    <!---->
        <li class="sportList_item ng-star-inserted" routerlinkactive="active-link">
            <a class="sportList_itemWrapper prebootFreeze" id="competition-link-5" href="/futebol-s1/alemanha-bundesliga-c5">
                <div class="sportlist_icon"></div>
                <div class="sportlist_name">Alemanha - Bundesliga</div>
            </a>
        </li>(...)
        </li>(...)
        </li>(...)
        </li>
    </ul>
</li>

在此示例中,我要查找的是“/futebol-s1/alemanha-bundesliga-c5”。
有没有办法获得所有这些 URL?还是“隐藏”<ul>
也许是一种模拟点击并再次解析 HTML 代码的方法?

提前致谢!

所以我找到了一种通过单击“国家/地区”元素来完成此操作的方法。
还有一个问题可以使这个更好:
当我在一个国家 <li> 上执行 scrollIntoView(true) 时,它进入另一个元素 (<div class="sportList_subtitle">Desportos</div>) 并且不可点击。

是否有一些 javascript 或像“scrollIntoClickable”这样的 selenium 函数?

我现在做的怎么样:

driver = webdriver.Chrome(ChromeDriverManager().install())
url = "https://www.betclic.pt/"
driver.get(url)

link_set = set()
all_sports = driver.find_element_by_css_selector(
    ("body > app-desktop > div.layout > div > app-left-menu > div >"
    " app-sports-nav-bar > div > div:nth-child(2) > ul")
    ).find_elements_by_tag_name("li")
try:
    cookies = driver.find_element_by_css_selector("body > app-desktop > bc-gb-cookie-banner > div > div > button")
    cookies.click()
except:
    print("Cookie error or not found...")

for sport in all_sports:
    sport.click()
    has_container = driver.find_element_by_tag_name("app-block-ext").size.get('height')>0
    if not has_container:
        for competition in driver.find_elements_by_css_selector("a[id*='block-link-']"):
            link_set.add(competition.get_attribute("href"))
            driver.execute_script("arguments[0].scrollIntoView(true);", competition)
    else:
        driver.execute_script("arguments[0].scrollIntoView(true);", driver.find_element_by_tag_name("app-block-ext"))
        all_countries = driver.find_elements_by_css_selector("li[id^='rziat']")
        for country in all_countries:
            country.click()
            competitions = driver.find_elements_by_css_selector("a[id^='competition-link']")
            for element in competitions:
                link_set.add(element.get_attribute("href"))
            driver.execute_script("arguments[0].scrollIntoView(true);", country)

for link in sorted(link_set):
    print(link)