Python Web Scraping(Beautiful Soup,Selenium和PhantomJS):只抓取整页的一部分

时间:2016-01-13 14:51:23

标签: python-2.7 selenium web-scraping beautifulsoup phantomjs

您好我无法尝试从网站上抓取数据进行建模(fantsylabs dotcom)。我只是一个黑客,所以请原谅我对comp sci lingo的无知。我想要完成的是......

  1. 使用selenium登录网站并导航到包含数据的页面。

    ## 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
    
  2. 此过程的工作原理是它登录,导航到正确的页面,但一旦页面完成动态加载(30秒)就将其传递给beautifulsoup。我在表格中看到了大约300多个我要抓的实例....但是bs4刮刀只吐出了300个实例中的30个。从我自己的研究看来,这可能是数据动态加载的问题javascript,只有推送到HTML的内容被bs4解析? (Using Python requests.get to parse html code that does not load at once

    任何提供建议的人都可能很难在不在网站上创建个人资料的情况下重现我的例子,但是使用phantomJS来初始化浏览器就可以了解所有需要的东西"抓住"所有实例,以捕获所有想要的数据?

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

    任何想法或经验都将受到赞赏,因为我从来没有处理动态页面/抓取javascript,如果这是我遇到的。

    Alecs响应后更新:

    以下是目标数据的屏幕截图(以蓝色突出显示)。您可以在图像右侧看到滚动条,并将其嵌入页面中。我还在此容器中提供了页面源代码的视图。

    enter image description here

    我修改了我提供的原始代码,尝试向下滚动到底部并完全加载页面,但无法执行此操作。当我将驱动程序设置为Firefox()时,我可以看到页面通过外部滚动条向下移动,但不在目标容器内。我希望这是有道理的。

    再次感谢您的任何建议/指导。

1 个答案:

答案 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'

当您将页面滚动到底部时,也可能是动态加载数据。在这种情况下,您可能需要将页面滚动到底部,直到看到所需的数据量或滚动时不再加载新数据。以下是样本解决方案的相关主题: