一、软件准备

1.安装Python 环境

首先需要你的电脑安装好了Python环境,并且安装好了Python开发工具。

如果你还没有安装,可以参考以下文章:

如果仅用Python来处理数据、爬虫、数据分析或者自动化脚本、机器学习等,建议使用Python基础环境+jupyter即可,安装使用参考Windows/Mac 安装、使用Python环境+jupyter notebook

如果想利用Python进行web项目开发等,建议使用Python基础环境+Pycharm,安装使用参考 :Windows下安装、使用Pycharm教程,这下全了 和 Mac下玩转Python-安装&使用Python/PyCharm 。

2.安装selenium库

pip install selenium

3.下载谷歌浏览器驱动chromedriver,下载地址:http://npm.taobao.org/mirrors/chromedriver/

需要选择对应的谷歌浏览器版本,(谷歌浏览器访问:chrome://settings/help,即可查看版本)

查看版本

下载好后,随便发到一个路径下即可(简单点最好,记住路径)。

二、实现方法

2.1 使用 Selenium 工具自动化模拟浏览器,当前重点是了解对元素的定位

对Selenium完全不了解,想进一步学习基础的读者还可以先看下这篇文章:2万字带你了解Selenium全攻略

我们想定位一个元素,可以通过 id、name、class、tag、链接上的全部文本、链接上的部分文本、XPath 或者 CSS 进行定位,在 Selenium Webdriver 中也提供了这 8 种方法方便我们定位元素。

1)通过 id 定位:我们可以使用 find_element_by_id() 函数。比如我们想定位 id=loginName 的元素,就可以使用browser.find_element_by_id(“loginName”)。

2)通过 name 定位:我们可以使用 find_element_by_name() 函数,比如我们想要对 name=key_word 的元素进行定位,就可以使用 browser.find_element_by_name(“key_word”)。

3)通过 class 定位:可以使用 find_element_by_class_name() 函数。

4)通过 tag 定位:使用 find_element_by_tag_name() 函数。

5)通过 link 上的完整文本定位:使用 find_element_by_link_text() 函数。

6)通过 link 上的部分文本定位:使用 find_element_by_partial_link_text() 函数。有时候超链接上的文本很长,我们通过查找部分文本内容就可以定位。

7)通过 XPath 定位:使用 find_element_by_xpath() 函数。使用 XPath 定位的通用性比较好,因为当 id、name、class 为多个,或者元素没有这些属性值的时候,XPath 定位可以帮我们完成任务。

8)通过 CSS 定位:使用 find_element_by_css_selector() 函数。CSS 定位也是常用的定位方法,相比于 XPath 来说更简洁。

2.2 对元素进行的操作包括

1)清空输入框的内容:使用 clear() 函数;

2)在输入框中输入内容:使用 send_keys(content) 函数传入要输入的文本;

3)点击按钮:使用 click() 函数,如果元素是个按钮或者链接的时候,可以点击操作;

4)提交表单:使用 submit() 函数,元素对象为一个表单的时候,可以提交表单;

2.3 注意

由于selenium打开的chrome是原始设置的,所以访问微博首页时一定会弹出来是否提示消息的弹窗,导致不能定位到输入框。可使用如下方法关闭弹窗:

prefs = {"profile.default_content_setting_values.notifications": 2}

2.4 如何定位元素

点击需要定位的元素,然后右键选择检查,可以调出谷歌开发者工具。

获取xpath 路径,点击谷歌开发者工具左上角的小键头(选择元素),选择自己要查看的地方的,开发者工具就会自动定位到对应元素的源码位置,选中对应源码,然后右键,选择Copy-> Copy XPath

即可获取到xpath 路径。

另外: 可以下载 XPath Helper插件,安装后 在网页上选取想要提取的元素, 点击右键 选中 检查 然后 开发者工具自动打开 你可以看到 HTML代码 ,选中然后再次点击右键,选中copy 里的 copy to xpath这样就得到了xpath的值了。

三、完整代码

实现思路: 其实和平时我们正常操作一样,只不过这里,全程由selenium来实现,模拟点击和输入,所以整个过程为:打开登录页面->输入账号密码->点击登录按钮->在发微博框输入发送内容->点击发送按钮->关闭浏览器(自选)。

