我正在尝试从下面的morningstar网站上获取数据:
http://financials.morningstar.com/ratios/r.html?t=IBM®ion=USA&culture=en_US
我目前正在尝试只做IBM,但希望最终能够输入另一家公司的代码,并对那家公司做同样的事情。到目前为止我的代码如下:
import requests, os, bs4, string
url = 'http://financials.morningstar.com/ratios/r.html?t=IBM®ion=USA&culture=en_US';
fin_tbl = ()
page = requests.get(url)
c = page.content
soup = bs4.BeautifulSoup(c, "html.parser")
summary = soup.find("div", {"class":"r_bodywrap"})
tables = summary.find_all('table')
print(tables[0])
我现在遇到的问题不同于我抓取的简单网页,程序似乎找不到任何表格,即使我可以在页面的HTML中看到它们。
在研究这个问题时,最接近的堆栈溢出问题如下:
Python webscraping - NoneObeject Failure - broken HTML?
在那篇文章中,他们解释说,Morningstar的表格是动态加载的,并使用了一些我不熟悉的json代码,并以某种方式生成了一个不同的网页链接,它设法抓取了数据,但我不知道它是从哪里来的?
发布于 2016-02-27 18:08:09
抓取一些现代web页面是一个真正的问题,特别是在由单页面应用程序生成的页面上(其中的内容是通过AJAX调用和DOM修改来维护的,而不是在单个服务器响应中作为现成的HTML交付)。
我发现访问这些内容的最好方法是使用Selenium web测试环境,让浏览器在我的程序的控制下加载页面,然后从Selenium中提取页面内容进行抓取。还有其他环境可以执行脚本并适当地修改DOM,但我还没有使用过任何环境。
这并不像听起来那么困难,但它需要你稍微摇晃一下才能到达那里。
发布于 2016-02-27 18:21:40
当网站提供API时,Web抓取可以大大简化,无论是官方支持还是非官方的黑客攻击。即使是黑客也比试图摆弄每天都会改变的HTML要好得多。
因此,搜索morningstar api可能是卓有成效的。实际上,还有一些友好的has already worked this out for you修女。
如果搜索没有结果,一个通常有效的方法是调查ajax调用页面正在做什么来检索数据,然后直接发出它们。这可以通过浏览器调试器、选项卡"network“等实现,在这些调试器中可以在非常友好的UI中详细研究每个请求。
发布于 2016-02-27 18:35:03
我发现用JavaScript抓取动态站点要比用Python + Selenium容易得多。nodejs
/phantomjs
有一个很棒的模块:ScraperJS。它非常容易使用:它将jQuery注入到抓取的页面中,您可以使用jQuery选择器提取数据。
https://stackoverflow.com/questions/35668091
复制相似问题