selenium python chorm重命名下载的pdf文件

现在可以用selenium下载论文,但是不知道怎么重名名。不知道selenium有没有自带这个功能。

如果用os模块的话,我下载的文件比较卡,可能要30多秒才能下完,需要延时命名,但是我又不希望影响爬虫程序运行时间。

能不能爬虫下载的时候把论文名也过滤出来,然后存一个对应的文件名列表,等爬完虫再重命名呢


from selenium import webdriver
import time
import json
import os
import datetime
number = 0
 
#--------------------------------------------------------------------------------
# 设置启动默认浏览器,chrome UserData路径
# profile_dir = r"C:\Users\Administrator\AppData\Local\Google\Chrome\User Data"  
# options = webdriver.ChromeOptions()
# options.add_argument("--user-data-dir=" + profile_dir)
# driver = webdriver.Chrome(chrome_options=options, executable_path="C:\Program Files         
#        (x86)\Google\Chrome\Application\chromedriver.exe")
#--------------------------------------------------------------------------------
 
# 设置下载路径
# 尝试过使用图片识别库,来验证验证码,成功率太低,改为手动输入
# https://segmentfault.com/a/1190000015489113?utm_source=tag-newest
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0,
         'download.default_directory': 'C:\\Users\Administrator\\Desktop\\requests_pwrd'}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe",chrome_options=options)
 
 
# def get_json():
    # """获取json配置文件中的key和value"""
    # {"a" :"a","a" :"a"}
    # json_file = json.load(open('haiwai_settings.json', 'r'))
    # keys_list = []
    # values_list = []
    # for key, value in json_file.items():
        # keys_list.append(str(key))
        # values_list.append(str(value))
    # return keys_list, values_list
 
 
def get_json():
    '''算出昨天和上月的时间并插入配置'''
    """获取json配置文件中的key和value"""
    time_current = time.time()
    timeArray = time.localtime(time_current-86400)
    time_yesterday = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    time_yesterday = time_yesterday.split()[0]
    timeArray = time.localtime(time_current-2678400)
    time_last_month = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
    time_last_month = time_last_month.split()[0]
 
    # {"a" :"a","a" :"a"}
    json_file = json.load(open('haiwai_settings.json', 'r'))
    keys_list = []
    values_list = []
    for key, value in json_file.items():
        key = key.format(time_last_month, time_yesterday)
        keys_list.append(str(key))
        values_list.append(str(value))
    return keys_list, values_list
 
 
def get_url_file():
    global driver
    driver.maximize_window()
    driver.implicitly_wait(10)
    url_link, values_list = get_json()
    driver.get(url_link[0])
    driver.find_elements_by_xpath('//*[@class="controls"]/input')[0].send_keys('')
    driver.find_elements_by_xpath('//*[@class="controls"]/input')[1].send_keys('')
    veri_code = input('请输入网页中的验证码')
    get_file()
 
 
def get_file():
    global driver
    url_link, values_list = get_json()
    for url in url_link:
        driver.get(url)
        time.sleep(1)
        rename_file()
 
 
def rename_file():
    """重命名"""
    oldname = sort_file()
    newname = new_name()
    dir_link = 'C:\\Users\\Administrator\\Desktop\\requests_pwrd'
    os.chdir(dir_link)
    os.rename(oldname, newname)
 
 
def sort_file():
    """排序文件"""
    dir_link = 'C:\\Users\\Administrator\\Desktop\\requests_pwrd'
    dir_lists = os.listdir(dir_link)
    dir_lists.sort(key=lambda fn: os.path.getmtime(dir_link + '\\' + fn))
    return (dir_lists[-1])
 
 
def new_name():
    global number
    today = datetime.date.today()
    time_newname = str(today.strftime('%y%m%d'))
    '''获取value'''
    url_link, values_list = get_json()
    newname_value = values_list[number]
    number += 1
    return time_newname + newname_value + '.xls'
 
 
if __name__ == '__main__':
    get_url_file()

F12检查下载控件的网址href,类似http://www.xxx.com/xxxx/abdc.pdf
浏览器会自动将abdc.pdf作为文件名
将网址和文章名一一对应记录起来
后续批量更改

下载的时候,在文件名前面加上序号不就行了吗?就像1-xxxx.pdf,2-xxxxx.pdf

不知道你是怎么下载文件的,如果可以的话可以下载的时候直接换名字保存即可

# 爬虫的时候可以把论文名保存下,后面作为文件名的新文件名
# 下载文件时修改名字
urllib.request.urlretrieve(file_uri,'D:/files/%s' % new_file_name)

profile = webdriver.FirefoxProfile()

profile.set_preference("browser.download.folderList", 2)

profile.set_preference("browser.download.manager.showWhenStarting", False)

profile.set_preference("browser.download.dir", '/home/luis/Desktop/data/')

profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv")

driver = webdriver.Firefox(firefox_profile=profile)

driver.get(url)

time.sleep(2)

download_button = driver.find_element_by_xpath('//*[@id="content"]/div[2]/div[2]/section[1]/div[2]/ul/li[14]/div/ul/li[1]/a')

download_button.click()

这里设置了下载文件夹:

profile.set_preference("browser.download.dir", '/home/luis/Desktop/data/')

如何选择保存文件的名称?

可以是下载时定义的名称吗?

我的意思是这样的:

For name in names:

download_button = driver.find_element_by_xpath('//*[@id="content"]/div[2]/div[2]/section[1]/div[2]/ul/li[14]/div/ul/li[{}]/a'.format(name))

download_button.click()

save_file_as(name)

Selenium 不提供更改下载文件名称的方法,仅适用于 webdriver,因此您需要使用os更改下载文件的名称

1,根据咱的困扰应该是模拟点击的下载,所以建议是通过selenium 设置下载路径 每次点击前将浏览器的默认下载路径,改为论文名字,这样就每个论文
就放在了不同的文件夹,

下载的时候可以记录一下要重命名的名称,然后将原始文件名和新文件名存在一个txt里面,全部下载完成后再调用os模块进行重命名

不影响吧,等下载完再统一重命名也可以吧

直接保存的时候改比较麻烦。

简单的办法就是 你下载之后不管文件名字是啥都先保存起来记录成A名。

记录变量 A 名到 A_name。

然后你做一个对比列表,txt还是excel无所谓,就是要把原来的名字和新的名字做成一行分成2列就好。

然后用 os.rename 方法改。

你会问比如下了10000万个论文难道要把10000个论文文件名称复制一遍么?

不用,用 os.listdir 模块直接获取当前目录的全部文件名。

最后做好表遍历修改就好了。

可以考虑先下载到一个文件夹里,之后再借助一些重命名工具软件来实现对论文的重命名。

可以用正则匹配去掉多余的字符

import re
def validateTitle(title):
    rstr = r"[\/\\\:\*\?\"\<\>\|]"  # '/ \ : * ? " < > |'
    new_title = re.sub(rstr, "_", title)  # 替换为下划线
    return new_title

可以看看这个文章:https://blog.csdn.net/wanglha/article/details/44919105?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_default&spm=1001.2101.3001.4242.1&utm_relevant_index=3


创一个一一对应的{"原始文件名":"重命名"}字典映射,下完后再一起重命名!

https://blog.csdn.net/xjw9602/article/details/107004890?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-5.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-5.pc_feed_download_top3ask