尝试使用Python和Selenium迭代地滚动和抓取网页

时间:2016-01-15 19:39:04

标签: javascript python selenium beautifulsoup

我最近问了一个问题(在此引用:Python Web Scraping (Beautiful Soup, Selenium and PhantomJS): Only scraping part of full page),这有助于识别我在抓取页面的所有内容时遇到的问题,该页面在滚动时会动态更新。但是,我仍然无法使用selenium来指责使用selenium的正确元素并迭代地向下滚动页面。我还发现,当我在新内容更新时,当页面加载消失时,我手动向下滚动页面中的一些原始内容。例如,请看下面的图片......

enter image description here   我已经使用我试图在下面搜索的数据(以蓝色突出显示)将容器作为目标。

首先,我无法选择正确的元素向下滚动页面,因为我以前从未这样做过。我相信我必须使用selenium来定位容器,然后使用“execute_script”函数然后向下滚动页面,因为这个表嵌入在网页的主体中。但是,我似乎无法让它工作。

    scroll = driver.find_element_by_class_name("ag-body-viewport")
    driver.execute_script("arguments[0].scrollIntoView();", scroll)

其次,一旦我有能力滚动,我将需要一次向下滚动一下并反复刮擦。我的意思是,如果你看一下图像,你会在里面看到一堆'div'标签

例如......当页面加载并将html传递给Beautifulsoup时。我可以刮掉前40行。如果我向下滚动,说40行,我会将第40- 80行传递给beautifulsoup,因为数据已动态更新,所以第1-40行将不再可用...

长话短说,我想要的是能够刮掉所提供图像中的所有内容,然后使用硒向下滚动大约40行,刮下40行,然后向下滚动并刮下40个,依此类推。 ..有关如何让selenium在这个嵌入式容器中滚动的任何提示,以及如何在滚动时动态更新时捕获容器中的所有数据,以便迭代地向下滚动。任何额外的帮助将非常感激。

1 个答案:

答案 0 :(得分:1)

从我在屏幕截图中看到的情况看来,您需要迭代滚动到表格中最后一行的视图 - 具有ag-row类的最后一个元素:

import time   

while True:
    rows = driver.find_elements_by_css_selector("tr.ag-row")
    driver.execute_script("arguments[0].scrollIntoView();", rows[-1])

    time.sleep(1)

    # TODO: collect the rows

您还需要弄清楚循环退出条件。