【问题标题】:How can I use Selenium to Loop through and Scrape Several Pages of Data using OpenML?如何使用 Selenium 循环并使用 OpenML 抓取几页数据?
【发布时间】:2018-10-20 11:40:24
【问题描述】:

如果我们转到链接:https://www.openml.org/t/31#!taskruns,您会看到大约有 400k 个结果,我正在尝试使用 Python 3.6.5 和 Selenium 从所有这些结果中抓取关键信息。附上我目前拥有的代码。

适用于前 300 个结果的代码和结果图片:

我的问题是,我只能得到前 300 个结果。如果您继续向下滚动链接,您会注意到有超过 300 个结果,我使用 Selenium 是因为我认为它可以解析动态信息(即向下滚动的次数越多,结果越多)。

我的想法是我希望它解析此页面上的所有信息,直到它到达:

加载更多... 没有加载?现在转到下一个结果..

然后继续转到下一页并做同样的事情,直到所有 400k 结果都被抓取。

我提供的链接的 HTML 只有 200 个结果,然后它包含指向下一个 200 个的链接:

<a href="search?type=run&amp;from=300&amp;q=run_task.task_id%3A31">Not loading? Go to the next results now.</a>

我能否以某种方式创建一个循环,它会读取 HTML 并抓取前 200 个结果,然后转到下一个 200 个的 xpath 并继续这样做,直到所有结果都被抓取?

编辑:相关代码是:(我留下截图是为了让你看到我现在获得的输出)

from selenium import webdriver
chrome_path = r"C:\Users\Zeshan\Desktop\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)
driver.get("http://openml.org/t/31#!taskruns")

#This works for only the first 200
titles = driver.find_elements_by_xpath('//div[@class="itemheadfull"]')
metrics = driver.find_elements_by_xpath('//div[@class="runStats statLine"]')
page_items=len(titles)

for i in range(page_items):
        print(titles[i].text + "+" + metrics[i].text)
        print("Output Number:" + str(i+1) )

#Trying to do it for results above 200: I'm not sure if this is correct
#This is the xpath to the "next page" of results
next_page = driver.find_element_by_xpath('//*[@id="taskruns"]/div/p/a').click()

titles2 = driver.find_elements_by_xpath('//div[@class="itemheadfull"]')
metrics2 = driver.find_elements_by_xpath('//div[@class="runStats statLine"]')
page_items2=len(titles)

for i in range(page_items2) :
        print(titles2[i].text + "+" + metrics2[i].text)
        print("Output Number:" + str(i+200) )

【问题讨论】:

  • 请不要粘贴代码截图的链接。贴出代码。它的相关部分。
  • 我认为,您无需单击下一步按钮。向下滚动时它会自动加载。您只需要获取更多元素及其详细信息。
  • @Murthi 是的,我相信是这样,但是当 HTML 页面源代码中未列出元素的详细信息时,如何获取它们?我被困在那了..
  • 当您到达第 200 项时,您可以使用一些 javascript 向下滚动页面。它会自动加载接下来的 200 个项目。

标签: html python-3.x selenium


【解决方案1】:

OpenML 在 Python、R、Java 和基本 REST 中记录了 API。我建议你用那些?那会容易得多。有关文档和示例,请参阅 OpenML 帮助页面。

【讨论】:

    【解决方案2】:

    我认为您遇到了动态呈现的页面。一旦您执行某些操作(例如按下下一个按钮或移动滚动条),将呈现除前 300 行之外的其余行。

    如果您查看网络流量,以下是发送的 HTTP 请求之一: https://www.openml.org/search?type=run&amp;from=100&amp;q=run_task.task_id%3A31&amp;dataonly=1

    这可能是通过 jQuery 库以 AJAX 方式触发的。

    如果您想抓取数据而不是点击主页,我建议您使用 AJAX 查询。

    免责声明:网站可能随时更改后端服务的工作方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多