使用Selenium进行网络抓取

时间:2016-03-26 15:45:24

标签: python selenium

我正在尝试使用selenium抓取website表中的company names, code, industry, sector, mkt cap, etc列表。我是新手,并编写了以下代码:

path_to_chromedriver = r'C:\Documents\chromedriver'
browser = webdriver.Chrome(executable_path=path_to_chromedriver)

url = r'http://sgx.com/wps/portal/sgxweb/home/company_disclosure/stockfacts'
browser.get(url)

time.sleep(15)
output = browser.page_source
print(output) 

但是,我能够获得以下标签,但不能获得其中的数据..

            <div class="table-wrapper results-display">
                <table>
                    <thead>
                        <tr></tr>
                    </thead>
                    <tbody></tbody>
                </table>
            </div>
            <div class="pager results-display"></div>

我之前也曾尝试使用BS4进行刮擦,但失败了。任何帮助深表感谢。

2 个答案:

答案 0 :(得分:2)

结果位于iframe - 切换到它然后获取.page_source

iframe = driver.find_element_by_css_selector("#mainContent iframe")
driver.switch_to.frame(iframe)

我还要添加等待加载的表:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

# locate and switch to the iframe
iframe = driver.find_element_by_css_selector("#mainContent iframe")
driver.switch_to.frame(iframe)

# wait for the table to load
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.companyName')))

print(driver.page_source)

答案 1 :(得分:0)

这完全可行。最简单的方法是使用&#39; find_elements&#39;打电话(注意它是复数)并抓住所有<tr>元素。它将返回一个列表,您可以使用列表中每个元素的查找元素(单数)调用进行解析,但这次通过查找每个元素。

您可能遇到了计时问题。我注意到你要查找的数据非常缓慢。您可能需要等待该数据。最好的方法是检查它的存在,直到它出现,然后尝试加载它。查找元素调用(再次注意,我再次使用复数)在查找元素并找不到时不会抛出异常,它只会返回一个空列表。这是检查数据显示的一种不错的方法。