浏览数以千计的网页并抓取它们的提示?

时间:2015-07-01 03:36:55

标签: python selenium-webdriver web-scraping phantomjs

我需要从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秒。

1 个答案:

答案 0 :(得分:0)

对于屏幕刮擦,我通常完全避开Selenium。有更快,更可靠的方法从网站上抓取数据。

如果你正在使用Python,你可以尝试beautifulsoup。它似乎与我过去用于其他语言的其他网站抓取工具非常相似(最着名的是JSoup和NSoup)。