利用Python實現高度定製專屬RSS

前言

本文轉載自我的博客網站,歡迎來訪訂閱。本篇屬於定製RSS系列終極一彈,是三種方式中自由度最高、定製化最強的,也須要必定的編程能力。附上前兩篇連接:一、利用Feed43爲網站自制RSS源;二、如何優雅快速地利用Huginn製做專屬RSS。開始以前先對比一下以上三種方式:html

方法 優點 不足 複雜性 穩定性 定製性
Feed43 快速、便捷、免費 免費版需間隔6小時,部分網站不可用 簡單 通常
Huginn 快速、安裝後可便捷添加 專業化程度偏高,須要服務器
Python 高度定製、佔用內存小 專業化程度偏高,不可隨意改正 通常 極高

看我的須要進行選擇,Huginn雖安裝麻煩點,可是一個自動化神器,妙用不只侷限於此。python

前排提示

Python腳本須要放置在雲主機/雲服務器上使用,若是你尚未,趕快購置一臺吧編程

須要瞭解:CSS基礎;Python基礎;Linux基礎命令;利用瀏覽器開發者工具找到對應內容代碼centos

個人使用環境:騰訊雲主機centos7.5,Python2.7(服務器默認已安裝的)瀏覽器

開始定製


先上代碼,如下代碼僅供參考,重要的是學會利用其中的代碼和方法。bash

如下全部操做基於江西師範大學大學教務在線網站服務器

# -*- 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.7cookie

pip install BeautifulSoup
pip install PyRSS2Gen

RSS的本質就是一個固定格式的文件,因此本方法按照如下三步進行,定時執行腳本生成xml文件放置在雲服務器上。app

抓取特定內容

有的頁面能夠直接抓取,有的頁面須要登陸後才能看到,而且有的網站有反爬蟲措施,看抓取的網站採起不一樣方法。本示例先經過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源,重啓時好時很差;
相關文章
相關標籤/搜索