我的代码在“.get”(webdriver)之后停止运行并下载页内pdf

时间:2017-04-24 16:57:14

标签: python python-2.7 selenium firefox

我有一个包含许多网址的列表,每个网址都包含一个我要下载的pdf。我给你两个给你提供尝试的东西:

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

我正在使用硒与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的眼中充电。第一个文件刚刚获得,但浏览器中没有任何反应,因此似乎“继续思考”页面尚未收费,并且必须等到它发生。所以它仍然停滞不前。

怎么可以避免这个?

非常感谢

1 个答案:

答案 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()