Python + Selenium 自动发布文章系列:
Python + Selenium 自动发布文章(一):开源中国
Python + Selenium 自动发布文章(二):简书
Python + Selenium 自动发布文章(三):CSDN
Python + Selenium 自动发布文章(四):加入 bat 脚本

写在开始

  本篇介绍用Python+Selenium 自动发布简书文章,一些必要的前置准备说明在上篇文章里面有提到,这里就不再重复了。

使用说明

  同样的,还是需要先分析下简书写博客的界面(记得设置默认编辑器为Markdown)。

write-blog-jianshu

write-blog-jianshu

  从上图可以看到,在简书写一篇博客,需要依次选择分类(也就是文集),新建文章,然后填入标题和内容。
  结合auto.md的内容进行分析,标题有了,定义在title处;正文内容同样通过匹配-->\n获取。剩下分类,按规则已经定义在注释里了(self_category)。

代码说明

  main.py:程序入口类,主要负责正则匹配解析Markdown和调用post发布文章

import re
import jianshu
import linecacheclass Main(object):# initdef __init__(self, file):self.title = ''self.content = ''self.category = ''self.tags = ''# OsChina的系统分类, 设个默认值self.osChina_sys_category = '编程语言'# CSDN的文章分类, 设个默认值self.csdn_article_category = '原创'# CSDN的博客分类, 设个默认值self.csdn_blog_category = '后端'self.read_file(file)# 读取MD中的title, content, self_category, self_tags, osChina_sys_category, csdn_article_category, csdn_blog_categorydef read_file(self, markdown_file):self.title = linecache.getline(markdown_file, 2).split('title: ')[1].strip('\n')with open(markdown_file, 'r', encoding='UTF-8') as f:self.content = f.read().split('-->\n')[1]# 重置文件指针偏移量f.seek(0)for line in f.readlines():if re.search('self_category: ', line) is not None:self.category = line.split('self_category: ')[1].strip('\n')elif re.search('self_tags: ', line) is not None:self.tags = line.split('self_tags: ')[1].strip('\n')elif re.search('osChina_sys_category: ', line) is not None:self.osChina_sys_category = line.split('osChina_sys_category: ')[1].strip('\n')elif re.search('csdn_article_category: ', line) is not None:self.csdn_article_category = line.split('csdn_article_category: ')[1].strip('\n')elif re.search('csdn_blog_category: ', line) is not None:self.csdn_blog_category = line.split('csdn_blog_category: ')[1].strip('\n')if __name__ == '__main__':md_file = 'auto.md'print("Markdown File is ", md_file)timeout = 10main = Main(md_file)# 简书jian_shu = jianshu.JianShu()jian_shu.post(main, timeout)

  authorize.py:目前仅实现了用qq进行授权登录的方法

from selenium.webdriver.support.wait import WebDriverWait# QQ授权登录, 使用前提是QQ客户端在线
def qq(driver, timeout):# 切换到最新打开的窗口window_handles = driver.window_handlesdriver.switch_to.window(window_handles[-1])print('qq authorize title is ', driver.title)# 切换iframeiframe = WebDriverWait(driver, timeout).until(lambda d: d.find_element_by_id('ptlogin_iframe'))driver.switch_to.frame(iframe)# 点击头像进行授权登录login = WebDriverWait(driver, timeout).until(lambda d: d.find_element_by_xpath('//*[@id="qlogin_list"]/a[1]'))login.click()

  jianshu.py:这个是简书自动写(发)博客的核心类

import time
import authorize
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait# 简书
class JianShu(object):@staticmethoddef post(main, timeout, self_timeout=3):# 1.跳转登陆login = 'https://www.jianshu.com/sign_in'driver = webdriver.Chrome()driver.get(login)# 2.窗口最大化driver.maximize_window()# 3.使用QQ授权登录driver.find_element_by_xpath('/html/body/div[1]/div[2]/div/div/ul/li[3]/a/i').click()driver.close()authorize.qq(driver, timeout)# 4.点击"写文章"write_blog = WebDriverWait(driver, timeout).until(lambda d: d.find_element_by_xpath('/html/body/nav/div/a[2]'))write_blog.click()driver.close()window_handles = driver.window_handlesdriver.switch_to.window(window_handles[-1])# 5.点击指定分类classify = WebDriverWait(driver, timeout).until(lambda d: d.find_elements_by_class_name('_3DM7w'))for c in classify:html = c.get_attribute('innerHTML')if main.category in html:c.click()else:# TODO 如果分类不存在,还可以直接新建分类pass# 6.点击'新建文章'time.sleep(self_timeout)new_article = WebDriverWait(driver, timeout).until(lambda d: d.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[1]/div/div/div/div[1]/i'))new_article.click()article = WebDriverWait(driver, timeout).until(lambda d: d.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[1]/div/div/div/ul/li[1]'))article.click()# 7.填写标题, 内容time.sleep(self_timeout)title = driver.find_element_by_class_name('_24i7u')title.clear()title.send_keys(main.title)content = driver.find_element_by_id('arthur-editor')content.clear()content.send_keys(main.content)# 8.保存草稿driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[2]/div/div/div/div/ul/li[8]/a').click()# 8.发布文章# driver.find_element_by_xpath('//*[@id="root"]/div/div[2]/div[2]/div/div/div/div/ul/li[1]/a').click()

  其实简书也是支持账号密码登录的,但无奈这种方式登录还有文字验证层,感觉比较棘手,目前也没研究怎么解决,所以先用qq授权的方式登录吧。

