Python + Selenium 自动发布文章(二):简书
Python + Selenium 自动发布文章系列:
Python + Selenium 自动发布文章(一):开源中国
Python + Selenium 自动发布文章(二):简书
Python + Selenium 自动发布文章(三):CSDN
Python + Selenium 自动发布文章(四):加入 bat 脚本
写在开始
本篇介绍用Python
+Selenium
自动发布简书文章,一些必要的前置准备说明在上篇文章里面有提到,这里就不再重复了。
使用说明
同样的,还是需要先分析下简书写博客的界面(记得设置默认编辑器为Markdown)。
从上图可以看到,在简书写一篇博客,需要依次选择分类(也就是文集),新建文章,然后填入标题和内容。
结合auto.md
的内容进行分析,标题有了,定义在title
处;正文内容同样通过匹配-->\n
获取。剩下分类,按规则已经定义在注释里了(self_category
)。
代码说明
main.py:程序入口类,主要负责正则匹配解析Markdown
和调用post
发布文章
import re import jianshu import linecache class Main(object): # init def __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_category def 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 = 10 main = 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_handles driver.switch_to.window(window_handles[-1]) print('qq authorize title is ', driver.title) # 切换iframe iframe = 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): @staticmethod def 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_handles driver.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授权的方式登录吧。
运行效果
还是来看看运行效果图吧,这里测试的是保存草稿。
写在最后
在简书自动写文章的思路大概就这样,同样这也不是唯一的办法,根据代码自己做调整即可,网页的结构也可能会改变,故不保证程序可以一直正常运行。最后,下一篇继续介绍如何在CSDN自动写(发)文章。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python + Selenium 自动发布文章(一):开源中国
Python + Selenium 自动发布文章系列:Python + Selenium 自动发布文章(一):开源中国Python + Selenium 自动发布文章(二):简书Python + Selenium 自动发布文章(三):CSDNPython + Selenium 自动发布文章(四):加入 bat 脚本 写在开始 还是说说出这个系列的起因吧。之前写完或是修改了Markdown文章,我还分别需要在多个平台进行发布或是更新维护这些内容,这些平台目前包括我的博客、简书、开源中国和CSDN,其实早就想过用比较自动化的形式来解决,无奈有技术、时间、精力等各方面原因的限制。废话不多说吧,直奔今天的主题,本文主要介绍如何用Python和Selenium写(发)开源中国的博客。 准备说明 一定的Python基础知识 一定的Selenium相关知识 开发环境说明:Python v3.6.4,Selenium v3.8.1 PS:Selenium操纵浏览器是依赖于浏览器驱动程序的,下面贴出的是谷歌和火狐浏览器驱动程序的下载地址。 Chrome ( chromedriver ) Firefo...
- 下一篇
MODIS数据的简介和下载(六)——基于浏览器模拟登陆下载的方式以及D3L Tool开发
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ESA_DSQ/article/details/80365806 接上文,由于NASA官方弃用了FTP改用HTTPS服务,所以关于MODIS数据的下载方式有所改变。完整系列博客可以参照以下链接。本篇主要介绍的是我自己写的一个下载方式,以及我为了方便大家下载开发的一个带图形界面的下载工具。 MODIS数据的简介和下载(一)——MODIS数据简介 MODIS数据的简介和下载(二)——MODIS数据下载方式(FTP) MODIS数据的简介和下载(三)——MODIS数据下载方式(基于MODIS Web Service) MODIS数据的简介和下载(番外篇)——MODIS Web Service的Python客户端应用 MODIS数据的简介和下载(四)——HTTPS服务下载说明 MODIS数据的简介和下载(五)——应用密钥的Python脚本下载 1 基于NASA官方脚本封装的exe 2 基于浏览器模拟登陆下载与D3LTool开发 1 基于NASA官方脚本封装的exe 这应该是近段时间MODIS数据的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7