|

网页抓取或许是一个相当简单的编程问题:在文档的源代码中搜索唯一标识符,提取相关数据,但我认为存在一个更“懒惰”的解决方案——更简单,更快,可以生成更多数据。
雅虎财经是财务数据做得最好的网站之一,这也让它成为金融爱好者进行网页抓取的主要目标。几乎每天都有关于StackOverflow的问题,抓取数据的人参考了雅虎财经的某种数据检索(通常是通过网络抓取)。
网页抓取问题1
网页抓取者尝试查找Facebook当前的股票价格。代码如下:
-
import requests
-
from bs4 importBeautifulSoup
-
defparsePrice():
-
r = requests.get("https://finance.yahoo.com/quote/FB?p=FB")
-
soup =BeautifulSoup(r.text, "lxml")
-
price = soup.find( div , { class : My(6px) Pos(r)smartphone_Mt(6px) }).find( span ).text
-
print(f the current price: {price} )
该代码输出如下:
-
the current price: 216.08
使用简单的网页抓取解决方案非常简单,但这还不够“懒惰”,让我们看下一个。
网页抓取问题2
网页抓取者正在尝试从统计标签中查找有关股票的企业价值和空头股票数量的数据。他的问题实际上是检索可能存在或不存在的嵌套字典值,但是在检索数据上,他似乎已经找到了更好的解决方法。
-
import requests, re, json, pprint
-
p = re.compile(r root.App.main =(.*); )
-
tickers = [ AGL.AX ]
-
results = {}
-
with requests.Session() as s:
-
for ticker in tickers:
-
r = s.get( https://finance.yahoo.com/quote/{}/key-statistics?p={} .format(ticker,ticker))
-
data = json.loads(p.findall(r.text)[0])
-
key_stats = data[ context ][ dispatcher ][ stores ][ QuoteSummaryStore ]
-
print(key_stats)
-
res = {
-
Enterprise Value : key_stats[ defaultKeyStatistics ][ enterpriseValue ][ fmt ]
-
, Shares_Short : key_stats[ defaultKeyStatistics ][ sharesShort ].get( longFmt , N/A )
-
}
-
results[ticker] = res
-
print(results)
看第3行:网页抓取者能够在javascript的变量内找到他要查找的数据:
-
root.App.main = {.... };
在那里,只需访问字典中适当的嵌套键,即可轻松检索数据。但是,确实还有更“懒惰”的办法。
“懒惰”的解决方案1
-
import requests
-
r = requests.get("https://query2.finance.yahoo.com/v10/finance/quoteSummary/FB?modules=price")
-
data = r.json()
-
print(data)
-
print(f"the currentprice: {data[ quoteSummary ][ result ][0][ price ][ regularMarketPrice ][ raw ]}")
看看第三行的URL,输出如下:
-
{
-
quoteSummary : {
-
error : None,
-
result : [{
-
price : {
-
averageDailyVolume10Day : {},
-
averageDailyVolume3Month : {},
-
circulatingSupply : {},
-
currency : USD ,
-
currencySymbol : $ ,
-
exchange : NMS ,
-
exchangeDataDelayedBy :0,
-
exchangeName : NasdaqGS ,
-
fromCurrency : None,
-
lastMarket : None,
-
longName : Facebook,Inc. ,
-
marketCap : {
-
fmt : 698.42B ,
-
longFmt : 698,423,836,672.00 ,
-
raw : 698423836672
-
},
-
marketState : REGULAR ,
-
maxAge : 1,
-
openInterest : {},
-
postMarketChange : {},
-
postMarketPrice : {},
-
preMarketChange : {
-
fmt : -0.90 ,
-
raw : -0.899994
-
},
-
preMarketChangePercent :{
-
fmt : -0.37% ,
-
raw : -0.00368096
-
},
-
preMarketPrice : {
-
fmt : 243.60 ,
-
raw : 243.6
-
},
-
preMarketSource : FREE_REALTIME ,
-
preMarketTime :1594387780,
-
priceHint : {
-
fmt : 2 ,
-
longFmt : 2 ,
-
raw : 2
-
},
-
quoteSourceName : Nasdaq Real Time
-
Price ,
-
quoteType : EQUITY ,
-
regularMarketChange : {
-
fmt : 0.30 ,
-
raw : 0.30160522
-
},
-
regularMarketChangePercent : {
-
fmt : 0.12% ,
-
raw : 0.0012335592
-
},
-
regularMarketDayHigh : {
-
fmt : 245.49 ,
-
raw : 245.49
-
},
-
regularMarketDayLow : {
-
fmt : 239.32 ,
-
raw : 239.32
-
},
-
regularMarketOpen : {
-
fmt : 243.68 ,
-
raw : 243.685
-
},
-
regularMarketPreviousClose : {
-
fmt : 244.50 ,
-
raw : 244.5
-
},
-
regularMarketPrice : {
-
fmt : 244.80 ,
-
raw : 244.8016
-
},
-
regularMarketSource : FREE_REALTIME ,
-
regularMarketTime :1594410026,
-
regularMarketVolume : {
-
fmt : 19.46M ,
-
longFmt : 19,456,621.00 ,
-
raw : 19456621
-
},
-
shortName : Facebook,Inc. ,
-
strikePrice : {},
-
symbol : FB ,
-
toCurrency : None,
-
underlyingSymbol : None,
-
volume24Hr : {},
-
volumeAllCurrencies : {}
-
}
-
}]
-
}
-
}the current price: 241.63
(编辑:我爱制作网_潮州站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|