3.1 目前自动输入账号可能会弹出登录保护需扫二维码验证

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time'''
自动发布微博
content:发送内容
username:微博账号
password:微博密码
'''
def post_weibo(content, username, password):# 加载谷歌浏览器驱动path = r'C:/MyEnv/chromedriver.exe '  # 指定驱动存放目录ser = Service(path)chrome_options = webdriver.ChromeOptions()# 把允许提示这个弹窗关闭prefs = {"profile.default_content_setting_values.notifications": 2}chrome_options.add_experimental_option("prefs", prefs)driver = webdriver.Chrome(service=ser, options=chrome_options)driver.maximize_window()  # 设置页面最大化,避免元素被隐藏  print('# get打开微博主页')url = 'http://weibo.com/login.php'driver.get(url)  # get打开微博主页time.sleep(5)  # 页面加载完全print('找到用户名 密码输入框')input_account = driver.find_element_by_id('loginname')  # 找到用户名输入框input_psw = driver.find_element_by_css_selector('input[type="password"]')  # 找到密码输入框# 输入用户名和密码input_account.send_keys(username)input_psw.send_keys(password)print('# 找到登录按钮 //div[@node-type="normal_form"]//div[@class="info_list login_btn"]/a')bt_logoin = driver.find_element_by_xpath('//div[@node-type="normal_form"]//div[@class="info_list login_btn"]/a')  # 找到登录按钮bt_logoin.click()  # 点击登录# 等待页面加载完毕  #有的可能需要登录保护,需扫码确认下time.sleep(40)# 登录后 默认到首页,有微博发送框print('# 找到文本输入框 输入内容 //*[@id="homeWrap"]/div[1]/div/div[1]/div/textarea')weibo_content = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[1]/div/textarea')weibo_content.send_keys(content)print('# 点击发送按钮 //*[@id="homeWrap"]/div[1]/div/div[4]/div/button')bt_push = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[4]/div/button')bt_push.click()  # 点击发布time.sleep(15)driver.close()  # 关闭浏览器if __name__ == '__main__':username = '微博用户名'password = "微博密码"# 自动发微博content = '每天进步一点'post_weibo(content, username, password)

通过cookie进行登录可跳过扫码登录,cookie过期后重新获取下cookie就可以了。

导入第三方包

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
import time
import requests
import json

获取cookie到本地

这里主要利用了selenium的get_cookies函数获取cookies。

# 获取cookies 到本地
def get_cookies(driver):driver.get('https://weibo.com/login.php')time.sleep(20) # 留时间进行扫码Cookies = driver.get_cookies() # 获取list的cookiesjsCookies = json.dumps(Cookies) # 转换成字符串保存with open('cookies.txt', 'w') as f:f.write(jsCookies)print('cookies已重新写入!')# 读取本地的cookies
def read_cookies():with open('cookies.txt', 'r', encoding='utf8') as f:Cookies = json.loads(f.read())cookies = []for cookie in Cookies:cookie_dict = {'domain': '.weibo.com','name': cookie.get('name'),'value': cookie.get('value'),'expires': '','path': '/','httpOnly': False,'HostOnly': False,'Secure': False}cookies.append(cookie_dict)return cookies

利用cookie登录微博并发送文字 完整代码

# 初始化浏览器 打开微博登录页面
def init_browser():path = r'C:/MyEnv/chromedriver.exe '  # 指定驱动存放目录ser = Service(path)chrome_options = webdriver.ChromeOptions()# 把允许提示这个弹窗关闭prefs = {"profile.default_content_setting_values.notifications": 2}chrome_options.add_experimental_option("prefs", prefs)driver = webdriver.Chrome(service=ser, options=chrome_options)driver.maximize_window()    driver.get('https://weibo.com/login.php')return driver# 读取cookies 登录微博
def login_weibo(driver):cookies = read_cookies()for cookie in cookies:driver.add_cookie(cookie)time.sleep(3)driver.refresh()  # 刷新网页# 发布微博
def post_weibo(content, driver):time.sleep(5)weibo_content = driver.find_element_by_xpath('//*[ @id ="homeWrap"]/div[1]/div/div[1]/div/textarea')weibo_content.send_keys(content)bt_push = driver.find_element_by_xpath('//*[@id="homeWrap"]/div[1]/div/div[4]/div/button')bt_push.click()  # 点击发布time.sleep(5)driver.close()  # 关闭浏览器if __name__ == '__main__':# cookie登录微博driver = init_browser()login_weibo(driver)# 自动发微博content = '今天的天气真不错~'post_weibo(content, driver)

,时长00:22

拓展:检测cookies有效性

检测方法:利用本地cookies向微博发送get请求,如果返回的页面源码中包含自己的微博昵称,就说明cookies还有效,否则无效。

登录状态下才有自己的微博昵称

# 检测cookies的有效性
def check_cookies():# 读取本地cookiescookies = read_cookies()s = requests.Session()for cookie in cookies:s.cookies.set(cookie['name'], cookie['value'])response = s.get("https://weibo.com")html_t = response.text# 检测页面是否包含我的微博用户名if '老表max' in html_t:return Trueelse:return False

拓展:定时每日自动发送

可以参考上一篇文章:如何用Python发送告警通知到钉钉?

包括如何设置守护进程,在上一篇文章中也有介绍。

from apscheduler.schedulers.blocking import BlockingSchedulera'''
每天早上9:00 发送一条微博
'''
def every_day_nine():# cookie登录微博driver = init_browser()login_weibo(driver)req = requests.get('https://hitokoto.open.beeapi.cn/random')get_sentence = req.json()content =  f'【每日一言】{get_sentence["data"]} 来自:一言api'# 自动发微博post_weibo(content, driver)# 选择BlockingScheduler调度器
sched = BlockingScheduler(timezone='Asia/Shanghai')# job_every_nine 每天早上9点运行一次  日常发送
sched.add_job(every_day_nine, 'cron', hour=9)# 启动定时任务

