【问题标题】:Scraping a table appearing on click with python使用python抓取点击时出现的表格
【发布时间】:2017-09-10 14:35:19
【问题描述】:

我想从这个page 中抓取信息。

具体来说,我想抓取当您单击“TOP 10 HOLDINGS”下的“查看全部”时出现的表格(您必须在页面上向下滚动一点)。

我是 webscraping 的新手,并尝试使用 BeautifulSoup 来做到这一点。但是,似乎有一个问题,因为我需要考虑“onclick”功能。换句话说:我直接从页面中抓取的 HTML 代码不包含我要获取的表格。

我对下一步有点困惑:我应该使用 selenium 之类的东西,还是可以以更简单/更有效的方式处理这个问题?

谢谢。

我当前的代码:

from bs4 import BeautifulSoup
import requests


Soup = BeautifulSoup
my_url = 'http://www.etf.com/SHE'
page = requests.get(my_url)
htmltxt = page.text

soup = Soup(htmltxt, "html.parser")
print(soup)

【问题讨论】:

  • api:'http://www.etf.com/view_all/holdings/SHE',但必须有my_url作为referer。

标签: python html selenium beautifulsoup scrape


【解决方案1】:

您可以从 api 获得 json 响应:http://www.etf.com/view_all/holdings/SHE。您要查找的表位于'view_all'

import requests
from bs4 import BeautifulSoup as Soup

url = 'http://www.etf.com/SHE'
api = "http://www.etf.com/view_all/holdings/SHE"
headers = {'X-Requested-With':'XMLHttpRequest', 'Referer':url}
page = requests.get(api, headers=headers)
htmltxt = page.json()['view_all']
soup = Soup(htmltxt, "html.parser")
data = [[td.text for td in tr.find_all('td')] for tr in soup.find_all('tr')]

print('\n'.join(': '.join(row) for row in data))

【讨论】:

  • 后续问题:在同一页面上,我想检索部门和国家/地区的数据。两者的格式相同。我可以为这些使用类似的 API 吗?以及如何查看 API 是否可用?
  • @Emjora 您必须检查网络流量(单击检查 > 网络 > xhr)。所以部门的api应该是http://www.etf.com/etf-chart/top-10-sectors-json/SHE,国家的api应该是http://www.etf.com/etf-chart/top-10-countries-json/SHE
猜你喜欢
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 2016-01-31
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多