我喜欢这个问题。正因为如此,我会给出一个非常彻底的答案。
为此,我将使用我最喜欢的请求库和BeautifulSoup4。
移植到Mechanize,如果你真的想使用,这取决于你。
不过,请求可以帮你省去很多麻烦。
首先,你可能在寻找一个POST请求。但是,POST请求
如果搜索功能将您带到页面,则通常不需要
你在找什么。让我们检查一下,好吗?
当我登陆基本网址时
http://www.dailyfinance.com/,我可以做一个简单的
检查通过Firebug或Chrome的检查工具,当我把CSCO或AAPL上
在搜索栏中,启用“跳转”,就会出现“301永久移动”的状态
代码。这是什么意思?
简单地说,我被调往某处。此GET的URL
请求如下:
http://www.dailyfinance.com/quote/jump?exchange-input=&ticker-input=CSCO
Now, we test if it works with AAPL by using a simple URL manipulation.
import requests as rqapl_tick = "AAPL"url = "http://www.dailyfinance.com/quote/jump?exchange-input=&ticker-input="r = rq.get(url + apl_tick)print r.url
The above gives the following result:
http://www.dailyfinance.com/quote/nasdaq/apple/aapl[Finished in 2.3s]
查看响应的URL是如何更改的?让我们看一下URL *** 作
进一步查找“/财务比率”页,方法是在
以下为上述代码:
new_url = r.url + "/financial-ratios"p = rq.get(new_url)print p.url
When ran, this gives is the following result:
http://www.dailyfinance.com/quote/nasdaq/apple/aaplhttp://www.dailyfinance.com/quote/nasdaq/apple/aapl/financial-ratios[Finished in 6.0s]
现在我们在正确的轨道上。我现在将尝试使用
美丽的群像。我的完整代码如下:
from bs4 import BeautifulSoup as bsoupimport requests as rqapl_tick = "AAPL"url = "http://www.dailyfinance.com/quote/jump?exchange-input=&ticker-input="r = rq.get(url + apl_tick)new_url = r.url + "/financial-ratios"p = rq.get(new_url)soup = bsoup(p.content)div = soup.find("div", id="clear").tablerows = table.find_all("tr")for row in rows: print row
然后我尝试运行这段代码,结果遇到了以下错误
回溯:
File "C:UsersnanashiDesktoptest.py", line 13, in <module> div = soup.find("div", id="clear").tableAttributeError: 'NoneType' object has no attribute 'table'
值得注意的是行“NoneType”对象…`。这意味着我们的目标是div
不存在!伊加兹,但为什么我会看到下面这些?!
只能有一种解释:表是动态加载的!胡扯。
让我们看看能不能为这张表找到另一个来源。我研究网页
请注意底部有滚动条。这可能意味着桌子
是在一个帧内加载的还是完全从另一个源直接加载的
并放入页面的“div”中。
我刷新页面并再次查看GET请求。答对了,我发现了一些东西
这似乎有点前途:
一个第三方源URL,看,它很容易 *** 作使用股票代码
符号!让我们试着把它加载到一个新的选项卡中。
真 的!我们现在有了非常准确的数据来源。最后一个障碍是
当我们尝试使用这个字符串提取CSCO数据时,它会工作吗(记住我们
转到CSCO->AAPL,现在又回到CSCO,所以您不会感到困惑)。让我们
清理串沟的作用
www.dailyfinance.com这里
完全。我们的新网址如下:
http://www.motleyfool.idmanagedsolutions.com/stocks/financial_ratios.idms?SYMBOL_US=AAPL
Let’s try using that in our final scraper!
from bs4 import BeautifulSoup as bsoupimport requests as rqcsco_tick = "CSCO"url = "http://www.motleyfool.idmanagedsolutions.com/stocks/financial_ratios.idms?SYMBOL_US="new_url = url + csco_tickr = rq.get(new_url)soup = bsoup(r.content)table = soup.find("div", id="clear").tablerows = table.find_all("tr")for row in rows: print row.get_text()
And our raw results for CSCO’s financial ratios data is as follows:
CompanyIndustryValuation RatiosP/E Ratio (TTM)15.4014.80P/E High - Last 5 Yrs 24.0028.90P/E Low - Last 5 Yrs8.4012.10Beta1.371.50Price to Sales (TTM)2.512.59Price to Book (MRQ)2.142.17Price to Tangible Book (MRQ)4.253.83Price to Cash Flow (TTM)11.4011.60Price to Free Cash Flow (TTM)28.2060.20DividendsDividend Yield (%)3.302.50Dividend Yield - 5 Yr Avg (%)N.A.1.20Dividend 5 Yr Growth Rate (%)N.A.144.07Payout Ratio (TTM)45.0032.00Sales (MRQ) vs Qtr 1 Yr Ago (%)-7.80-3.70Sales (TTM) vs TTM 1 Yr Ago (%)5.505.60Growth Rates (%)Sales - 5 Yr Growth Rate (%)5.515.12EPS (MRQ) vs Qtr 1 Yr Ago (%)-54.50-51.90EPS (TTM) vs TTM 1 Yr Ago (%)-54.50-51.90EPS - 5 Yr Growth Rate (%)8.919.04Capital Spending - 5 Yr Growth Rate (%)20.3020.94Financial StrengthQuick Ratio (MRQ)2.402.70Current Ratio (MRQ)2.602.90LT Debt to Equity (MRQ)0.220.20Total Debt to Equity (MRQ)0.310.25Interest Coverage (TTM)18.9019.10Profitability Ratios (%)Gross Margin (TTM)63.2062.50Gross Margin - 5 Yr Avg66.3064.00EBITD Margin (TTM)26.2025.00EBITD - 5 Yr Avg28.820.00Pre-Tax Margin (TTM)21.1020.00Pre-Tax Margin - 5 Yr Avg21.6018.80Management Effectiveness (%)Net Profit Margin (TTM)17.1017.65Net Profit Margin - 5 Yr Avg17.9015.40Return on Assets (TTM)8.308.90Return on Assets - 5 Yr Avg8.908.00Return on Investment (TTM)11.9012.30Return on Investment - 5 Yr Avg12.5010.90EfficiencyRevenue/Employee (TTM)637,890.00556,027.00Net Income/Employee (TTM)108,902.0098,118.00Receivable Turnover (TTM)5.705.80Inventory Turnover (TTM)11.309.70Asset Turnover (TTM)0.500.50[Finished in 2.0s]
清理数据由你决定。
从这次擦肩而过中学到的一个很好的教训是,并非所有的数据都包含在一个数据库中
单独呼叫。很高兴看到它来自另一个静态站点。如果它
是通过Javascript或AJAX调用等生成的,我们可能会
我们的方法有些困难。
希望你能从中学到一些东西。让我们知道这是否有用和好
祝你好运。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)