我使用selenium和firefox网络驱动程序编写了一个程序。
def dowloadFile(link):
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.folderList', 2) # custom location
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.download.dir', '/tmp')
profile.set_preference('browser.helperApps.neverAsk.saveToDisk',
'application/pdf')
driver = webdriver.Firefox(profile)
#driver.set_window_position(-10000,0)
driver.get(link)
s = BeautifulSoup(driver.page_source, "html.parser")
st=s.find('div',{"class":"bloc-docs-link bloc-250"})
#print("hadiii ST: "+str(st))
x=st.find('a')
fm=x.get('href')
fm="https://www.marchespublics.gov.ma/"+fm
driver.get(fm)
driver.quit()
我的函数将链接作为参数,然后获取该链接,最后找到另一个下载文件的链接。 我的问题是,即使我设置我的firefox的首选项,它总是在下载时继续显示对话框,以确认我是否要保存它!我不知道该怎么做,所以我可以在没有这个对话框的情况下下载文件。
请帮忙。提前谢谢。
答案 0 :(得分:1)
我也遇到过这个问题。我刚刚完成了这个。注意:它确实需要更多时间,所以如果你有大量的文件正在下载,这可能不值得。否则,这将成功。
创建一个可以在对话框中使用的警报对象,例如:
alert = driver.switch_to_alert()
导入预期条件:
from selenium.webdriver.support import expected_conditions as EC
然后,创建一个指示浏览器等待直到提示预期条件(警报)的函数。
WebDriverWait(browser, 3).until(EC.alert_is_present()
except TimeoutException:
最好把它作为try / except块,但不是强制性的。
然后,在selenium控制警报窗口后,只需使用警报对象的'accept'方法确认下载:
alert.accept()
该功能可能如下所示:
try:
alert = driver.switch_to_alert()
alert_wait()
alert.accept()
except print('No alertfound')
此外,我强烈建议您使用requests / BeautifulSoup模块,这样您就不必渲染浏览器并体验浏览大量网页所带来的延迟。请求模块在幕后完成所有操作。如果您需要在下载前输入密码,这会变得棘手。如果没有,BeautifulSoup库非常适合抓取标签/ href,在列表中收集它们,然后使用类似的requests.get()方法逐个循环它们。
事实上,我上次遇到这个问题时,我使用了请求模块而不是selenium,并且自动接受了警报窗口。快速闪电。
答案 1 :(得分:0)
首先,你为什么要使用beautifulsoup?!利用n1=range(0,49)
n=n1[1::6]
x1=range(1,44)
x=x1[::6]
print (zip(x,n))
其次,请确认您目标的PDF文件实际上具有适当的mimetype。见http://yizeng.me/2014/05/23/download-pdf-files-automatically-in-firefox-using-selenium-webdriver/