在这里还是要推荐下我自己建的Python学习Q群:831804576,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),
包括我自己整理的一份2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

Python自动化实战,自动登录并发送微博相关推荐

  1. Java模拟新浪和腾迅自动登录并发送微博(2013年3月更新可用)

    1.准备工作 只是登录无需申请新浪和腾迅的开发者账号,如果需要发送微博功能,需要申请一个新浪和腾迅的开发者账号,并添加一个测试应用. 过程请参考官方帮助文档,申请地址:新浪:http://open.w ...

  2. 用 Python 自动化实战,自动登录并发送微博

    作者 | 13妖.老表 来源 | 简说Python 一.软件准备 1.安装Python 环境 首先需要你的电脑安装好了Python环境,并且安装好了Python开发工具. 如果你还没有安装,可以参考以 ...

  3. php selenium模拟登陆,python+selenium自动化实战携带cookies模拟登陆微博

    首先获取cookies,使用手机扫码登录斗鱼,然后利用网页cookies保存在本地 有些同学可能会问,这不是相当于自己登录了吗,还模拟什么呢,其实来说这是一次获取cookies可以使用很久 #!/us ...

  4. python自动发微信天气预报_【教程】Python微信定时自动给女朋友发送天气预报

    原标题:[教程]Python微信定时自动给女朋友发送天气预报 先上效果图 主要思路 1.从wxpy获取好友列表 2.创建定时器 3.定时器触发函数 4.函数执行,遍历好友列表 5.好友对象执行带参函数 ...

  5. 利用Python实现校园网自动登录(部署在树莓派)

    利用Python实现校园网自动登录(部署在树莓派) 项目场景: 在实验室的时候,每天的第一个苦恼就是面对不自动弹窗的校园网登录,且一个账号仅支持两个设备. 实验室使用了路由器,多个设备使用同一个账号上 ...

  6. java实现微博后台登录后台发送微博

    首先你需要有个微博开发者账号,我们需要的是App Key和App Secre及redirect_URI,公司原本就有所以这一步 省下来了,百度搜下有很多. 好了现在开始: 首先我在网上找到了这个代码 ...

  7. 基于python,控制微信自动登录并发送消息给指定联系人

    给出微信联系人.微信启动路径.消息内容,实现自动登录并并发送消息,如果需要定时发送可以开一个线程或者用while True实现.上代码,报错的话可能是缺少对应的库,自行百度安装即可. 下面代码 复制后 ...

  8. Python校园网定时自动登录-锐捷

    开始 搭了个树莓派连着校园网,但是校园网每天24点掉线,次日6点后才能连接,所以用Python写了个脚本,每天早上6点20执行一次,这样就不用每天手动登录了. 在写代码之前我们要先获取一些参数,而用这 ...

  9. Python 实现京东自动登录领京豆

    今天带大家进行模拟京东登录,并进行签到获取京豆,1000 个京豆 = 10 元,是不是一个发现了一个「发家致富」的好路子? 废话不多说,下面开始正题. 整体流程如下: 京东自动签到流程 1 模拟登录 ...

最新文章

  1. 开源数据库技术分享及未来展望|CIC 真·全明星阵容
  2. 计算机网络-子网划分举例
  3. SpringBoot - 优雅的实现【自定义参数校验】高级进阶
  4. ida demangled names
  5. 入门云数据库Redis,满足你的高读写性能场景需求
  6. linux打开pythonshall,linux系统shell脚本后台运行python程序
  7. java事件监听机制pdf,事件监听机制(转)
  8. Emacs编辑Nginx
  9. 网站左侧悬浮框随着滚动条滚动代码
  10. Leetcode074. 合并区间
  11. 科蒂斯控制器故障代码_CURTIS科蒂斯控制器故障代码大全
  12. 计算机编程的地位,学习编程的重要性
  13. matlab找出向量的中位数,MATLAB如何使用median函数计算样本的中位数
  14. Word2Vec的安装与使用
  15. php访问微信云数据库,第三方服务器php获取微信小程序云开发access_token和云数据库...
  16. 阿里性能专家全方位对比Jmeter和Locust,到底谁更香?
  17. kettle学习教程
  18. javaweb实现文件下载用ajax请求,浏览器无响应的问题
  19. 远程连接服务器软件——十大常见的服务器管理软件
  20. 在 Mac 上显示或隐藏文件扩展名

热门文章

  1. 【一文到底】【0基础】【快速上手】Django基本使用
  2. FPGA多进制数字相位调制( MPSK)
  3. babun 如何安装git flow 以及使用
  4. 台州法院、公安服务器存储及容灾系统升级改造项目
  5. 脑卒中css评分是什么意思,CSS评分表多伦多临床评分系统
  6. dwz分页php,dwz框架分页组件使用
  7. mutt配置文件_配置mutt做邮件客服端
  8. 计算机vf结束语句,计算机二级VF SQL语句常考总结。
  9. 机器学习基石 机器学习技法 林轩田 课件 ppt
  10. nginx正向代理+反向代理