【问题标题】:extracting csv download link from an webpage using python使用python从网页中提取csv下载链接
【发布时间】:2022-01-13 10:22:15
【问题描述】:

我想从网站提取 CSV 下载 URL - https://www.nseindia.com/option-chain

enter image description here

我现在使用的代码

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
s = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=s)
driver.get("https://www.nseindia.com/option-chain")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.ID, 
"equity_underlyingVal")))
nifty = (driver.find_element(By.XPATH, '//* 
[@id="equity_underlyingVal"]').text).replace('NIFTY ', 
'').replace(',','')
time_stamp = driver.find_element(By.XPATH, '//* 
[@id="equity_timeStamp"]').text

我需要在 pandas df 中加载 csv 链接。我不想使用硒,或者如果使用硒,我需要它作为无头。让我知道是否有人对将数据直接提取到 pandas 数据流有更好的想法..

【问题讨论】:

  • 你能贴出你到目前为止制作的代码吗?你在哪里卡住了?
  • 我已经编辑了帖子并添加了代码,还添加了一张描述我需要提取的目标链接的图片
  • 为什么不使用 selenium 点击“下载 (.csv)”并编写代码到文件下载位置并读取文件?
  • 我尝试在无头选项中使用点击事件,但它在那里不起作用。我希望它在后台进程中运行.. 没有打开 chrome 驱动程序,这就是为什么如果我得到直接 csv 链接,那么我可以使用 pandas read csv 方法读取它

标签: python selenium beautifulsoup


【解决方案1】:

您可以使用 Selenium 提取该元素中包含的下载链接,如下所示:

link = driver.find_element(By.CSS_SELECTOR, '#downloadOCTable').get_attribute("href")

【讨论】:

  • href 属性中没有指向 csv 的链接。它使用 JavaScript。
  • 我直接从元素属性中复制出来,粘贴到新的空白标签上,点击回车——csv文件下载正确。
【解决方案2】:

由于href 属性中不存在下载链接,因此最好的方法是下载 csv 文件。

如果未指定window-size 参数,则在无头模式下交互可能会导致问题,而在headless 模式下下载文件的解决方法是使用driver.command_executor 方法指定下载路径。

代码 sn-p 以无头模式下载 csv-

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import os

options = Options()

#add necessary arguments
options.add_argument("user-agent= Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36")
options.add_argument("--window-size=1920,1080")
options.add_argument("--headless")

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

driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

#set download path (set to current working directory in this example)
params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow','downloadPath':os.getcwd()}}
command_result = driver.execute("send_command", params)

driver.get("https://www.nseindia.com/option-chain")

#wait for table details to appear
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="equity_optionChainTable"]')))

#find and click on download csv button
download_button=driver.find_element_by_xpath('//*[@id="downloadOCTable"]')
download_button.click()

【讨论】:

  • 我尝试使用此代码,但无法正常工作。有时它会下载 1kb 的文件 csv 文件。下载未完成时可以按住浏览器吗?
  • 我在本节更改了 XPATH - #wait for table details to appear WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="equity_underlyingVal"]'))) 现在它对我有用。谢谢@Kamalesh S
  • @ParthaSingha 太好了,不客气!!
猜你喜欢
  • 2019-04-12
  • 2014-06-21
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2011-04-14
  • 2023-03-18
相关资源
最近更新 更多