html - 雅虎问答真的是 "Infinite Scroll"页面吗? Python

标签 html selenium web-crawler infinite-scroll yahoo

这些天,我正在尝试抓取雅虎问答网站,以便回答此 category 中的问题。 我使用Scrapy进行爬行,使用Selenium作为动态网站的句柄。

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

  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

我可以得到很多问题,但不是全部,而且每次抓取的问题数量都会变化。

最佳答案

事实上,这是一条评论,但长度已作为答案发布!

我尝试使用 selenium 和 javascript 测试 this 看看会发生什么。这对我来说也是一样的。我尝试了 javascript scroll 函数来 ScrollView ,但即使从不同的白名单 ip 和不同的网络驱动程序也得到相同的结果。这是我到目前为止尝试过的代码。

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 或其他人可以有更好的答案。

关于html - 雅虎问答真的是 "Infinite Scroll"页面吗? Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018566/

相关文章:

python - 如何处理两个提取的元素(尊重它们出现的顺序) - Python Selenium

java - 使用 elem.absUrl 提取 URL

SEO:爬虫是否理解 <a href=.. 永远不会被使用的链接?

javascript - 如何使用 onclick 更改可见性

html - 添加css后无法点击控件

javascript - Selenium 在 javascript 弹出窗口中查找元素

html - 如何告诉谷歌这篇文章是另一篇文章的一部分

javascript - 如何在 javascript 中定义 html 类?

javascript - 在 html css 中锁定表单后更改边框

python - 使用 Selenium 时如何选择要启用的 Chrome 扩展