工作中需要预约实验室,奈何学校的预约系统不给力,用户体验不佳。
比如,预约7天的某个实验室的6个小房间,需要执行相同的操作6*7=42次。每次的操作都是一模一样,系统无法自定义一段时间,就是得傻傻地点点点。
约了两次之后,实在受不了这么傻瓜的操作。
就尝试探索学习python+selenium怎么让浏览器自己预约实验室。
然后,花了半天时间后,终于可以通过修改代码,2分钟让电脑自己干完之前需要20+分钟的无意义的人工重复操作了。
其实,之前好几次都想学这个selenium的自动化,但没遇到合适的机会(需求),差不多每次都放弃在自动登录上。
正好这个预约实验室算是让自己入门了,比如,本来打算调用百度的OCR文字识别来帮助通过验证码登录,结果,系统登录界面的验证码就是个图片,输入啥都通过。。。
现在有信心去搞点其他的事儿了。
之前就有个想把艾瑞咨询的免费报告都下载下来的需求,而这个也正好不需要登录,简直就是完美的练习机会。
艾瑞咨询.png 报告下载.png
selenium是一个用电脑模拟人操作浏览器网页,可以实现自动化,测试等。
selenium在python的安装和配置,百度或者bing一下,还是很容易的。
实现过程主要就是要捋清楚人是怎么操作浏览器网页的。
在自动批量下载艾瑞咨询的免费报告这个例子中,需要涉及到:打开浏览器、设置浏览器默认下载路径、选择下拉框中的不同行业和不同时间、拖动下拉条显示出所有报告、获取每个报告的下载链接、点击下载等一系列操作。
捋清楚每个步骤后,就可以去找每个步骤的实现方式(函数),然后,循环就行。
在用selenium的时候,看着电脑自己操作浏览器,感觉还是有些神奇的。这里录了一小段自动下载的过程。
自动化.gif具体代码记录一下。
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from time import sleep
import time
import random,os
from selenium.webdriver.chrome.options import Options
# 获取列表
def get_ls(xpath):
ul = driver.find_element_by_xpath(xpath)
sleep(1)
li = ul.find_elements_by_tag_name('li')
sleep(1)
ls = []
for t in li:
txt = t.find_elements_by_tag_name('a')
for i in txt:
ls.append(i.get_attribute("textContent"))
return ls
# 选择行业
def select_cate(li_num):
driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/div').click()
sleep(1)
driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/ul/li[' + str(li_num) + ']').click()
sleep(1)
# 选择时间
def select_time(li_num):
driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[2]/div').click()
sleep(1)
driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[2]/ul/li[' + str(li_num) + ']').click()
sleep(1)
# 滚动条拉到最底
def scroll_down():
for i in range(1,100):
try:
nomore = driver.find_element_by_xpath('/html/body/div/div[2]/div[5]/div/div/p').get_attribute("textContent")
sleep(1)
print(nomore)
break
except:
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
sleep(2)
# 获取当页所有报告列表
def get_href_ls():
href_ls = []
ul = driver.find_element_by_xpath('/html/body/div/div[2]/div[4]/div/div/ul')
try:
li = ul.find_elements_by_tag_name('li')
ls = []
for l in li:
div = l.find_elements_by_xpath('div[1]')
for d in div:
als = d.find_elements_by_tag_name('a')
for a in als:
href = a.get_attribute('href')
href_ls.append(href)
except:
href_ls = []
return href_ls
# 设置浏览器及下载路径
def set_browser(path):
# 浏览器设置
chrome_options = Options()
# 修改下载路径
tmpath = 'C:\\study\\6_other\\reports\\' + path
print(tmpath)
# 判断路径是否存在,未存在则创建文件夹
if not os.path.exists(tmpath):
os.makedirs(tmpath)
prefs = {'profile.default_content_settings.popups': 0, #防止保存弹窗
'download.default_directory': tmpath, #设置默认下载路径
"profile.default_content_setting_values.automatic_downloads":1 #允许多文件下载
}
chrome_options.add_experimental_option('prefs', prefs)
#修改windows.navigator.webdriver,防机器人识别机制,selenium自动登陆判别机制
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
# 窗口最大化
# driver.maximize_window()
# 打开艾瑞咨询报告网页
driver.get('https://www.iresearch.com.cn/report.shtml')
return driver
if __name__ == '__main__':
driver = webdriver.Chrome()
# 打开艾瑞咨询报告网页
driver.get('https://www.iresearch.com.cn/report.shtml')
sleep(2)
# 获取行业列表
cate_ls = get_ls('/html/body/div/div[2]/div[3]/div/div/div[1]/ul')
print(cate_ls)
# 获取时间列表数
time_ls = get_ls('/html/body/div/div[2]/div[3]/div/div/div[2]/ul')
print(time_ls)
# 关闭浏览器
driver.quit()
# 纪录开始时间
start = time.perf_counter()
totalnum = 0
for c in range(2, len(cate_ls)+1):
# for c in range(8, 9):
for t in range(2, len(time_ls)+1):
# for t in range(6, 7):
print('当前为:',c,cate_ls[c-1], t,time_ls[t-1])
# 报告路径
path = cate_ls[c-1] + '\\' + time_ls[t-1]
# 打开浏览器
driver = set_browser(path)
sleep(5)
# 选择类别
select_cate(c)
sleep(2)
select_time(t)
sleep(2)
# 下拉滚动条
scroll_down()
# 获取当前页面报告链接
href_ls = get_href_ls()
num = len(href_ls)
if num >0:
for n,url in enumerate(href_ls):
driver.get(url)
sleep(2)
# 点击下载
driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/div/div[1]/a[2]').click()
sleep(2)
print('正在下载{}/{}:'.format(n+1, num), url)
totalnum = totalnum + num
# 纪录结束时间
end = time.perf_counter()
print('用时:',end-start)
# 关闭窗口且在关闭前等待5秒
sleep(5)
driver.close()
print('总共:{}份报告'.format(totalnum))
# 纪录结束时间
end = time.perf_counter()
print('总共用时:',end-start)
总共1514份报告,用了差不多3.8小时。
其中一个很大的感受就是,得sleep好多秒,比如打开了下载报告页面后得等待几秒,不然可能因为网速没刷出来,就下载不成功。
所以,整体下载速度不会特别快,但好在可以解放双手,让电脑自己慢慢下,自己去干其他事儿了。
文件夹.png
网友评论