转载自:https://www.jianshu.com/p/9d4ac1b69660
登录还需自动输入验证码
用到autoit 去百度
下面的可以自动修改成你自己的
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from time import sleep
import os
class Uploader:
driver = webdriver.Chrome(executable_path='chromedriver.exe') # chrome浏览器驱动
# 根据验证框的存在与否判断是否要输入验证码
def isVerifyCodeExist(self):
try: # 如果成功找到验证码输入框返回true
self.driver.find_element_by_css_selector('input[name="verifycode"]')
return True
except: # 如果异常返回false
return False
# 输入验证码部分,如果无需输入则直接返回,否则手动输入成功后返回
def inputVerifyCode(self):
input_verifycode = self.driver.find_element_by_css_selector('input[name="verifycode"]') # 验证码输入框
bt_change = self.driver.find_element_by_css_selector('img[action-type="btn_change_verifycode"]') # 验证码图片,点击切换
bt_logoin = self.driver.find_element_by_class_name('login_btn') # 登录按钮
while self.isVerifyCodeExist():
print(u'请输入验证码……(输入"c"切换验证码图片)')
verifycode = input()
if verifycode == 'c':
bt_change.click()
else:
input_verifycode.send_keys(verifycode)
bt_logoin.click()
# 点击完登录以后判断是否成功
if self.driver.current_url.split('/')[-1] == 'home':
print(u'登录成功')
break
else:
print(u'输入的验证码不正确')
# 打开微博首页进行登录的过程
def login(self, account, password):
self.driver.implicitly_wait(10) # 设置隐性等待时间,等待页面加载完成才会进行下一步,最多等待10秒
url = 'http://weibo.com/'
self.driver.get(url)
# 输入账号密码并登录
WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_id('loginname')).send_keys(account)
self.driver.find_element_by_css_selector('input[type="password"]').send_keys(password)
bt_logoin = self.driver.find_element_by_class_name('login_btn')
bt_logoin.click()
# 如果存在验证码,则进入手动输入验证码过程
if self.isVerifyCodeExist():
self.inputVerifyCode()
# 上传文字
def upload_txt(self, text):
input_w = self.driver.find_element_by_xpath('//div[@node-type="textElDiv"]/textarea[@class="W_input"]')
input_w.send_keys(text)
sleep(1)
# 运行上传图片脚步
def upload_img_script(self, time_bef, time_after, path): # path参数需要前后带双引号
sleep(time_bef) # 等待弹窗时间
os.system('C:/img/upload.exe ' + path)
sleep(time_after) # 等待图片加载时间
# 上传文字和单图
def upload_txt_img(self, text, img_path):
self.upload_txt(text) # 将文字上传
img = self.driver.find_element_by_css_selector('a[action-type="multiimage"]') # 图片按钮
img.click() # 点击图片按钮
sleep(1) # 等待加载其他按钮
self.upload_img_script(1, 2, img_path)
# 上传文字和多图
def upload_txt_multiImg(self, text, img_path_list):
self.upload_txt_img(text, img_path_list[0]) # 将文字和第一张图片上传
len_imgs = len(img_path_list) # 图片地址list的长度
bt_uploadimg = WebDriverWait(self.driver, 10).until(lambda x: x.find_element_by_xpath('//li[@node-type="uploadBtn"]/div'))
for i in range(len_imgs - 1): # 将剩余图片上传
bt_uploadimg.click()
self.upload_img_script(1, 2, img_path_list[i + 1])
# 发布
def send(self):
self.driver.find_element_by_class_name('W_btn_a').click()
sleep(4) # 等待发送成功字样消失
# 登录
uploader = Uploader()
uploader.login("**************", "***************") # 填写你的账号密码
count_img = 2;#自动获取图片多少张
text = "okokokokposfdfsdafsadfsadgsadfgsfgkjsfdajgkl;sajklgjsakgjsakljdgklsadjgkls;salkgjk"#填入你的内容
path_list = [] # 图片地址list
for i in range(count_img): # 根据图片总数量生成所有图片地址
m = i+1
path_list.append('C:\\img\\'+str(m)+'.jpg')
# 上传内容
if count_img == 0: # 没有图片
uploader.upload_txt(text)
elif count_img == 1: # 单张图片
uploader.upload_txt_img(text, path_list[0])
else: # 多张图片
uploader.upload_txt_multiImg(text, path_list)
uploader.send()
再使用selenium打开chrome浏览器的时候,需要用chromedriver,而chromedriver与chrome的版本也是要相互适宜的,如果不能正常打开网站连接就是这里问题,对应关系如下:
chromedriver版本 | 支持的Chrome版本 |
---|---|
v2.24 | v52-54 |
v2.23 | v51-53 |
v2.22 | v49-52 |
v2.21 | v46-50 |
v2.20 | v43-48 |
v2.19 | v43-47 |
v2.18 | v43-46 |
v2.17 | v42-43 |
v2.13 | v42-45 |
v2.15 | v40-43 |
v2.14 | v39-42 |
v2.13 | v38-41 |
v2.12 | v36-40 |
v2.11 | v36-40 |
v2.10 | v33-36 |
v2.9 | v31-34 |
v2.8 | v30-33 |
v2.7 | v30-33 |
v2.6 | v29-32 |
v2.5 | v29-32 |
v2.4 | v29-32 |
附:
所有chromedriver均可在下面链接中下载到:
http://chromedriver.storage.googleapis.com/index.html
不要在这里摔跤