【问题标题】:Python - How to use scrape table from website with dropdown of available rowsPython - 如何使用网站上的抓取表以及可用行的下拉列表
【发布时间】:2022-01-05 16:59:09
【问题描述】:

我正在尝试从 zacks.com 的表格中抓取收入日历数据,网址附在下面。

https://www.zacks.com/stock/research/aapl/earnings-calendar

问题是我试图从表中抓取所有数据,但它有一个下拉列表可以选择页面上的 10、25、50 和 100 行。理想情况下,我想抓取所有 100 行,但是当我从下拉列表中选择 100 时,url 不会改变。我的代码如下。

要注意该网站阻止了用户代理,因此我不得不使用 chrome 驱动程序来模拟访问网络的人。从 pd.read_html 获得的结果是所有表的列表,并且 d[4] 返回只有 10 行的收益日历(我想将其更改为 100)

driver = webdriver.Chrome('../files/chromedriver96')
symbol = 'AAPL'
url = 'https://www.zacks.com/stock/research/{}/earnings-calendar'.format(symbol)
driver.get(url)
content = driver.page_source
d = pd.read_html(content)
d[4]

所以请任何人帮助来指导我

谢谢!


更新:由于缺乏清晰的表述和显示过去研究的证据,我的上一篇文章似乎被降级了。也许我仍然是在这个网站上发布问题的新手。实际上,我已经找到了几个页面,包括这个 page 有同样的问题,但解决方案似乎对我不起作用,这就是为什么我来发布这个作为一个新问题


更新 12/05: 非常感谢您的建议。正如下面评论的那样,我终于让它工作了。下面是我使用的代码

dropdown = driver.find_element_by_css_selector('#earnings_announcements_earnings_table_length')
time.sleep(1)
hundreds = dropdown.find_element_by_xpath(".//option[. = '100']")
hundreds.click()

【问题讨论】:

  • 查看可能发生的情况的一种方法是在浏览器的开发控制台中,查看当您从下拉菜单中的 10 更改为 100 时该页面发出的请求。当我看到这个时,页面似乎没有提出任何新请求。对我来说,这表明这 100 行已经存储在 javascript 中,并且仅在用户更改显示选项时显示。
  • 没错。我做了同样的事情,但看到的和你看到的一样,即没有新的请求。关于如何从 javascript 中取出数据的任何想法?

标签: python web-scraping web-crawler


【解决方案1】:

看过之后,这不会是容易刮掉的东西。鉴于该表是由 javascript 生成的,我会说您有两个选择。

选项一:

使用 selenium 呈现允许 javascript 运行的页面。这样,您可以简单地使用下拉列表的 id/class 与之交互。 然后,您可以通过查看表中的值来抓取数据。

选项二:

这是更具挑战性的一个。查看页面响应的数据,并尝试查找导致您随后在页面上看到的数据的请求。通过交叉引用这些,将有一种方法可以直接请求您想要的数据。 您可能会发现,要获取您想要的数据,您需要接受从原始请求到页面的密钥,然后将该密钥作为第二个请求的一部分发送。这种方式应该允许您抓取数据,而无需运行将更有效地运行的 selenium 实例。

我个人的建议是选择选项一,因为计算机资源便宜而开发人员时间昂贵。

【讨论】:

  • 非常感谢您的建议。我尝试了选项#1,实际上我已经研究了一点javascript。它现在终于可以工作了。我做的是用Selenium模拟鼠标点击“show”100选项,然后抓取数据表。
猜你喜欢
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
相关资源
最近更新 更多