首页
关于
Search
1
X-ui可视化面板安装及使用教程
1,925 阅读
2
azure100刀换IP教程
1,333 阅读
3
Emby/Jellyfin 的一个日本电影刮削器插件
1,090 阅读
4
使用Python批量发送视频、图片到TG频道
1,052 阅读
5
docker下部署青龙面板京东自动签到
1,008 阅读
随记
Python
流水
登录
/
注册
Search
标签搜索
宝塔
脚本
Wordpress
docker
centos7
腾讯云
宝塔面板
Python
甲骨文
Rclone
WIN7
Python3
virmach
破解
BBr
反向代理
Onemanager
onedrive
Euserv
火车头
Phon
累计撰写
142
篇文章
累计收到
3
条评论
首页
栏目
随记
Python
流水
页面
关于
搜索到
4
篇与
的结果
2022-05-04
python采集并上传wordpress,并设置文章缩略图
一、所需库与模块requests 是一个模拟http请求的库,我们用它来爬取网页。lxml 是一个解析HTML与XML的库,我们用它来解析网页内容pymysql 是一个操作MySql的库,我们用它来上传内容到wordpress的数据库time 是python内置的一个处理时间的模块,我们用它来设置爬取网页的间隔时间random 是一个python内置的生成随机数的模块,我们用它来生成随机的间隔时间xpinyin 是一个将汉字转换成拼音的库二、使用pymysql提交内容到wordpress数据库一般我们在使用wordpress时都是在后台上面写完然后点击发布,这个过程是这样子的:浏览器=>form提交=>php=>数据库而这里我们要跳过前面三个步骤,直接对接数据库:命令行=>数据库在通过查看wordpress数据库的wp_posts表的字段后,我写了一段sql语句,并预留了三个位置,为content,title,name,分别代表文章内容,标题,在url显示的名字。sqlbase="INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,menu_order,post_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),'%s','%s','publish','open','open','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,0,'post')"我们要生成一段插入文章的sql语句时就可以这样写sql=sqlbase % (content,title,name)接下来要将sql语句提交到wordpress的数据库,这里就需要用到一个python的第三方库pymysqlimport pymysql sqlbase="INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,menu_order,post_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),'%s','%s','publish','open','open','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,0,'post')" def upload(title,content,name): sql=sqlbase % (content,title,name) db=pymysql.connect('数据库ip','数据库用户名','数据库密码','数据库名') cursor=db.cursor() try: cursor.execute(sql) db.commit() except Exception as e: db.rollback() print(e) db.close()将提交到wordpress数据库这个操作整合到一个函数中,这样我们在后面使用就会方便一些,将函数中的连接信息修改成wordpress数据库的信息,然后我们来测试一下>>>upload('我是标题','<p>我是Felix</p>','wo-shi-biao-ti')因为观察wp_posts表时有些字段内容为空,所以在sql语句中我就没有写,在第一次运行upload()时会有一些提示信息说某些字段为空,忽略即可,然后我们打开wordpress查看三、爬取内容并上传在这里,为了方便演示我就选择一个静态的小说网站,在爬取小说网站时,我们主要爬取两种类型的网页,分别为目录页与章节页(文章页)from lxml import etree import requests def page(url,booktitle=''): response=requests.get(url) response.encoding='gbk' html=etree.HTML(response.text) chapter_title=html.xpath('//h1/text()')[0].split('正文')[1] title=booktitle+chapter_title content_list=html.xpath('//div[@id="book_text"]/text()')[4:][:-1] content='' for i in content_list: content=content+'<p>'+i+'</p>' return [title,content]接下来我们来分析一下目录页,抓取书名与所有章节的链接,可以看到目录页的章节链接是相对地址,所以我们要加上网站的域名将其变为绝对地址,然后我们用time模块与random模块来生成一段时间范围内的随机爬取间隔时间,并且通过第三方库xpinyin来生成wordpress的url所需要的name,下面写了一个menu函数来完成以上操作,输入的参数为目录url与最小爬取间隔时间import time import random from xpinyin import Pinyin p=Pinyin() def menu(url,min_time): response=requests.get(url) response.encoding='gbk' html=etree.HTML(response.text) booktitle=html.xpath('//h1/text()')[0] #书名 page_links=html.xpath('//div[@class="article_texttitleb"]//a/@href') #所有章节链接 i=0 for link in page_links: i=i+1 try: article=page('https://www.tusuu.com'+link,booktitle) name=p.get_pinyin(article[0]) upload(article[0],article[1],name) print('page%s finished!' % i) time.sleep(random.randint(min_time,min_time+60)) except Exception as e: print('page%s failed!' % i) print(e) print('All done!')让我们来测试一下,为了不对别人的网站造成困扰还有不对别人的服务器造成压力,所以这里的最小间隔时间我设置为5分钟即300秒,程序就会在5到6分钟之间进行一次爬取。>>>menu('https://www.tusuu.com/book/txt21094.html',300)四、为文章添加分类(可选)wordpress并没有强制要求文章要设置分类,如果你需要为文章添加分类,可以看一下下面的方法。wordpress数据库跟分类有关的有三个表wp_terms,wp_term_relationships,wp_term_taxonomywp_term是记录所有分类wp_term_relationships是记录文章与分类关系wp_term_taxonomy是记录分类的父分类,分类描述与分类下的文章总数我们首先在wp_term里找到分类的id,然后在插入文章后与commit之前通过cursor.lastrowid获取最新文章的id,这时候添加分类,接着为wp_term_taxonomy表中分类的文章统计数加一,最后再commit,这里改写了一下upload函数category_sqlbase="INSERT INTO wp_term_relationships(object_id,term_taxonomy_id,term_order) VALUE(%s,%s,0)" count_sqlbase="UPDATE wp_term_taxonomy SET count=count+1 WHERE term_id ='%s' " def upload(title,content,name,cate_id): sql=sqlbase % (content,title,name) db=pymysql.connect('数据库ip','数据库用户名','数据库密码','数据库名') cursor=db.cursor() try: cursor.execute(sql) sql2=category_sqlbase % (cursor.lastrowid,cate_id) sql3=count_sqlbase % cate_id cursor.execute(sql2) cursor.execute(sql3) db.commit() except Exception as e: db.rollback() print(e) db.close()upload函数多添加了一个参数cate_id为分类的id,我们来测试一下,我为wordpress添加了一个新闻分类,通过查看wp_terms表得知新闻分类id为4>>>upload('我是新闻标题','我是新闻内容','wo-shi-xin-wen-biao-ti',4)现在就可以看到文章被添加到了新闻的分类了,当然你也可以动态地添加新的分类,然后通过sql语句用名字找到对应的id。为程序加一个添加特色图片的功能,即文章的封面,观察了一下wordpress的数据库发现,特色图片需要先添加到wordpress的媒体库中,然后才能设为文章的封面,所以下面就跟大家分享一下这之间的一些记录。一张图片要上传到wordpress的媒体库,需要在数据库添加两条记录。一是在wp_post表中添加一条记录(图片和文章都用同一个表),这里面最主要的就是图片的url,然后另一条记录就是添加到wp_postmeta,记录图片的一些信息,我们在提到的_wp_attachment_metadata字段就是记录图片的信息。wp_postmeta表中的post_id对应wp_post表中的ID。一开始在看到wp_postmeta中_wp_attachment_metadata对应的键值我是有点懵逼的,这里面有些直接看过去还是能明白是什么意思,比如宽、高、文件名,以及对应的值,不过那个s后面的那个数字不知道是什么意思,在百度搜索无果后,便到谷歌搜索了一下,才搞懂了s的意思;我先把_wp_attachment_metadata的值格式化给大家看一下。我举个例子s:5:"width";,在这里面的width是五个字符,所以s后面就是5,大家可以看一下上面是不是这么回事。明白是什么意思后,将图片上传到媒体库就非常简单啦;接下来我们再解决另一个问题,如何将图片设为文章封面即wordpress所说的特色图片呢,这个比较简单,在wp_postmeta添加一条记录就行,像下面这样。post_id对应文章的ID,meta_value对应图片的ID,都是对应wp_post表的ID。添加一个参数,为图片的url,图片添加到媒体库并设为文章封面图的小功能,若无图片则不添加封面。通过requests和BytesIO获得图片,再通过PIL获得图片的长宽,用于_wp_attachment_metadata的值import pymysql import requests from io import BytesIO from PIL import Image post_sqlbase=r"INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,menu_order,post_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),'%s','%s','publish','open','open','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,0,'post')" category_sqlbase=r"INSERT INTO wp_term_relationships(object_id,term_taxonomy_id,term_order) VALUE(%s,%s,0)" count_sqlbase="UPDATE wp_term_taxonomy SET count=count+1 WHERE term_id ='%s' " image_sqlbase="INSERT INTO wp_posts(post_author,post_date,post_date_gmt,post_content,post_title,post_status,comment_status,ping_status,post_name,post_modified,post_modified_gmt,post_parent,guid,menu_order,post_type,post_mime_type) VALUE(1,now(),DATE_ADD(now(),INTERVAL '-8' HOUR),' ','%s','inherit','open','closed','%s',now(),DATE_ADD(now(),INTERVAL '-8' HOUR),0,'%s',0,'attachment','image/jpeg')" postmeta_sqlbase="INSERT INTO wp_postmeta(post_id,meta_key,meta_value) VALUE ('%s','%s','%s')" profile_base='a:4:{s:5:"width";i:%s;s:6:"height";i:%s;s:4:"file";s:%s:"%s";s:5:"sizes";a:1:{s:4:"full";a:3:{s:5:"width";i:%s;s:6:"height";i:%s;s:4:"file";s:%s:"%s";}}}' def getSize(img_url): response=requests.get(img_url) f=BytesIO(response.content) image=Image.open(f) return image.size def upload(title,content,name,cate_id,img_url): sql=post_sqlbase % (content,title,name) db=pymysql.connect('数据库ip','数据库用户名','数据库用户密码','数据库名') cursor=db.cursor() try: cursor.execute(sql) post_id=cursor.lastrowid sql2=category_sqlbase % (post_id,cate_id) sql3=count_sqlbase % cate_id cursor.execute(sql2) cursor.execute(sql3) if img_url: file_name=img_url.split('/')[-1] image_name=file_name.split('.')[0] thumbsql=image_sqlbase % (image_name,image_name,img_url) cursor.execute(thumbsql) thumb_id=cursor.lastrowid width,height=getSize(img_url) metasql=postmeta_sqlbase % (post_id,'_thumbnail_id',thumb_id) profilesql=postmeta_sqlbase % (thumb_id,'_wp_attachment_metadata',profile_base % (width,height,len(file_name),file_name,width,height,len(file_name),file_name)) cursor.execute(metasql) cursor.execute(profilesql) db.commit() except Exception as e: db.rollback() print(e) db.close()在爬取内容时,获取内容出现的第一张图片的url传入upload函数中,作为文章的封面图,若无则不传参因为图片想要设为特色图片是需要先添加在媒体库的,所以在媒体库会储存这张封面图以上就是关于如何为wordpress上传图片与设为特色图片的一些小方法啦,因为图片都是外链图片,所以爬取的图片都不是保存在本地,只是保存图片的URL而已
2022年05月04日
284 阅读
0 评论
0 点赞
2022-03-20
通过python项目管理器改变centos7的默认python版本
1、进入宝塔软件商店搜索python项目管理器并安装2、打开python项目管理器并选择需要安装的版本。音素这里选择安装python3.7.8版本3、安装完后,SSH reboot 重启VPS4、查看宝塔已安装的python版本pyenv versions[root@phon ~]# pyenv versions * system (set by /root/.pyenv/version) 3.7.8 5、使用pyenv shell 指定系统 python 环境pyenv shell 3.7.86、SSH查看python版本号python -V[root@phon ~]# python -V Python 3.7.8 7、pip3也可以用了[root@phon ~]# pip3 -V pip 20.1.1 from /.pyenv/versions/3.7.8/lib/python3.7/site-packages/pip (python 3.7) 7、可用以下命令取消指定的版本pyenv shell --unset
2022年03月20日
54 阅读
0 评论
0 点赞
2022-03-13
使用Python批量发送视频、图片到TG频道
随机图片源码: Test 随机视频源码: Test 一、把文件/或者图片发送到tg频道/群组使用国内机器的可以反代https://api.telegram.org1、api发送视频代码:https://api.telegram.org/bot机器人密匙/sendDocument?chat_id=群组/频道id&document=视频地址例如:https://api.telegram.org/bot111111111:AAbcd11111111/sendDocument?chat_id=-11111111111&document=https://111111111.mp42、api发送图片代码:https://api.telegram.org/bot机器人密匙/sendPhoto?chat_id=群组/频道id&photo=图片地址例如:https://api.telegram.org/bot111111111:AAbcd11111111/sendPhoto?chat_id=-11111111111&photo=https://111111111.png3、批量替换下载好的txt内容:在视频网址或者图片网址前添加tg api链接https://替换为https://api.telegram.org/bot111111111:AAbcd11111111/sendDocument?chat_id=-11111111111&document=https://4、上传到服务器任何目录下载Python脚本(跟txt文件同目录)wget -c https://raw.githubusercontent.com/lzw981731/shell-1/master/vd3.py5、运行Python3脚本python3 vd3.py代码说明:t ime.s leep(5)#这里是每5秒访问一条(可以改为3秒,1秒或者2秒我觉得太快) try跟except是异常处理,可以防止某些网址访问不进去导致代码运行中止.
2022年03月13日
1,052 阅读
0 评论
0 点赞
2021-03-16
Python控制鼠标不停移动
Python控制鼠标不停移动from pyautogui import position from pyautogui import moveTo from pyautogui import moveRel count = int(input ("请输入:")) currentMouseX, currentMouseY = position() # 鼠标当前位置 print(currentMouseX, currentMouseY) while (count >= 0): # 控制鼠标移动,duration为持续时间 for i in range(2): moveTo(100, 100, duration=0.25) # 移动到 (100,100) moveTo(200, 100, duration=0.25) moveTo(200, 200, duration=0.25) moveTo(100, 200, duration=0.25) for i in range(2): moveRel(50, 0, duration=0.25) # 从当前位置右移100像素 moveRel(0, 50, duration=0.25) # 向下 moveRel(-50, 0, duration=0.25) # 向左 moveRel(0, -50, duration=0.25) # 向上 count = count - 1 print ('Good bye!')
2021年03月16日
154 阅读
0 评论
0 点赞