在python中同步运行循环

时间:2016-08-31 06:03:10

标签: python selenium asynchronous selenium-webdriver synchronous

我有一段代码,可以抓取无限高度的网站(Like FACEBOOK)

Python selenium脚本要求页面javascript转到页面底部,以便进一步加载页面。但最终碰巧循环以异步方式运行,网站的速率限制器阻止了脚本。

我需要页面等待页面首先加载然后继续,但我没有这样做。

以下是我迄今为止所尝试过的事情。

代码如下:

while int(number_of_news) != int(len(news)) :
    driver.execute_script("window.scrollTo(document.body.scrollHeight/2, document.body.scrollHeight);")
    news = driver.find_elements_by_class_name("news-text")
    print(len(news))

输出类似于

enter image description here

当值为43, 63... and so on时,我将其解释为多次执行循环。

我也试过让它递归,但结果仍然是一样的。递归代码如下:

def call_news(_driver, _news, _number_of_news):
    _driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    _news = driver.find_elements_by_class_name("news-text")
    print(len(_news))
    if int(len(_news)) != int(number_of_news) :
        call_news(_driver, _news, _number_of_news)
    else :
        return _news

赞赏任何提示。

1 个答案:

答案 0 :(得分:3)

您可以设置page_load_timeout以使驱动程序等待加载页面

driver.set_page_load_timeout(10)

另一个选择是等待要更改的元素数量

current_number_of_news = 0
news = []
while int(number_of_news) != int(len(news)) :
    driver.execute_script("window.scrollTo(document.body.scrollHeight/2, document.body.scrollHeight);")
    while (current_number_of_news == len(news)) :
        news = driver.find_elements_by_class_name("news-text")
    current_number_of_news = len(news)
    print(len(news))