python - 为两个不同的按钮 Web 抓取 Python
问题描述
我正在尝试从https://www.wsj.com/market-data/bonds/treasuries抓取数据。当我们选择选项时,此网站上有两个表格会切换:
1. Treasury Notes and Bond
2. Treasury Bills
我想抓取国库券的数据。但是当我单击该选项时,链接和属性或任何内容都没有变化。我已经尝试了很多东西,但每次,我都能够抓取美国国债和债券的数据。有人可以帮我吗?按照我的代码:
import re
import csv
import requests
import pandas as pd
from bs4 import BeautifulSoup
mostActiveStocksUrl = "https://www.wsj.com/market-data/bonds/treasuries"
page = requests.get(mostActiveStocksUrl)
data = page.text
soup = BeautifulSoup(page.content, 'html.parser')
rows = soup.find_all('tr')
list_rows = []
for row in rows:
cells = row.find_all('td')
str_cells = str(cells)
clean = re.compile('<.*?>')
clean2 = (re.sub(clean, '',str_cells))
list_rows.append(clean2)
df = pd.DataFrame(list_rows)
df1 = df[0].str.split(',', expand=True)
解决方案
网站所有数据加载一次,然后用js更新表中的值
这是一个快速编写的代码:
import requests
from bs4 import BeautifulSoup
import json
mostActiveStocksUrl = "https://www.wsj.com/market-data/bonds/treasuries"
page = requests.get(mostActiveStocksUrl)
data = page.text
soup = BeautifulSoup(page.content, 'html.parser')
rows = soup.find_all('script') # we get all the script tags
importantJson = ''
for r in rows:
text = r.text
if 'NOTES_AND_BONDS' in text: # the scirpt tags containing the date, probably you can do this better
importantJson = text
break
# remove the non json stuff
importantJson = importantJson\
.replace('window.__STATE__ =', '')\
.replace(';', '')\
.strip()
#parse the json
jsn = json.loads(importantJson)
print(jsn) #json object containing all the data you need
我是怎么得出这个结论的?首先,我注意到在两个表之间切换不会向服务器发出 http 请求,这意味着数据已经存在。然后我检查了表格 html,发现只有一个表格,并且它的内容是动态变化的,这让我得出结论,这个数据已经在页面上。然后在源代码中进行简单搜索,我找到了包含 json 的脚本标记。
推荐阅读
- gps - 桥梁和立交桥的高程数据
- jenkins-pipeline - 如何使用 REST API 从 jfrog 工件中查找具有特定属性值的工件
- javascript - Nextjs 一行导入导出模块
- javascript - 用于 SEO 的 NuxtJS 和 Firestore 站点的 Rendertron
- nginx - 使用 Nginx 与 Redis 进行缓存,使用 Nginx 进行代理和负载平衡
- python-3.x - Azure devOps Build Pipeline 中的 Python 突变测试报告
- ios - 在滚动视图中查找最高的可见视图 [SwiftUI]
- c++ - C++ 试图将几个较小的、不同大小的数据块复制到一个较大的数据块中
- visual-studio-code - 打字时如何解决VScode终端滞后/断断续续的问题?
- c# - 将 httprequst 作为参数传递给函数(C#)