使用python从网页中提取csv下载链接

Posted

技术标签:

【中文标题】使用python从网页中提取csv下载链接【英文标题】:extracting csv download link from an webpage using python 【发布时间】: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 方法读取它 【参考方案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 太好了,不客气!!

以上是关于使用python从网页中提取csv下载链接的主要内容,如果未能解决你的问题,请参考以下文章

python 怎么网页下载文件.

从 Python3 中的 .zip 文件中提取和读取 [重复]

百度云盘下载工具

如何通过自动下载链接使用 Python 访问 PDF 文件?

Python - 网页抓取 - BeautifulSoup & CSV

用python解压html链接