首页 > 解决方案 > 为两个不同的按钮 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)

标签: pythonweb-scrapingbeautifulsoup

解决方案


网站所有数据加载一次,然后用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 的脚本标记。


推荐阅读