【发布时间】: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&from=300&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