使用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 appearWebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, '//*[@id="equity_underlyingVal"]')))
现在它对我有用。谢谢@Kamalesh S
@ParthaSingha 太好了,不客气!!以上是关于使用python从网页中提取csv下载链接的主要内容,如果未能解决你的问题,请参考以下文章
从 Python3 中的 .zip 文件中提取和读取 [重复]
如何通过自动下载链接使用 Python 访问 PDF 文件?