在这几天我试图抓取雅虎答案网站,以便在这个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
我可以得到很多问题,但不是所有问题,每次都会改变问题的数量。
答案 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()