在 Python 中抓取具有可点击内容的网站
Posted
技术标签:
【中文标题】在 Python 中抓取具有可点击内容的网站【英文标题】:Scraping a website with clickable content in Python 【发布时间】:2015-05-12 18:07:34 【问题描述】:我想废弃以下网站的内容:
http://financials.morningstar.com/ratios/r.html?t=AMD
在 Key Ratios 下,我想点击“增长”按钮,然后在 Python 中抓取数据。
我该怎么做?
【问题讨论】:
尝试使用Firefox中的HttpFox工具栏查找调用的URL,但没有多大成功。谢谢。 附带一点评论:BBG 也以更容易抓取的格式提供此功能,但令人惊讶的是,晨星早在 10 年前就提供了它。很有趣。 【参考方案1】:你可以用requests
+BeautifulSoup
解决它。有一个异步的GET
请求发送到您需要模拟的http://financials.morningstar.com/financials/getKeyStatPart.html 端点。 Growth
表位于 div
内,id="tab-growth"
:
from bs4 import BeautifulSoup
import requests
url = 'http://financials.morningstar.com/ratios/r.html?t=AMD'
keystat_url = 'http://financials.morningstar.com/financials/getKeyStatPart.html'
with requests.Session() as session:
session.headers = 'User-Agent': 'Mozilla/5.0 (Linux; U; android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
# visit the target url
session.get(url)
params =
'callback': '',
't': 'XNAS:AMD',
'region': 'usa',
'culture': 'en-US',
'cur': '',
'order': 'asc',
'_': '1426047023943'
response = session.get(keystat_url, params=params)
# get the HTML part from the JSON response
soup = BeautifulSoup(response.json()['componentData'])
# grab the data
for row in soup.select('div#tab-growth table tr'):
print row.text
【讨论】:
这是一个很好的答案,alecxe。您是如何找到keystat_url = 'http://financials.morningstar.com/financials/getKeyStatPart.html'
的以及您是如何找到 params
的?如果我想要另一家公司的数据而不是 AMD,比如说 AAPL,params
会保持不变吗?最后你是怎么想出session.headers
的内容的?非常感谢您的帮助。
@TJ1 第一步是通过获取http://financials.morningstar.com/ratios/r.html?t=AMD
页面来确定requests
是否会为我提供所需的div#tab-growth
。数据不存在,这意味着它是异步加载的——我使用浏览器开发工具检查在页面加载期间发送了哪些请求,并发现了对 getKeyStatPart
端点的 XHR 请求——检查了参数并在代码中重复了它们. User-Agent
标头只是为了伪装成浏览器(不确定在这种情况下是否需要)。
@TJ1 如果您要更改公司,您还需要更改t
参数值。
1426047023943
在params
列表中的值是多少?我可以省略这个吗?
@TJ1 当然,谢谢。由于这是一个JSONP
- 回调值会影响实际响应 - 在jsonp1426046772712
值的情况下 - json 响应将像jsonp1426046772712([...json..])
这样包裹。如果callback
值为空,我们会得到一个可以直接使用response.json()
读取的纯JSON。希望这是有道理的。以上是关于在 Python 中抓取具有可点击内容的网站的主要内容,如果未能解决你的问题,请参考以下文章