现在可以用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
创一个一一对应的{"原始文件名":"重命名"}字典映射,下完后再一起重命名!