Beautiful Soup 内容为空,无法抓取此网页,他们会阻止吗?

时间:2021-02-21 11:38:34

标签: python python-3.x web-scraping beautifulsoup

我试图从网站获取链接,但 BeautifulSoup 返回空内容。 是网页阻止了它还是有一些javascript? 如何获取链接?

page = requests.get(url='https://finbox.com/NASDAQGS:AAPL')
soup = BeautifulSoup(page, "lxml").find_all("a", href=True)

2 个答案:

答案 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 对其进行清洁。

对于这些示例,您只需要 requestshttpx

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)
相关问题