如何使用BS4或Selenium(Python)抓取动态内容?

时间:2017-10-04 23:03:23

标签: python selenium web-scraping beautifulsoup

我正在尝试从文件查找器页面(example)中抓取Github存储库中的所有文件路径。

Beautiful Soup 4无法抓取包装文件路径列表的<tbody class="js-tree-finder-results js-navigation-container js-active-navigation-container">元素。我认为这是b / c bs4无法刮掉动态内容,所以我试着用Selenium等待所有元素加载:

driver = webdriver.PhantomJS()
driver.get("https://github.com/chrisspen/weka/find/master")

# Explicitly wait for the element to become present
wait = WebDriverWait(driver, 10)
element = wait.until(
    EC.presence_of_element_located((
        By.CSS_SELECTOR, "js-tree-finder-results.js-navigation-container.js-active-navigation-container"
    ))
)

# Pass the found element into the script
items = driver.execute_script('return arguments[0].innerHTML;', element)
print(items)

但它仍未能找到元素。

我做错了什么?

P.S。

可以使用以下脚本通过JS控制台轻松获取文件路径:

window.onload = function() {
    var fileLinks = document.getElementsByClassName("css-truncate-target js-navigation-open js-tree-finder-path"); 
    var files = []; 
    for (var i = 0; i < fileLinks.length; i++) { 
        files.push(fileLinks[i].innerHTML); 
    } 
    return files; 
}

修改

我的程序需要使用无头浏览器,例如PhantomJS。

1 个答案:

答案 0 :(得分:0)

由于Github的Content-Security-Policy设置,当前版本的PhantomJS无法捕获Github内容。这是一个已知的错误并记录在案here。根据该问题页面,降级到PhantomJS版本1.9.8是解决问题的方法。

另一个解决方案是使用chromedriver:

driver = webdriver.Chrome('chromedriver')
driver.get("https://github.com/chrisspen/weka/find/master")

wait = WebDriverWait(driver, 10)

element = wait.until(
     EC.presence_of_element_located((
        By.CLASS_NAME, "js-tree-finder-path"
     ))
)