利用Python实现高度定制专属RSS
前言
本文转载自Jianger's Blog,欢迎来访订阅。本篇属于定制RSS系列终极一弹,是三种方式中自由度最高、定制化最强的,也需要一定的编程能力。附上前两篇链接:1、利用Feed43为网站自制RSS源;2、如何优雅快速地利用Huginn制作专属RSS。开始之前先对比一下以上三种方式:
| 方法 | 优势 | 不足 | 复杂性 | 稳定性 | 定制性 |
|---|---|---|---|---|---|
| Feed43 | 快速、便捷、免费 | 免费版需间隔6小时,部分网站不可用 | 简单 | 一般 | 中 |
| Huginn | 快速、安装后可便捷添加 | 专业化程度偏高,需要服务器 | 高 | 高 | 高 |
| Python | 高度定制、占用内存小 | 专业化程度偏高,不可随意改正 | 一般 | 高 | 极高 |
看个人需要进行选择,Huginn虽安装麻烦点,但是一个自动化神器,妙用不仅局限于此。
前排提示
Python脚本需要放置在云主机/云服务器上使用,如果你还没有,赶快购置一台吧
需要了解:CSS基础;Python基础;Linux基础命令;利用浏览器开发者工具找到对应内容代码
我的使用环境:腾讯云主机centos7.5,Python2.7(服务器默认已安装的)
开始定制
先上代码,以下代码仅供参考,重要的是学会利用其中的代码和方法。
以下所有操作基于江西师范大学大学教务在线网站
# -*- coding: utf-8 -*-
import datetime
import time
import PyRSS2Gen
from bs4 import BeautifulSoup
import requests
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8') //防止中文乱码
xmlpath='/local/myrss/jxnu.xml' //RSS文件放置地址,需要放置在HTTP服务开启的文件夹下
now_time=time.strftime('%Y/%m/%d %H:%M:%S',time.localtime(time.time()))
//请求头,有些页面需要登录后才能抓取,cookie长期有效的可以设置cookie
headers = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36\
(KHTML, like Gecko) Chrome/75.0.3770.142 Mobile Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Content-Type': 'text/html; charset=utf-8',
'Host': 'jwc.jxnu.edu.cn',
'Cookie': 'ASP.NET_SessionId=0xdlujzzynq5m2gnwteyhopt;\
JwOAUserSettingNew2019=UserNum=VRLfbUKgQCAPo00dgIVGEQ==&UserName=dlxxDMMsdKU=\
&UserType=WmTb330+jk8=&UserLoginTime='+now_time
}
def setrss():
rssitems=[]
html = requests.get('https://jwc.jxnu.edu.cn/Portal/Index.aspx') //获得网站html代码
bs = BeautifulSoup(html.text,'html.parser')
contents = bs.select('.long_item > a') //BeautifulSoup获得通知的标题和对应链接
for content in contents:
title=content.text
href='https://jwc.jxnu.edu.cn/Portal/'+content.get('href')
detile=requests.get(url=href,headers=headers)
bs_0 = BeautifulSoup(detile.text,'html.parser')
article = bs_0.select('#main-content')
b=re.search(r"该文档需要登录后再查看",article[0].text)
if b is None:
descriptions=str(article[0])
else:
descriptions=content.get('title')
item=PyRSS2Gen.RSSItem( //item即为一项内容
title=title, //每一项内容的标题
link=href, //每一项内容的链接
description = descriptions, //每一项内容的描述/内容
pubDate =datetime.datetime.now() //更新时间
)
rssitems.append(item) //rssitems即为所有内容
rss = PyRSS2Gen.RSS2(
title = "江西师范大学教务在线", //rss源的名称
link = "https://jwc.jxnu.edu.cn/Portal/Index.aspx", //rss源的原地址
description = "江西师范大学教务在线", //rss源的描述
lastBuildDate = datetime.datetime.now(),
items = rssitems)
rss.write_xml(open(xmlpath, "w"),encoding='utf-8') //生成RSS格式的xml文件
if __name__ == '__main__':
setrss()
说明:PyRSS2Gen、BeautifulSoup两个模块是需要安装的,安装过忽略,代码基于Python2.7
pip install BeautifulSoup
pip install PyRSS2Gen
RSS的本质就是一个固定格式的文件,所以本方法按照以下三步进行,定时执行脚本生成xml文件放置在云服务器上。
抓取特定内容
有的页面可以直接抓取,有的页面需要登录后才能看到,并且有的网站有反爬虫措施,看抓取的网站采取不同方法。本示例先通过BeautifulSoup模块获取教务在线通知的标题和链接,然后再逐一访问链接下的全文内容。
html = requests.get('https://jwc.jxnu.edu.cn/Portal/Index.aspx') //获得网站html代码
bs = BeautifulSoup(html.text,'html.parser')
contents = bs.select('.long_item > a') //BeautifulSoup获得通知的标题和链接
for content in contents:
title=content.text
href='https://jwc.jxnu.edu.cn/Portal/'+content.get('href')
detile=requests.get(url=href,headers=headers)
bs_0 = BeautifulSoup(detile.text,'html.parser')
article = bs_0.select('#main-content')
b=re.search(r"该文档需要登录后再查看",article[0].text)
if b is None:
descriptions=str(article[0])
else:
descriptions=content.get('title')
构造RSS格式并输出
获得内容后将内容构造成相关格式,主要利用PyRSS2Gen模块构造
item=PyRSS2Gen.RSSItem( //构造一个item
title=title, //每一项内容的标题
link=href, //每一项内容的链接
description = descriptions, //每一项内容的描述/内容
pubDate =datetime.datetime.now() //更新时间
)
rssitems.append(item) //rssitems即为所有内容
rss = PyRSS2Gen.RSS2( //构造RSS2.0格式的对象
title = "江西师范大学教务在线", //rss源的名称
link = "https://jwc.jxnu.edu.cn/Portal/Index.aspx", //rss源的原地址
description = "江西师范大学教务在线", //rss源的描述
lastBuildDate = datetime.datetime.now(),
items = rssitems)
rss.write_xml(open(xmlpath, "w"),encoding='utf-8') //生成RSS格式的xml文件
云服务器设置
利用crontab定时执行该脚本并运行生成文件,然后再开启公网可访问的相关服务,一个RSS源就生成了!
crontab设置
连接云服务器后,输入以下命令,设置定时任务
vi /etc/crontab
添加如下内容,表示每半小时root用户使用python执行一次位于/local/myrss的jxnu-rss.py脚本,酌情更改。
*/30 * * * * root python /local/myrss/jxnu-rss.py
搭建Http服务
方法有很多,这里使用Python下的SimpleHTTPServer。
SimpleHTTPServer
在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer。进入到生成的xml文件所在文件夹,输入如下命令回车
nohup python -m SimpleHTTPServer 8080 &
在命令开头加一个nohup,忽略所有的挂断信号,如果当前bash关闭,则当前进程会挂载到init进程下,成为子进程,这样退出关闭服务器连接服务仍旧在运行。以上内容酌情修改,然后浏览器输入http://你的服务器IP:8080/jxnu.xml回车看到RSS内容即表示成功,可以将其添加到RSS阅读器上去了。
可能遇到的问题
- [x] SimpleHTTPServer服务不是很稳定,有时候会访问不了RSS源,重启时好时不好;
利用Python实现高度定制专属RSS的更多相关文章
- 超详细!如何利用Huginn制作专属RSS
前言 本文首发于个人网站,欢迎订阅.本篇博文接上利用Feed43为网站自制RSS源,上一篇讲解了RSS的简介以及利用Feed43自制专属RSS,Feed43有其优势,缺陷也很明显,不能高度自定义.有的 ...
- 利用 Python + Selenium 实现对页面的指定元素截图(可截长图元素)
对WebElement截图 WebDriver.Chrome自带的方法只能对当前窗口截屏,且不能指定特定元素.若是需要截取特定元素或是窗口超过了一屏,就只能另辟蹊径了. WebDriver.Phant ...
- Python 利用Python操作excel表格之openyxl介绍Part2
利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436) ## 绘图 c = LineChart() ...
- 利用python进行数据分析——(一)库的学习
总结一下自己对python常用包:Numpy,Pandas,Matplotlib,Scipy,Scikit-learn 一. Numpy: 标准安装的Python中用列表(list)保存一组值,可以用 ...
- 可以高度定制的代理服务器anyproxy
简介 anyproxy是一款可以高度定制的代理服务器,基于nodejs. 特征 支持https明文代理 支持低网速模拟 支持二次开发,可以用javascript控制代理的全部流程,搭建前端个性化调试环 ...
- 利用python画出动态高优先权优先调度
之前写过一个文章. 利用python画出SJF调度图 动态高度优先权优先调度 动态优先权调度算法,以就绪队列中各个进程的优先权作为进程调度的依据.各个进程的优先权在创建进程时所赋予,随着进程的推进或其 ...
- 利用python实现平稳时间序列的建模方式
一.平稳序列建模步骤 假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏 ...
- 利用python爬取城市公交站点
利用python爬取城市公交站点 页面分析 https://guiyang.8684.cn/line1 爬虫 我们利用requests请求,利用BeautifulSoup来解析,获取我们的站点数据.得 ...
- 利用Python进行数据分析(12) pandas基础: 数据合并
pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...
随机推荐
- LocalDate、LocalDateTime与timestamp、Date的转换
LocalDate.LocalDateTime与timestamp.Date的转换 1.LocalDate转Date LocalDate nowLocalDate = LocalDate.now(); ...
- 洛谷P1653 猴子
#include<bits/stdc++.h> using namespace std; inline void read(int &tmp) { ;char c=getchar( ...
- 将Eclipse中文注释字体变大方法
今天下了最新的eclipse玩,结果发现注释变得灰常小,差点看瞎哥24K氪金狗眼 于是在网上找了找解决方法,结果都不对 最后自己试出来了... 方法: Window --> Preferenc ...
- MyBatis-使用XML或注解的简单实例
一.导入jar包 <dependency> <groupId>junit</groupId> <artifactId>junit</artifac ...
- Android 使用ViewPager结合PhotoView开源组件实现网络图片在线浏览功能
在实际的开发中,我们市场会遇到这样的情况:点击某图片,浏览某列表(某列表详情)中的所有图片数据,当然,这些图片是可以放大和缩小的,比如我们看下百度贴吧的浏览大图的效果: 链接 这种功能,在一些app ...
- jq实现简单手风琴效果
文章地址:https://www.cnblogs.com/sandraryan/ 利用slideUp slideDown动画 <!DOCTYPE html> <html lang=& ...
- get和post的区别?
GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于 修改服务器上的资源,对所发送的信息没有限制. GET方式需要使用Request.Qu ...
- 2003年NOIP普及组复赛题解
题目涉及算法: 乒乓球:简单字符串模拟: 数字游戏:区间DP: 栈:卡特兰数 麦森数:高精度.快速幂.数学. 乒乓球 题目链接:https://www.luogu.org/problem/P1042 ...
- H3C 建立邻接关系
- 【codeforces 789B】Masha and geometric depression
[题目链接]:http://codeforces.com/contest/789/problem/B [题意] 让你一个一个地写出等比数列的每一项 (注意是一个一个地写出); 有m个数字不能写; 且数 ...