我正试图从晨星网站上搜索数据:
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中看到它们。
在研究这个问题时,最接近的stackoverflow问题如下:
Python webscraping - NoneObeject Failure - broken HTML?
在那一个中,他们解释说晨星的表是动态加载的,并使用了一些我不熟悉的json代码,并以某种方式生成了一个不同的网络链接,设法刮掉了数据,但我不知道它来自哪里从?
答案 0 :(得分:3)
抓取一些现代网页是一个真正的问题,特别是在单页面应用程序生成的页面上(内容由AJAX调用和DOM修改维护,而不是作为单个服务器响应中的现成HTML提供)
我发现访问此类内容的最佳方法是使用Selenium Web测试环境让浏览器在我的程序控制下加载页面,然后从Selenium中提取页面内容以进行抓取。还有其他环境可以执行脚本并适当地修改DOM,但我没有使用它们中的任何一个。
它并不像听起来那么困难,但它会让你有点摇晃到达那里。
答案 1 :(得分:1)
当网站提供API时,网络抓取可以大大简化,无论是官方支持还是非正式的黑客攻击。即使是黑客攻击也比试图改变每天都能改变的HTML更好。
因此,搜索morningstar api可能会很有成效。而且,事实上,一些友好的Gister has already worked this out for you。
搜索是否没有结果,通常很有成效的方法是调查ajax调用页面正在做什么来检索数据然后直接发布它们。这可以通过浏览器调试器,“网络”选项卡来实现,其中每个请求都可以在非常友好的UI中进行详细调查。
答案 2 :(得分:0)
我发现使用JavaScript比使用Python + Selenium更容易抓取动态网站。 nodejs
/ phantomjs
:ScraperJS有一个很棒的模块。它非常易于使用:它将jQuery注入到被抓取的页面中,您可以使用jQuery选择器提取数据。