2016-01-13 63 views
4

您好,我嘗試從網站上刮取數據進行建模(fantsylabs dotcom)有困難。我只是一個黑客,所以原諒我對科學幻想術語的無知。我想要完成的是...Python Web刮(美麗的湯,硒和PhantomJS):只刮整個頁面的一部分

  1. 使用硒登錄到網站,並導航到頁面的數據。

    ## Initialize and load the web page 
    url = "website url" 
    driver = webdriver.Firefox() 
    driver.get(url) 
    time.sleep(3) 
    
    ## Fill out forms and login to site 
    username = driver.find_element_by_name('input') 
    password = driver.find_element_by_name('password') 
    username.send_keys('username') 
    password.send_keys('password') 
    login_attempt = driver.find_element_by_class_name("pull-right") 
    login_attempt.click() 
    
    ## Find and open the page with the data that I wish to scrape 
    link = driver.find_element_by_partial_link_text('Player Models') 
    link.click() 
    time.sleep(10) 
    
    ##UPDATED CODE TO TRY AND SCROLL DOWN TO LOAD ALL THE DYNAMIC DATA 
    scroll = driver.find_element_by_class_name("ag-body-viewport") 
    driver.execute_script("arguments[0].scrollIntoView();", scroll) 
    
    ## Try to allow time for the full page to load the lazy way then pass to BeautifulSoup 
    time.sleep(10) 
    html2 = driver.page_source 
    
    soup = BeautifulSoup(html2, "lxml", from_encoding="utf-8") 
    div = soup.find_all('div', {'class':'ag-pinned-cols-container'}) 
    ## continue to scrape what I want 
    

這個過程的工作,它登錄時,導航到正確的頁面,但一旦頁面完成動態加載(30秒),把它傳遞給beautifulsoup。我在表格中看到大約300多個實例,我想要刮擦....但是,bs4刮板只能分析大約30個300的實例。從我自己的研究看來,這可能是數據動態加載的問題JavaScript,只有什麼推送到HTML正在解析bs4? (Using Python requests.get to parse html code that does not load at once

這可能是任何人都很難提供意見,以重現我的例子,而無需創建網站上的個人資料,但會使用phantomJS初始化瀏覽器全部是需要以捕獲所有以「搶」的所有實例所需的數據?作爲香港專業教育學院從未有過處理動態頁/刮的JavaScript如果這是我遇到

driver = webdriver.PhantomJS() ##instead of webdriver.Firefox() 

任何想法或經驗,將不勝感激。


修訂Alecs響應後:

下面是目標數據的屏幕截圖(藍色高亮顯示)。您可以看到圖像右側的滾動條,並將其嵌入到頁面中。我還提供了此容器中頁面源代碼的視圖。

enter image description here

我修改了我提供試圖向下滾動至底部,並完全加載頁面的原代碼,但它不能執行此操作。當我將驅動程序設置爲Firefox()時,我可以看到頁面通過外滾動條向下移動,但不在目標容器內。我希望這是有道理的。

再次感謝您的任何建議/指導。

+0

掌握成爲一名黑客的藝術是什麼編程是怎麼一回事。 –

回答

2

這不容易回答,因爲我們無法重現問題。

的一個問題是,lxmlnot handling this specific HTML particularly well,你可能需要嘗試changing the parser

soup = BeautifulSoup(html2, "html.parser") 
soup = BeautifulSoup(html2, "html5lib") 

此外,有可能不是第一名BeautifulSoup需要。您可以通過很多不同的方式找到含有selenium的元素。例如,在這種情況下:

for div in driver.find_elements_by_css_selector(".ag-pinned-cols-container'"): 
    # do smth with 'div' 

還可以,當你滾動頁面底部的數據是動態加載。在這種情況下,您可能需要將頁面滾動到底部,直到看到所需數量的數據或滾動上沒有更多新數據加載。以下是相關的線程與樣品溶液:

+0

感謝您輸入alec,您已經將滾動頁面指向正確的方向。我以前沒有遇到過這個問題。鏈接有幫助,但我似乎仍然無法做到。看起來目標數據位於網頁內的單獨容器中,並具有其自己的單獨滾動條。我使用屏幕快照編輯了我的第一個問題,並且還需要更新一些代碼。 – boothtp

+0

@boothtp好,我認爲[這個答案](http://stackoverflow.com/a/30942319/771848)應該是最相關的意思,這個想法將滾動到表中最後一行的視圖來觸發動態負載。你只需要修復定位器。這仍然是一個猜測。希望能幫助到你。 – alecxe

+0

再次感謝。所以我今天能夠在幾個小時內處理你的建議。我仍然無法定位上圖中的滾動條,所以其他任何指導都會有所幫助......我無法檢查它...我是如此定位容器?此外,我發現當我手動向下滾動,數據動態更新,但它一次只顯示約40個實例...例如,如果我加載頁面,我看到實例1-40 ...如果向下滾動進一步看不到,說例20-60和1-20從源代碼中消失......在這種情況下,如何捕獲數據? – boothtp