Python Web刮(美丽的汤,硒和PhantomJS):只刮整个页面的一部分

问题描述:

您好,我尝试从网站上刮取数据进行建模(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

掌握成为一名黑客的艺术是什么编程是怎么一回事。 –

这不容易回答,因为我们无法重现问题。

的一个问题是,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://*.com/a/30942319/771848)应该是最相关的意思,这个想法将滚动到表中最后一行的视图来触发动态负载。你只需要修复定位器。这仍然是一个猜测。希望能帮助到你。 – alecxe

+0

再次感谢。所以我今天能够在几个小时内处理你的建议。我仍然无法定位上图中的滚动条,所以其他任何指导都会有所帮助......我无法检查它...我是如此定位容器?此外,我发现当我手动向下滚动,数据动态更新,但它一次只显示约40个实例...例如,如果我加载页面,我看到实例1-40 ...如果向下滚动进一步看不到,说例20-60和1-20从源代码中消失......在这种情况下,如何捕获数据? – boothtp