我有一个包含许多网址的列表,每个网址都包含一个我要下载的pdf。我给你两个给你提供尝试的东西:
我正在使用硒与firefox这样做,我已经尝试了几种方法。起初我进入页面并点击每个pdf的下载按钮。然而,一段时间后,Firefox因为超载而停止并关闭,即使有time.sleep(1-2秒),它似乎也会中断。
所以我在firefox的设置中选择只在网址收费时下载文件(只需写入网址,文件开始下载)。然后我用webdriver导入firefox配置文件以进行此配置,从而减轻了循环中firefox的工作。
这是我的CODE:
from selenium import webdriver
from selenium.webdriver.firefox.webdriver import FirefoxProfile
profile = FirefoxProfile('C:/Users/xe64570/AppData/Roaming/Mozilla/Firefox/Profiles/bya1fhim.default')
browser = webdriver.Firefox(profile)
for i in urls:
browser.get(i)
问题:
执行第一个browser.get(i)
后,第一个pdf被下载,但脚本停止没有任何错误,比如“仍在等待”。我说等待,因为看起来好像页面没有在webdriver的眼中充电。第一个文件刚刚获得,但浏览器中没有任何反应,因此似乎“继续思考”页面尚未收费,并且必须等到它发生。所以它仍然停滞不前。
怎么可以避免这个?
非常感谢
答案 0 :(得分:1)
这些网址可以在没有浏览器帮助的情况下下载,因此您可以完全避免硒复杂化。这是一个可以使用更多异常处理但可以抓取这些网址的示例。
import requests
import multiprocessing.pool
import contextlib
# randomly choosing max parallel downloads...
PARALLEL_DOWNLOADS = 4
def download_pdf(url):
with contextlib.closing(requests.get(url, stream=True)) as resp:
if resp.status_code//100 != 2:
return "failed {}".format(reps.status_code)
if resp.headers['Content-Type'] != 'application/pdf':
return "not a pdf"
# this app returns pdf name in content-disposition
disp = resp.headers['Content-Disposition']
if 'filename=' in disp:
filename = disp.split('=')[1].strip().strip('"')
else:
return "unknown filename"
print("downloading", filename, "...")
with open(filename, 'wb') as fp:
for chunk in resp.iter_content():
fp.write(chunk)
return filename
urls = ["https://api.fundinfo.com/document/7cce253b158e363bbb16114aef68e603_107896/KID_ES_es_ES0115114003_YES_2015-09-18.pdf?apiKey=509a6b5360d1d850ae303d8af3652c37",
"https://api.fundinfo.com/document/bbc2aab2a5273e44d5b002946ea86071_901674/AR_ES_es_ES0156873004_YES_2014-12-31.pdf?apiKey=509a6b5360d1d850ae303d8af3652c37"
]
if __name__=="__main__":
pool = multiprocessing.pool.ThreadPool(min(len(urls), PARALLEL_DOWNLOADS))
for result in pool.map(download_pdf, urls, chunksize=1):
print(result)
pool.close()