【问题标题】:Pagination for BeautifulSoup with Selenium in python webscraping在 python webscraping 中使用 Selenium 对 BeautifulSoup 进行分页
【发布时间】:2021-11-01 06:55:32
【问题描述】:

我是 Webscraping 的新手,因此也是 bs4 和 selenium 的新手。我能够从Olympics medalist's page 的表中检索数据。但我不知道如何从其余页面获取数据,因为不会根据页面更新它的 url(基于我通过的初始教程)。

我想知道在这种情况下如何循环浏览页面。

编辑: 感谢所有的答案。每个答案都为我增加了一个概念,可以以不同的方式从网站获取数据。谢谢。

【问题讨论】:

标签: python selenium selenium-webdriver web-scraping beautifulsoup


【解决方案1】:

使用硒,

  1. 您必须接受 cookie 按钮。
  2. 您必须滚动到每个元素才能获取数据。
  3. 您必须点击下一页才能看到新内容。
  4. 下面的代码只是从5个起始页中提取数据,代码number_of_pages中有一个变量设置为5,如果你想抓取nth页的数据,你必须改变这个价值。

代码:

driver = webdriver.Chrome(driver_path)
driver.maximize_window()
driver.implicitly_wait(50)
driver.get("https://olympics.com/tokyo-2020/olympic-games/en/results/all-sports/medalists.htm")
wait = WebDriverWait(driver, 20)

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='onetrust-accept-btn-handler']"))).click()

number_of_pages = 5
page_to_start_clicking = 2
for i in range(1, 5):
    time.sleep(2)
    #lnght_of_table = len(driver.find_elements(By.CSS_SELECTOR, "div.playerTag span:nth-of-type(2)"))
    for ele in driver.find_elements(By.CSS_SELECTOR, "div.playerTag span:nth-of-type(2)"):
        driver.execute_script("arguments[0].scrollIntoView(true);", ele)
        print(ele.text)
    wait.until(EC.element_to_be_clickable((By.LINK_TEXT, f"{page_to_start_clicking}"))).click()
    page_to_start_clicking = page_to_start_clicking + 1

进口:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

输出:-

CAVARS Agnis
KRUMINS Edgars
LASMANIS Karlis
MIEZIS Nauris
DOLSON Stefanie
GRAY Allisha
PLUM Kelsey
YOUNG Jacquelyn
GAZOZ Mete
KIM Je Deok
KIM Woojin
OH Jinhyek
AN San
AN San
JANG Minhee
KANG Chaeyoung
AN San
KIM Je Deok
HASHIMOTO Daiki
DOLGOPYAT Artem
HASHIMOTO Daiki
ZOU Jingyuan
WHITLOCK Max
LIU Yang
SHIN Jeahwan
ABLIAZIN Denis
BELYAVSKIY David
DALALOYAN Artur
NAGORNYY Nikita
LEE Sunisa
GUAN Chenchen
CAREY Jade
DERWAEL Nina
ANDRADE Rebeca
AKHAIMOVA Liliia
LISTUNOVA Viktoriia
MELNIKOVA Angelina
URAZOVA Vladislava
KOLESNICHENKO Svetlana
ROMASHINA Svetlana
CHIGIREVA Vlada
GOLIADKINA Marina
KOLESNICHENKO Svetlana
KOMAR Polina
PATSKEVICH Aleksandra
ROMASHINA Svetlana
SHISHKINA Alla
SHUROCHKINA Maria
BAREGA Selemon
JACOBS Lamont Marcell
PARCHMENT Hansle
INGEBRIGTSEN Jakob
de GRASSE Andre
STANO Massimo
EL BAKKALI Soufiane
GARDINER Steven
WARHOLM Karsten
DESALU Eseosa Fostine
JACOBS Lamont Marcell
PATTA Lorenzo
TORTU Filippo
BENJAMIN Rai
CHERRY Michael
DEADMON Bryce
NORMAN Michael
NORWOOD Vernon
ROSS Randolph
STEWART Trevor
CHEPTEGEI Joshua
TOMALA Dawid
KORIR Emmanuel Kipkurui
WARNER Damian
STAHL Daniel
NOWICKI Wojciech
TAMBERI Gianmarco
BARSHIM Mutaz Essa
CHOPRA Neeraj
TENTOGLOU Miltiadis
KIPCHOGE Eliud
DUPLANTIS Armand

Process finished with exit code 0

【讨论】:

    【解决方案2】:

    要转到下一页,您必须单击页面右下角的next 分页按钮。
    为此,您必须向下滚动页面并单击该页面。
    对于滚动,您将使用 action_chains 类。
    因此,您将在每个页面上收集数据,然后执行以下操作:

    next_page_btn = driver.find_element_by_xpath('//li[@class="paginate_button page-item next"]//a')
    actions.move_to_element(next_page_btn).perform()
    time.sleep(0.5)
    next_page_btn.click()
    

    在此之前,您必须导入

    from selenium.webdriver.common.action_chains import ActionChains
    

    并用

    初始化actions对象
    actions = ActionChains(driver)
    

    【讨论】:

      【解决方案3】:

      该页面从 JSON 文件中获取奖牌数据。您可以向该 JSON 文件发出请求并获取完整的奖牌数据。

      这是该 JSON 文件的 URL。

      https://olympics.com/tokyo-2020/olympic-games/en/results/all-sports/zzjm094b.json
      

      这里是打印示例奖牌数据的代码,例如球员姓名、国家/地区、奖牌等。您可以分析 JSON 文件并提取您需要的任何数据。

      import requests
      
      url = 'https://olympics.com/tokyo-2020/olympic-games/en/results/all-sports/zzjm094b.json'
      r = requests.get(url)
      j = r.json()
      
      for i in j['medallistsJSON'][:10]:
          print(f"{i['a_name']:25} {i['c_code']:10} {i['m_link']}")
      

      奖牌数据示例

      KIM Je Deok               KOR        Gold Medal
      AN San                    KOR        Gold Medal
      SCHLOESSER Gabriela       NED        Silver Medal
      WIJLER Steve              NED        Silver Medal
      ALVAREZ Luis              MEX        Bronze Medal
      VALENCIA Alejandra        MEX        Bronze Medal
      CARAPAZ Richard           ECU        Gold Medal
      van AERT Wout             BEL        Silver Medal
      POGACAR Tadej             SLO        Bronze Medal
      SZILAGYI Aron             HUN        Gold Medal
      

      【讨论】:

        猜你喜欢
        • 2022-12-01
        • 2022-12-01
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 2018-05-22
        • 1970-01-01
        • 2020-09-13
        • 1970-01-01
        相关资源
        最近更新 更多