雅虎回答它真的是“无限滚动”页面?蟒蛇

时间:2015-10-08 14:23:40

标签: html selenium web-crawler infinite-scroll yahoo

在这几天我试图抓取雅虎答案网站,以便在这个category中提出问题。 我使用Scrapy进行爬行,但使用Selenium来处理动态网站。

经过多次尝试或方法,我每次都获得不同的结果,在第一次我想滚动所有网站使用JS,当标签“Loading ...”消失时停止向下滚动。 但我意识到装载在不同时刻停止。 其实我的代码是这样的:

  time.sleep(5)
  wait = WebDriverWait(self.driver, 10)
        while True:
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(randint(4,6))
            self.driver.execute_script("window.scrollBy(0, -100000 );")
            time.sleep(randint(1,3))

            try:
                wait.until(EC.visibility_of_element_located((By.ID, "ya-infinite-scroll-message")))
           except TimeoutException:
                self.driver.get_screenshot_as_file("test_.jpg")
                break

我可以得到很多问题,但不是所有问题,每次都会改变问题的数量。

1 个答案:

答案 0 :(得分:2)

实际上这是一个评论,但是长度会被贴出来作为答案!

我尝试使用selenium和javascript测试this以查看会发生什么。这对我来说是一回事。我尝试使用javascript scroll函数来滚动视图,但即使从不同的白名单ips和不同的webdrivers也能获得相同的结果。这是我到目前为止尝试的代码。

import time,random,time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()

driver.get("https://answers.yahoo.com/dir/index/discover?sid=396545663")

wait = WebDriverWait(driver, 10)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "ul#ya-discover-tab")))

cntr = driver.find_element_by_xpath("//li[contains(@class,'Bfc')]")
lst_scrlshgt = 0
lngth = 0
while True:
    global lngth
    topics = driver.find_elements_by_xpath("//li[@class='ya-discover-tile ya-discover-tile-qn Bfc P-14 Bdbx-1g Bgc-w']")
    driver.execute_script("arguments[0].scrollIntoView();", topics[-1])
    time.sleep(random.choice(range(4,7)))
    scrlshgt = driver.execute_script("return arguments[0].scrollHeight;", cntr)
    if scrlshgt == lst_scrlshgt:
        break
    else:
        last_scrlshgt = scrlshgt
    lngth+=len(topics)
    print lngth





sample  = driver.find_elements_by_xpath("//a[@class='Fz-14 Fw-b Clr-b Wow-bw title']")
for i in sample:
    print i.text.encode('utf-8') 

driver.quit()

我认为alecxelouis或其他人可以有更好的答案。