运行效果

  还是来看看运行效果图吧,这里测试的是保存草稿。

auto-post-jianshu

auto-post-jianshu

写在最后

  在简书自动写文章的思路大概就这样,同样这也不是唯一的办法,根据代码自己做调整即可,网页的结构也可能会改变,故不保证程序可以一直正常运行。最后,下一篇继续介绍如何在CSDN自动写(发)文章。

Python + Selenium 自动发布文章(二):简书相关推荐

  1. 使用Python及Selenium自动发表文章

    本文的主要内容是使用Python及Selenium自动发表文章到思否的实现思路及方式的介绍并为读者提供参考的源代码. 目录 实现思路 在自动发表文章时,我们的实现思路大致如下: 对Markdown文章 ...

  2. python采集百度新闻源并自动发布文章到phpcms

    通过对phpcms数据库字段的填充,实现自动发布文章,手动发布一篇文章并查看数据库中那些table发生变化,即可发现cms(如帝国cms等)文章自动化发布工具开发的突破口! Python # codi ...

  3. 利用python脚本自动发布服务之arcmap篇

    最近在学习arcpy,参考官方帮助文档及一些博客文章练习了下利用python脚本自动发布各中server服务,顺便将把发布的流程以及遇到的问题进行记录总结.用的是Python2.x,ArcGIS Pr ...

  4. python+Selenium自动签到实例

    引言 环境准备 代码 飞猪签到领里程 京东签到领京豆 什么值得买签到 windows计划任务 方法一 方法二 总结 参考 引言 Selenium是一个用于Web应用程序测试的工具.可以十分简单的模拟输 ...

  5. Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库...

    Python+Selenium自动搜索基金业协会指定企业名单,抓取指定信息并保存到数据库.网址https://gs.amac.org.cn/amac-infodisc/res/pof/manager/ ...

  6. python自动下载qq文件夹_GitHub - 1061700625/QQZone_AutoDownload_Album: Python+selenium 自动下载QQ空间相册...

    QQZone_AutoDownload_Album Python+selenium 自动下载QQ空间相册 . selenium_firefox.zip 需要解压后放在同路径下 . 貌似腾讯的登陆加密做 ...

  7. 褥羊毛,终于攒够了付费文章的简书钻

    大家新年好,很久没有在简书写文记录了,今天打开后,发现终于攒够了300钻,达到了白金等级,其中有一项权益就每天一篇付费文章- 简书等级 虽然暂时不清楚也没准备如何去写付费文章,但还是小小的内心欣喜一番 ...

  8. 50行python代码自动生成文章

    不知道从小到大,我们被迫写了多少心得体会,多少人生感想,如果真情实地的去感受写作然后成长当然很好,但是更多的都是形式主义的需求,并没有人去看里面的内容,白白浪费我们多少大好时光,有时候我们ctrl,C ...

  9. python+selenium 自动定时发QQ说说

    文章目录 一. 编程思想及流程 1. 浏览器进入QQ空间. 2. 切换框架. 3. 登录QQ空间. 4. 点击进入说说页面. 5. 写说说 6. 定时发布(略有麻烦) 7. 发表说说(有重点) 二. ...

最新文章

  1. Vue+Element-ui+二级联动封装组件
  2. oracle查询转insert语句,oracle中将查出来的数据转化为insert into语句
  3. boost::coroutine模块实现power的测试程序
  4. 电脑知识:电脑无法开机解决方案,赶紧收藏吧!
  5. 【3】flink sink
  6. [html] 你知道短链接的生成原理吗?
  7. java 实现真正的随机数_关于java:SecureRandom的Android实现是否产生真正的随机数?...
  8. 网易数据运河系统NDC设计与应用
  9. opencv java 去干扰_java - OpenCV Java修补图像格式要求 - 堆栈内存溢出
  10. CentOs基础操作指令(网络配置,RPM包管理)
  11. 【BZOJ2049】【codevs1839】洞穴探测,LCT练习
  12. python——迭代器itertools.cycle
  13. McAfee如何卸载?MacBook 如何卸载麦克菲
  14. cam_lidar_calib激光雷达和相机联合标定
  15. linux的lilo,深 入Linux 的LILO-嵌入式系统-与非网
  16. 如何让单片机I/O口上电复位时为低电平
  17. [ZZ]通过修改键盘映射替代损坏按键
  18. 是什么意思怎么读_知识丨南无怎么读?是什么意思?
  19. HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析
  20. 不仅室内,思岚科技激光雷达在室外使用同样出色

热门文章

  1. VMM系列之使用VMM服务器构建 Hyper-V 主机(3)
  2. phalcon遇到的那些坑
  3. 基于组件的.NET软件开发(3)
  4. 石家庄地铁售票系统源码及截图(结对作业)
  5. 201671010417 金振兴 词频统计软件项目报告
  6. 【前端笔记】Vuex 是什么,为什么需要
  7. Java 11正式发布,新特性解读
  8. 学习笔记 ACCESS 延迟注入
  9. Linux第五次作业
  10. (python)Graph_tools模块学习