如何用Python实现自动发送微博
作者:简说Python 发布时间:2021-04-05 22:47:32
一、软件准备
1.安装Python 环境
首先需要你的电脑安装好了Python环境,并且安装好了Python开发工具。如果你还没有安装,可以参考以下文章:如果仅用Python来处理数据、爬虫、数据分析或者自动化脚本、机器学习等,建议使用Python基础环境+jupyter即可,安装使用参考??Windows/Mac 安装、使用Python环境+jupyter notebook??
2.安装selenium库
pip install selenium
3.下载谷歌浏览器驱动chromedriver,下载地址:http://npm.taobao.org/mirrors/chromedriver/需要选择对应的谷歌浏览器版本,(谷歌浏览器访问:chrome://settings/help,即可查看版本)
下载好后,随便发到一个路径下即可(简单点最好,记住路径)。
二、实现方法
2.1 使用 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[@]/a')
bt_logoin = driver.find_element_by_xpath('//div[@node-type="normal_form"]//div[@]/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的cookies
jsCookies = 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)
拓展:检测cookies有效性
检测方法:利用本地cookies向微博发送get请求,如果返回的页面源码中包含自己的微博昵称,就说明cookies还有效,否则无效。
# 检测cookies的有效性
def check_cookies():
# 读取本地cookies
cookies = 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 True
else:
return False
拓展:定时每日自动发送
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)
# 启动定时任务
sched.start()
来源:https://blog.51cto.com/u_13334898/4860518
猜你喜欢
- 本文为大家分享了Ubuntu下Anaconda和Pycharm的配置方法,供大家参考,具体内容如下1.对于Ubuntu18.04,一开始会有
- 问题:最新在爬取某站点的时候,发现在post请求当中,参数构造正确却获取不到数据,索性将post的参数urlencode之后放到post请求
- PyTorch基础入门二:PyTorch搭建一维线性回归模型1)一维线性回归模型的理论基础给定数据集,线性回归希望能够优化出一个好的函数,使
- 1. 一个简单的字典我们先从写一个简单的字典示例开始,顺便看一下 python 字典的语法。student ={'姓名':&
- mssql的每个varchar、text字段都被自动插入一段js代码,即使删除这段代码,如果没有从源头上解决,几分钟后,js代码就又会自动插
- 问题你想使用一个装饰器去包装函数,但是希望返回一个可调用的实例。 你需要让你的装饰器可以同时工作在类定义的内部和外部。解决方案为了将装饰器定
- 错误类型: Microsoft JET Database Engine (0x80004005) 不能使用 '';文件已在使
- 这篇文章主要介绍了python numpy数组复制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 一、描述在利用django做网络开发的时候我们会遇到一个问题就是,我们建立了多张数据表,但是多张数据表中的内容是不一样的,但是之间有着联系比
- 语言:Python IDE:Python.IDE需求 做出彩虹效果颜色空间 RGB模型:光的三原色,共同决定色相 HSB/HSV模型:H色彩
- 今天修改之前实习小伙伴写的js代码的时候,遇到修改后页面未发生变化的问题。因为我是web开发小白,所以上网查了一波,得以解决~~初次进行we
- 本文实例为大家分享了javascript实现切割轮播的具体代码,供大家参考,具体内容如下效果代码<!DOCTYPE html>&
- 1、连接数据库 driver={SQL Server};server=服务器IP;uid=用户名;pwd=密码;database=数据库名
- 一、python压缩模块简介python直接通过内置压缩模块可以直接进行压缩文件的创建;内置模块 zipfile/rarfile 完成压缩文
- 让你的读者能够方便地收藏你的文章到社会化书签(网摘)网站,如 新浪,google,yahoo,Del.icio.us, 365key等添加到
- 题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3-
- 其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。
- 1. self, cls 不是关键字 在python里面,self, cls 不是关键字,完全可以使用自己写的任意变量代替实现一样的效果 代
- 比如用 print ','.join(datelist) 就可以将datelist列表里面的所有项目并成一个字符串,当然这个
- 一、概述本章主要写当慢查询文件很大的时候怎样在线生成一个新的慢查询文件。测试环境:mysql 5.6.21二、步骤配置慢查询默认的my.cn