【问题标题】:A tough scraping case using selenium使用硒的坚固刮擦案例
【发布时间】:2020-09-19 10:05:11
【问题描述】:

所以我尝试使用 selenium 抓取 webs table,尝试使用 xpath 提取表:

之前我试图寻找表格类但是没有找到表格,所以我决定寻找 div 元素。

xpath="//div[@class='table-scroller ScrollableTable__table-scroller QuoteHistoryTable__table__scroller QuoteHistoryTable__QuoteHistoryTable__table__scroller']"
WebDriverWait(driver, 10).until(
        expected_conditions.visibility_of_element_located((By.XPATH, xpath)))
source = driver.page_source
driver.quit()
soup = BeautifulSoup(source, "html5lib")

table = soup.find('div', {'class': 'table-scroller ScrollableTable__table-scroller QuoteHistoryTable__table__scroller QuoteHistoryTable__QuoteHistoryTable__table__scroller'})
df = pd.read_html(str(table), flavor='html5lib', header=0, thousands='.', decimal=',')
print(df[0])

我遇到的问题是我只打印标题和第一行充满nans的值:

为什么我没有得到表格的值?是什么让抓取这些内容变得如此困难?

编辑: @DebanjanB 能够提供一个很好的答案,但是我无法复制输出,这背后的原因是什么?

【问题讨论】:

  • BeautifulSoup(html_source, "html5lib") 任何名为 html_source 的东西?
  • stackoverflow.com/questions/63960297/… 你也有类似的问题。只需切换到 CSS 选择器。
  • @arundeepchohan 谢谢你的想法,但将 XPATH 更改为 CSS,问题仍然存在,我用同一行 nans 生成 df,我决定发布一个不同的问题,因为我认为在这种情况下,问题有所不同,因为我访问了框架而不是其中的值。

标签: python selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

如果您检查页面请求,您可能会注意到一个端点为您提供了正确的 JSON 信息:

https://api.euroinvestor.dk/indices/21/instruments

您可以使用pandas 直接从 URL 读取(您甚至不需要 Selenium):

instruments = pd.read_json('https://api.euroinvestor.dk/indices/21/instruments')

请务必查看 API 使用条款(尤其是任何速率限制);否则你可能会被阻止。

【讨论】:

  • 在哪里可以找到 API 使用条款?
  • @JamesHudson81 我怀疑它在euroinvestor.dk 底部的某个地方,但我不会说丹麦语: Generelle handelsbetingelser | Cookie-og Privatlivspolitik | Cookie声明 |维尔卡尔
【解决方案2】:

要使用SeleniumOMX Stockholm 30 <table> 中提取内容,您可以使用以下Locator Strategy

  • 使用XPATH

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h4[text()='OMX Stockholm 30']//following::div[2]//table"))).text)
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • 控制台输出:

    VÆRDIPAPIR
    KURS
    ÆNDRING I %
    ÆNDRING
    VOLUME
    BUD
    UDBUD
    OPDATERET
    ABB LTD
    229,60
    0,13%
    0,30
    1.953.199 229,20 229,30 18.09.2020
    ALFA LAVAL AB
    210,50
    1,20%
    2,50
    1.513.953 210,30 210,40 18.09.2020
    ASSA ABLOY AB SER. B
    216,00
    1,55%
    3,30
    3.250.421 216,20 216,40 18.09.2020
    ASTRAZENECA PLC
    995,10
    0,56%
    5,50
    507.005 994,70 995,00 18.09.2020
    ATLAS COPCO AB SER. A
    425,60
    1,89%
    7,90
    2.313.361 425,80 426,10 18.09.2020
    ATLAS COPCO AB SER. B
    376,60
    2,78%
    10,20
    971.096 376,60 376,90 18.09.2020
    AUTOLIV INC. SDB
    655,00
    -1,18%
    -7,80
    279.485 656,80 657,40 18.09.2020
    BOLIDEN AB
    275,80
    1,03%
    2,80
    2.450.311 276,60 276,80 18.09.2020
    ELECTROLUX, AB SER. B
    194,60
    0,34%
    0,65
    1.381.656 195,00 195,10 18.09.2020
    ERICSSON, TELEFONAB. L M SER.
    98,26
    1,30%
    1,26
    17.811.892 98,12 98,16 18.09.2020
    ESSITY AB SER. B
    306,40
    -0,20%
    -0,60
    1.795.692 306,20 306,40 18.09.2020
    GETINGE AB SER. B
    188,10
    1,65%
    3,05
    864.843 188,05 188,15 18.09.2020
    HENNES & MAURITZ AB, H &#3
    157,85
    -1,68%
    -2,70
    5.188.908 157,85 157,90 18.09.2020
    HEXAGON AB SER. B
    677,20
    0,06%
    0,40
    776.831 676,20 676,80 18.09.2020
    INVESTOR AB SER. B
    584,60
    1,53%
    8,80
    1.681.508 585,00 585,20 18.09.2020
    KINNEVIK AB SER. B
    336,95
    3,34%
    10,90
    1.118.689 336,35 336,55 18.09.2020
    NORDEA BANK ABP
    68,37
    -1,85%
    -1,29
    11.846.193 68,45 68,48 18.09.2020
    SANDVIK AB
    185,10
    1,54%
    2,80
    3.874.524 185,00 185,10 18.09.2020
    SECURITAS AB SER. B
    140,00
    -0,53%
    -0,75
    1.545.060 140,20 140,35 18.09.2020
    SKANDINAVISKA ENSKILDA BANKEN
    81,38
    -3,46%
    -2,92
    10.968.672 81,38 81,42 18.09.2020
    

更新

正如您在 cmets 中提到的 ...要么超时,要么我只能获取标题... 这实际上意味着我们的定位器是正确的,问题在于渲染和这种情况你可以scrollIntoView(),你可以使用以下解决方案:

driver.get('https://www.euroinvestor.dk/markeder/aktier/sverige/omx-stockholm-30/21')
driver.execute_script("return arguments[0].scrollIntoView(true);", WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h4[text()='OMX Stockholm 30']"))))
print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h4[text()='OMX Stockholm 30']//following::div[2]//table"))).text)

【讨论】:

  • 感谢您的回复,但我无法复制输出。我要么超时,要么只能获取标题,我也不明白所述的路径参考,这也是有角度的吗?
  • @JamesHudson81 查看答案更新并告诉我状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多