这些天,我正在尝试抓取雅虎问答网站,以便回答此 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()
关于html - 雅虎问答真的是 "Infinite Scroll"页面吗? Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018566/