我需要从html表中抓取大约 20,000行的数据。但是,该表分为200页,每页100行。问题是我需要点击每行中的链接来访问必要的数据。
我想知道是否有人有任何提示要做这个,因为我现在的方法,如下所示,花了太长时间。
第一部分是浏览Shiboleth所必需的。这部分不是我的担心,因为它只需要大约20秒并且发生一次。
from selenium import webdriver
from selenium.webdriver.support.ui import Select # for <SELECT> HTML form
driver = webdriver.PhantomJS()
# Here I had to select my school among others
driver.get("http://onesearch.uoregon.edu/databases/alphabetical")
driver.find_element_by_link_text("Foundation Directory Online Professional").click()
driver.find_element_by_partial_link_text('Login with your').click()
# We are now on the login in page where we shall input the information.
driver.find_element_by_name('j_username').send_keys("blahblah")
driver.find_element_by_name('j_password').send_keys("blahblah")
driver.find_element_by_id('login_box_container').submit()
# Select the Search Grantmakers by I.D.
print driver.current_url
driver.implicitly_wait(5)
driver.maximize_window()
driver.find_element_by_xpath("/html/body/header/div/div[2]/nav/ul/li[2]/a").click()
driver.find_element_by_xpath("//input[@id='name']").send_keys("family")
driver.find_element_by_xpath("//input[@id='name']").submit()
这是耗时太长的部分。 此代码中不包含抓取部分。
# Now I need to get the page source for each link of 20299 pages... :()
list_of_links = driver.find_elements_by_css_selector("a[class='profile-gate-check search-result-link']")
# Hold the links in a list instead of the driver.
list_of_linktext = []
for link in list_of_links:
list_of_linktext.append(link.text)
# This is the actual loop that clicks on each link on the page.
for linktext in list_of_linktext:
driver.find_element_by_link_text(linktext).click()
driver.implicitly_wait(5)
print driver.current_url
driver.back()
driver.implicitly_wait(5) #Waits to make sure that the page is reached.
导航200页中的1个大约需要15分钟。有更好的方法吗?
我尝试使用显式等待而不是隐式等待。
for linktext in list_of_linktext:
# explicit wait
WebDriverWait(driver, 2).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "a[class='profile-gate-check search-result-link']"))
)
driver.find_element_by_link_text(linktext).click()
print driver.current_url
driver.back()
然而,问题仍然存在,每页的平均时间为5秒。
答案 0 :(得分:0)
对于屏幕刮擦,我通常完全避开Selenium。有更快,更可靠的方法从网站上抓取数据。
如果你正在使用Python,你可以尝试beautifulsoup。它似乎与我过去用于其他语言的其他网站抓取工具非常相似(最着名的是JSoup和NSoup)。