前言
本文轉載自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源,重啟時好時不好;
