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

优采云 发布时间: 2022-04-30 21:27

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

  

  作者 |13妖、老表

  来源 |简说Python

  一、软件准备

  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<br />

  3.下载谷歌浏览器驱动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}<br />

  2.4 如何定位元素

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

  

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

  

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

  三、完整代码

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

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

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

  

  通过cookie进行登录可跳过扫码登录,cookie过期后重新获取下cookie就可以了。导入第三方包

  from selenium import webdriver<br />from selenium.webdriver.chrome.service import Service<br />import time<br />import requests<br />import json

  获取cookie到本地

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

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

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

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

  拓展:检测cookies有效性

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

  

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

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

  拓展:定时每日自动发送

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

  

  往期回顾技术资讯

  技术技术

  

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线