boo*_*htp 5 selenium beautifulsoup web-scraping python-2.7 phantomjs
您好我在尝试从网站上搜索数据以进行建模时遇到问题(fantsylabs网络公司).我只是一个黑客,所以请原谅我对comp sci lingo的无知.我想要完成的是......
使用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()时,我可以看到页面通过外部滚动条向下移动,但不在目标容器内.我希望这是有道理的.
再次感谢您的任何建议/指导.
这个问题并不容易回答,因为我们没有办法重现这个问题。
一个问题是,它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)
也可能是当您将页面滚动到底部时动态加载数据。在这种情况下,您可能需要将页面滚动到底部,直到看到所需的数据量或者滚动时不再加载新数据。以下是带有示例解决方案的相关线程:
| 归档时间: |
|
| 查看次数: |
6964 次 |
| 最近记录: |