python - 如何让 selenium 打开一个浏览器并继续使用该浏览器,而不是为每个 url/scrape javascript 加载一个新浏览器
问题描述
我有以下代码,我正在尝试抓取一个 xls 文件,据我所知,我必须使用 selenium。
该网站使用以下代码获取文件:
function GetQuote() {
$('#lblError').html('');
$('#lblError2').html('');
if ($('#txtTicker') != null && $('#txtTicker').val() != null && $('#txtTicker').val().trim() != ''){
trackGAEventGbl('quote-table-download', $('#txtTicker').val(), 'download');
var frm = document.forms[0];
if (window.location.href.indexOf('?') > -1) {
frm.action = window.location.pathname;
}
frm.submit();
return true;
}
else {
alert('Please enter a Stock or Index Symbol.');
return false;
}
}
如果不使用硒,我没有任何运气来刮这个。但是,我发现代码需要很长时间才能完成,因为我关注的公司相当多。而且每次我使用下面的代码使用 selenium 时,它都会打开和关闭一个新的 chrome 实例。有没有办法可以加快速度?
def get_file(ticker, url):
chrome_driver_path=r"D:\Program Files\chromedriver\84\chromedriver.exe"
options = webdriver.ChromeOptions()
options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(chrome_driver_path, options=options)
driver.get(url)
source = driver.page_source
inputElement = driver.find_element_by_id('txtTicker')
inputElement.send_keys(ticker)
inputElement.submit()
tickers = [line.rstrip() for line in open(r"C:\Python38\Projects\ticker_list.txt", "r")]
for ticker in tickers:
get_file(ticker)
if os.path.exists(r'C:\Users\Downloads\quotedata.dat'):
if os.stat(r'C:\Users\Downloads\quotedata.dat').st_size != 0:
df = pd.read_csv(r'C:\Users\Downloads\quotedata.dat',
header=None, sep=',', engine='python',skiprows=2)
new_header = df.iloc[0]
df = df[1:]
df.columns = new_header
print(df)
store_path = r"D:\Data\US\Option Data\{}\{} data.csv".format(ticker,ticker)
print(store_path)
df.to_csv(store_path, index = False)
os.remove(r"C:\Users\Downloads\quotedata.dat")
count = count + 1
print("Processed {} / {} Tickers".format(count, len_tickers))
解决方案
只需driver
在脚本开头定义一次,然后在get_file
函数中使用它:
chrome_driver_path=r"D:\Program Files\chromedriver\84\chromedriver.exe"
options = webdriver.ChromeOptions()
options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(chrome_driver_path, options=options)
def get_file(ticker, url):
driver.get(url)
...
tickers = [line.rstrip() for line in open(r"C:\Python38\Projects\ticker_list.txt", "r")]
for ticker in tickers:
get_file(ticker)
...
推荐阅读
- mongodb - 将条件推入数组
- python - 如何在 PyQt5 中使用多个窗口?通过多个窗口传递值和调用其他模块中的模块
- excel - 更新后禁用带有证书的宏
- html - 将表头固定为带有三个点的两行
- javascript - 将尺寸线从多边形上移开
- mysql - 使用带有 SQL 的特定标签查找最活跃的用户
- c++ - static_cast 转换为错误的数据类型,但结果仍然正确?
- firebase - 通过电子邮件地址的一部分查找 firebase 用户?
- javascript - 在我使用 .html() 更新后,浏览器对新行数的响应速度较慢。你能帮我看看我的错误吗?
- python - 获取在脚本本身内部执行 python 脚本的命令