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

boo*_*htp 5 selenium beautifulsoup web-scraping python-2.7 phantomjs

您好我在尝试从网站上搜索数据以进行建模时遇到问题(fantsylabs网络公司).我只是一个黑客,所以请原谅我对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
    
    Run Code Online (Sandbox Code Playgroud)

此过程的工作原理是它登录,导航到正确的页面,但一旦页面完成动态加载(30秒)将其传递给beautifulsoup.我在表格中看到了大约300多个我要抓的实例....但是bs4刮刀只吐出了300个实例中的30个.从我自己的研究看来,这可能是数据动态加载的问题javascript和只有被推送到HTML的内容被bs4解析?(使用Python requests.get来解析一次不加载的html代码)

在没有在网站上创建配置文件的情况下,任何提供建议的人都可能很难重现我的示例,但是使用phantomJS初始化浏览器是为了捕获所有所需数据而需要"抓住"所有实例的所有内容?

    driver = webdriver.PhantomJS() ##instead of webdriver.Firefox()
Run Code Online (Sandbox Code Playgroud)

任何想法或经验将不胜感激,因为我从来没有处理动态页面/抓取javascript,如果这是我遇到的.


Alecs响应后更新:

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

在此输入图像描述

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

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

ale*_*cxe 2

这个问题并不容易回答,因为我们没有办法重现这个问题。

一个问题是,它lxml不能很好地处理这个特定的 HTML,您可能需要尝试更改解析器

soup = BeautifulSoup(html2, "html.parser")
soup = BeautifulSoup(html2, "html5lib")
Run Code Online (Sandbox Code Playgroud)

BeautifulSoup而且,一开始可能就没有必要。您可以selenium通过多种不同的方式来定位元素。例如,在这种情况下:

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

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