使用python调用浏览器实现自动转发微博
# coding = utf-8
import datetime
from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# import weibo2
def isElement(browser, xpathElement):
try:
browser.find_element_by_xpath(xpathElement)
return True
except:
return False
if __name__ == "__main__":
# loginName = weibo2.loginName #登录微博的账户
# loginPassword = weibo2.loginPassword # 登录微博的密码
# print(loginName,loginPassword)
loginName = '你自己的登录账户'
loginPassword = '密码'
successful_num = 0 # 记录转发微博成功的次数
now_time = datetime.datetime.now()
# 登录微博
# chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu') # 前面三行是保证是无界面启动浏览器
# browser = webdriver.Chrome(chrome_options=chrome_options) # 创建一个谷歌浏览器对象
browser = webdriver.Chrome() # 创建一个谷歌浏览器对象
browser.get("https://passport.weibo.cn/signin/login") # 打开网址
sleep(3)
print("已经打开网址,等待3秒")
browser.find_element_by_id('loginName').click()
browser.find_element_by_id('loginName').send_keys(loginName) # 点击账户输入框输入账户
print("进行账户输入")
browser.find_element_by_id('loginPassword').click()
browser.find_element_by_id('loginPassword').send_keys(loginPassword) # 点击密码输入框,输入密码
print("进行密码输入")
browser.find_element_by_id('loginAction').click() # 点击登录按钮
print("进行登录点击操作")
sleep(0.5)
while True:
try:
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div[1]').click() # 点击头像获取信息
print('点击头像,获取微博数、关注数、粉丝数')
break
except:
sleep(0.5)
sleep(0.5)
while True:
try:
weibo_num = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[1]/i').text
guanzhu_num = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[2]/i').text
fensi_num = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[3]/i').text
print('微博数:', weibo_num, '关注数:', guanzhu_num, '粉丝数:', fensi_num)
break # 跳出循环
except:
sleep(0.5)
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div[1]/i').click() # 点击返回
# 获取微博热搜
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/a/aside/label/div').click() # 点击搜索输入框
print("点击搜索的输入框")
while True:
try:
browser.find_element_by_xpath(
'//*[@id="app"]/div[1]/div[1]/div[2]/div/div/div[8]/div').click() # 点击微博热搜,查看所有的微博热搜
print("点击微博热搜")
break
except:
sleep(0.5)
sleep(8)
xpath1 = browser.find_elements_by_xpath(
'/html/body/div/div[1]/div[1]/div/div/div/div/div/div/div/div/span[2]/span[1]') # 获取热搜信息
# /html/body/div/div[1]/div[1]/div[2]/div/div/div/div/div/div/div/span[2]/span[1]
# /html/body/div/div[1]/div[1]/div[2]/div/div/div/div/div/div/div/span[2]/span[1]
hot_text = []
for j in xpath1: # 需要研究使用枚举型进行循环输出,将标题信息依次打印输出
hot_text.append(j.text)
print(hot_text)
# 返回可以进行搜索的界面
browser.find_element_by_xpath(
'//*[@id="app"]/div[1]/div[1]/div[1]/div/div/div/a').click() # 进行点击返回操作,返回到可以点击微博热搜的界面
# browser.find_element_by_xpath(
# '//*[@id="app"]/div[1]/div[1]/div[1]/div/div/div[1]').click() # 进行点击返回操作,返回到登录后显示的界面
# browser.find_element_by_xpath(
# ' //*[@id="app"]/div[1]/div[1]/div[1]/div/div/div[2]/form/input').click() # 点击搜索的输入框
zhuanfa_xpath_list = ['/html/body/div/div[1]/div[1]/div[3]/div/div/div[1]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[3]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[4]/div/div/div[1]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[4]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[5]/div/div/div[1]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[5]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[6]/div/div/div[1]/div/div/footer/div[1]',
'/html/body/div/div[1]/div[1]/div[6]/div/div/footer/div[1]']
# 开始针对每一个热搜话题,进行搜索
for every_hot in hot_text:
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input').clear() # 清空进行搜索的输入框
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input').send_keys(every_hot) # 输入搜索的内容
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div/div/div[2]/form/input').send_keys(Keys.ENTER) # 模拟键盘回车进行搜索
sleep(5)
for i in range(len(zhuanfa_xpath_list)): # 完成进行转发的功能
try:
browser.find_element_by_xpath(
zhuanfa_xpath_list[i]).click() # 点击第一篇文章的转发
sleep(3)
browser.find_element_by_xpath(
'//*[@id="app"]/div[1]/div/header/div[3]/a').click() # 点击第一篇文章的发送
sleep(2)
isXpathElement = u'/html/body/div/div[2]/div[1]/div[2]/footer/div/a'
truenFalse = isElement(browser, isXpathElement) # 调用方法
if truenFalse is False:
successful_num += 1
print(every_hot+'\t第' + str(i+1) + '次转发成功')
sleep(3)
else : # 执行过程中出现弹窗等意外情况,转发失败
print('执行过程中出现弹窗等意外情况,转发失败')
break
except:
if isElement(browser,'/html/body/div/div[2]/div[1]/div[2]/header/h3') is True :
print('转发失败,点击确定按钮,并返回')
browser.find_element_by_xpath('/html/body/div/div[2]/div[1]/div[2]/footer/div/a').click() # 点击确定按钮
browser.find_element_by_xpath('/html/body/div/div[1]/div/header/div[1]/i').click() # 点击返回按钮
break
# print(every_hot+'\t第' + str(i+1) + '次转发失败')
# pinglun_neirong = '欢迎关注我,看实时热点,,现在我们关注: ' + every_hot
# browser.find_element_by_xpath(
# '/html/body/div/div[1]/div/main/div[1]/div/span/textarea[1]').send_keys(pinglun_neirong)
sleep(5)
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div/div/div[1]/i').click() # 点击进行返回
while True:
try:
browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[1]/div[1]').click() # 点击头像获取信息
print('点击头像,获取微博数、关注数、粉丝数')
break
except:
sleep(1)
while True:
try:
weibo_num2 = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[1]/i').text
guanzhu_num2 = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[2]/i').text
fensi_num2 = browser.find_element_by_xpath(
'/html/body/div/div[1]/div[1]/div[3]/div[1]/span[3]/i').text
print('微博数:', weibo_num, '关注数:', guanzhu_num, '粉丝数:', fensi_num)
break # 跳出循环
except:
sleep(1)
print("转发任务完成")
print('开始时间', now_time)
print('结束时间', datetime.datetime.now())
print('这次共转发微博' + str(successful_num) + '次')
print('执行转发任务前 微博数:', weibo_num, '关注数:', guanzhu_num, '粉丝数:', fensi_num)
print('执行转发任务后 微博数:', weibo_num2, '关注数:',
guanzhu_num2, '粉丝数:', fensi_num2)
sleep(100)
browser.quit() # 关闭所有窗口