我试图从网站获取链接,但 BeautifulSoup 返回空内容。 是网页阻止了它还是有一些javascript? 如何获取链接?
page = requests.get(url='https://finbox.com/NASDAQGS:AAPL')
soup = BeautifulSoup(page, "lxml").find_all("a", href=True)
答案 0 :(得分:1)
页面需要JS来渲染。尝试在浏览器中禁用 JS,页面将拒绝加载。 request.get
不运行任何东西。这只是一个初始文件请求。您可能想考虑使用 Selenium 在无头浏览器中呈现 JS。
答案 1 :(得分:1)
您可以通过他们的下划线 API 获取几乎所有数据。如果您查看网络 Press (Ctrl + Shift + I), then select Network and filter XHR
,您会看到该网页从直接调用中获取数据。
要获取您要查找的数据,只需观察网页如何进行 GET 或 POST 调用。数据返回为json(python字典)。这意味着,您不必使用 Beautifulsoup 或 Selenium 对其进行清洁。
对于这些示例,您只需要 requests
或 httpx
:
import requests
# information about ticker
URL = 'https://makeshift.finbox.com/v4/assets/markets?ticker=NASDAQGS%3AAAPL'
r = requests.get(URL).json()
print(r)
# meta data
r = requests.get("https://makeshift.finbox.com/v4/seo/meta/NASDAQGS:AAPL").json()
print(r)
# post calls
headers = {"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"}
payload = {"category":"view","action":"ViewContent","label":"Company Page","value":0,"data":{"pathname":"/NASDAQGS:AAPL","search":"","ticker":"NASDAQGS:AAPL"}}
r = requests.post("https://finbox.com/_/api/v4/users/events", headers=headers, data=payload).json()
print(r)
# another
payload = {"query":"\n query loadAssetPeerBenchmarks ($ticker: String!, $currency: String) {\n asset: company (ticker: $ticker, currency: $currency) {\n ticker\n is_subscribed\n stats\n }\n }\n ",
"variables":{"ticker":"NASDAQGS:AAPL"}}
r = requests.post("https://finbox.com/_/api/v4/query?raw=true", headers=headers, json=payload).json()
print(r)