利用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': ''

}
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源,重啟時好時不好;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM