【问题标题】:Selenium not displaying table content after button clickSelenium 在按钮单击后不显示表格内容
【发布时间】:2020-12-18 23:43:52
【问题描述】:

我正在尝试从以下 url 下载多个 csv 文件,并希望使用 selenium 或任何其他方法。该网址需要填写一个表格,其中包括从多个下拉列表中选择选项。然后,需要单击“图像”按钮才能显示下载链接。 如果我从 python 运行 selenium chrome 驱动程序并单击按钮,则不会出现任何内容。我也无法弄清楚 csv 文件的 url,因此可以使用“requests”或“urllib”下载它们。

这是我需要下载的网址: https://www1.nseindia.com/products/content/derivatives/equities/historical_fo.htm

到目前为止,这是我的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

url = 'https://www1.nseindia.com/products/content/derivatives/equities/historical_fo.htm'
driver.get(url)
instr_type = Select(driver.find_element_by_id('instrumentType'))
symbol = Select(driver.find_element_by_id('symbol'))
opt_type = Select(driver.find_element_by_id('optionType'))
date_range = Select(driver.find_element_by_id('dateRange'))
button = driver.find_element_by_xpath("//input[@src='/common/images/btn-get-data.gif' and @type='image']")

instr_type.select_by_visible_text('Index Options')
symbol.select_by_visible_text('NIFTY 50')
opt_type.select_by_visible_text('CE')
date_range.select_by_visible_text('90 Days')
button.click()

这就是 selenium 驱动程序中发生的事情 -

关于如何从上面的链接下载 csv 文件有什么想法吗?不一定必须使用硒。

【问题讨论】:

  • 您点击它时没有收到任何错误消息吗?您是否等待/睡觉以获取下载链接?
  • 当我将 Selenium 与 Chrome 或 Firefox 一起使用时,此页面对我不起作用,但它在没有 Selenium 的 Chrome 和 Firefox 中工作 - 它可能与 Selenium 有一些冲突,或者它使用某些系统来阻止脚本使用硒
  • 我可以使用 requests 将表格作为 HTML 获取,但我必须设置正确的 user-agent - 至少短 'User-Agent': 'Mozilla/5.0'。没有user-agent,代码就会挂起,永远不会结束。也许带有 Selenium 的浏览器也有类似的问题。但不知道能不能修好。
  • 我看到它使用 JavaScript 从这个 HTML 中获取数据并生成转换为 base64 并直接嵌入到链接中的 CSV。因此,也许使用BeautifulSouplxml 获取带有数据的HTML 和抓取数据会更快更简单。

标签: python selenium csv button python-requests


【解决方案1】:

我不知道如何解决 Selenium 的问题,但我现在如何解决 requestsBeautifulSoup 的问题

此页面将表单中的选项作为值直接发送到此 URL 中(而不是 POST

https://www1.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp

然后服务器发回HTML 和表以及<div id="csvContentDiv"> 中的所有数据。
此标签的所有数据都已格式化为文本格式以保存在 csv 中 - 它只需将 : 替换为 \n


编辑:

有时服务器会给我Status 405 Method Not Allowed,所以我添加了requests.Session() 来获取cookie,也许它会更好。


import requests
from bs4 import BeautifulSoup

session = requests.Session()
session.headers.update({'User-Agent': 'Mozilla/5.0'})

# --- main page ---
url = 'https://www1.nseindia.com/products/content/derivatives/equities/historical_fo.htm'
r = session.get(url)
#print(r.status_code)

# --- table ---

url = 'https://www1.nseindia.com/products/dynaContent/common/productsSymbolMapping.jsp'

payload = {
    'instrumentType': 'OPTIDX',
    'symbol': 'NIFTY',
    'expiryDate': 'select',
    'optionType': 'CE',
    'strikePrice': '',
    'dateRange': '3month', 
    'fromDate': '',
    'toDate': '',
    'segmentLink': '9',
    'symbolCount':'',
}

r = session.get(url, params=payload)
#print(r.text)

soup = BeautifulSoup(r.text, 'html.parser')
data = soup.find('div', {'id': 'csvContentDiv'})
#print(data.text)
data = data.text.replace(':', '\n')

with open('output.csv', 'w') as fh:
    fh.write(data)

print(data)

如果你不使用真正的User-Agent,服务器不会发送数据 - 至少是短的'Mozilla/5.0'


我在 Firefox/Chrome 中使用DevTools 找到了这个网址,标签Network。后来我从这个 url 得到响应并手动检查我得到的结果,我发现了 csv 数据。但我预计我必须在此响应中从 HTML 表中抓取数据。

【讨论】:

  • 谢谢。上面的代码似乎出现了“HTTP Status 405 Method Not Allowed”错误。我错过了什么?
  • 正如我所说的 - 可能它会检查 cookie,所以现在在回答中我添加了 Session() 并在读取带有数据的 url 之前读取了您的原始 url。通过这种方式,它使用 cookie 发送请求。当我测试旧版本时,我在浏览器中打开了原始页面,也许服务器认为一切正常。但现在即使我关闭浏览器,它也对我有用。
  • 这段代码看起来没问题,但如果您仍然收到错误 405,那么服务器可能会检查更多内容(即 XHR reuqests 的标头)或者服务器对某些地区的用户更受限制 - 我从波兰连接。
  • 我刚刚注意到更新的答案。感谢您的编辑...不幸的是,我仍然遇到同样的错误。也许它受我所在地区的限制,或者我可能没有使用正确的标题。如果还有什么我可以尝试的,请告诉我。
猜你喜欢
  • 2017-05-10
  • 2021-09-21
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 2015-09-27
相关资源
最近更新 更多