Selenium Python Скачать всплывающее PDF-файл с определенным именем файла - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно загрузить набор отдельных файлов PDF с веб-страницы.Он является общедоступным правительством (министерство образования Турции), поэтому он полностью легален.

Однако мой браузер селена отображает только файл PDF, как я могу скачать его и назвать по своему желанию.

(Этот код также из Интернета)

# Import your newly installed selenium package
from selenium import webdriver
from bs4 import BeautifulSoup


# Now create an 'instance' of your driver
# This path should be to wherever you downloaded the driver
driver = webdriver.Chrome(executable_path="/Users/ugur/Downloads/chromedriver")
# A new Chrome (or other browser) window should open up
download_dir = "/Users/ugur/Downloads/" # for linux/*nix, download_dir="/usr/Public"
options = webdriver.ChromeOptions()

profile = {"plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}], # Disable Chrome's PDF Viewer
               "download.default_directory": download_dir , "download.extensions_to_open": "applications/pdf"}
options.add_experimental_option("prefs", profile)



# Now just tell it wherever you want it to go
driver.get("https://odsgm.meb.gov.tr/kurslar/KazanimTestleri.aspx?sinifid=5&ders=29")
driver.find_element_by_id("ContentPlaceHolder1_dtYillikPlanlar_lnkIndir_2").click()
driver.get("https://odsgm.meb.gov.tr/kurslar/PDFFile.aspx?name=kazanimtestleri.pdf")

Заранее спасибо

Дополнительная информация:

У меня был код Python 2, который делал это отлично.Но каким-то образом он создает пустые файлы, и я не смог преобразовать его в python 3. Может быть, это помогает (без обид, но мне никогда не нравился селен)

import urllib
import urllib2
from bs4 import BeautifulSoup
import os


sinifId=5
maxOrd = 1
fileNames=[]
directory = '/Users/ugur/Downloads/Hasan'
print 'List of current files in directory '+ directory+'\n---------------------------------\n\n'
for current_file in os.listdir(directory):
    if (current_file.find('pdf')>-1 and current_file.find(' ')>-1):
        print current_file
        order = int(current_file.split(' ',1)[0])
        if order>maxOrd: maxOrd=order
        fileNames.append(current_file.split(' ',2)[1])

print '\n\nStarting download \n---------------------------------\n'
ctA=int(maxOrd+1)
for ders in [29]:
    urlSinif='http://odsgm.meb.gov.tr/kurslar/KazanimTestleri.aspx?sinifid='+str(sinifId)+'&ders='+str(ders)

    page = urllib2.urlopen(urlSinif)
    soup = BeautifulSoup(page,"lxml")
    st = soup.prettify()
    count=st.count('ctl00')-1
    dersAdi = soup.find('a', href='/kurslar/CevapAnahtarlari.aspx?sinifid='+str(sinifId)+'&ders='+str(ders)).getText().strip()

    for testNo in range(count):

        if(str(sinifId)+str(ders)+str(testNo+1) in fileNames):
            print str(ctA)+' '+str(sinifId)+str(ders)+str(testNo+1)+' '+dersAdi+str(testNo+1)+'.pdf'+' skipped'    
        else:

            annex=""
            if(testNo%2==1): annex="2"

            eiha_url = u'http://odsgm.meb.gov.tr/kurslar/KazanimTestleri.aspx?sinifid='+str(sinifId)+'&ders='+str(ders)
            data = ('__EVENTTARGET','ctl00$ContentPlaceHolder1$dtYillikPlanlar$ctl'+format(testNo, '02')+'$lnkIndir'+annex), ('__EVENTARGUMENT', '39')

            print 'ctl00$ContentPlaceHolder1$dtYillikPlanlar$ctl'+format(testNo, '02')+'$lnkIndir'+annex

            new_data = urllib.urlencode(data)
            response = urllib2.urlopen(eiha_url, new_data)


            urllib.urlretrieve (str(response.url), directory+'/{0:0>3}'.format(ctA)+' '+str(sinifId)+str(ders)+str(testNo+1)+' '+dersAdi+str(testNo+1)+'.pdf')
            print str(ctA)+' '+str(sinifId)+str(ders)+str(testNo+1)+' '+dersAdi+str(testNo+1)+'.pdf'+' downloaded'
            ctA=ctA+1

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Добавьте параметры перед запуском Chrome, а затем укажите параметр chrome_options.

download_dir = "/Users/ugur/Downloads/"
options = webdriver.ChromeOptions()

profile = {"plugins.plugins_list": [{"enabled": False, "name": "Chrome PDF Viewer"}], 
           "download.default_directory": download_dir,
          "download.extensions_to_open": "applications/pdf"}
options.add_experimental_option("prefs", profile)

driver = webdriver.Chrome(
    executable_path="/Users/ugur/Downloads/chromedriver",
    chrome_options=options
)

Чтобы ответить на второй вопрос:

Могу я спросить, кактакже укажите имя файла?

Я нашел это: Селен дает имя файла при загрузке

Что я делаю:

file_name = ''
while file_name.lower().endswith('.pdf') is False:
    time.sleep(.25)
    try:
        file_name = max([download_dir + '/' + f for f in os.listdir(download_dir)], key=os.path.getctime)
    except ValueError:
        pass
0 голосов
/ 24 сентября 2018

Решение без содержания селена. Вы можете сделать что-то вроде:

import requests
pdf_resp = requests.get("https://odsgm.meb.gov.tr/kurslar/PDFFile.aspx?name=kazanimtestleri.pdf")
with open("save.pdf", "wb") as f:
    f.write(pdf_resp.content)

Хотя вы, возможно, захотите проверить тип содержимого, прежде чем убедиться, что это pdf

...