用 Kindle 来追网文

用 Kindle 来追网文

为嘛要干这个呢?这个说来话长,可能还是跟本人的实际情况有关系,别人可能还真没有这需求,毕竟,各种设备基本上都有 Kindle 和 Instapaper 的应用吧,直接看不香吗?所以,这里不解释,有需求的自然懂。

代码及主要思路来自于:这里

准备工作

Instapaper

API

原来的代码用的是 Instapaper simple API,而我改过的是用的 Instapaper full API,所以,使用之前需要在 Instapaper 官方 先申请 token

申请通过后,会收到两个东西:

  • token
  • secret

这两样和账号密码后面程序里会用

send to Kindle 设置

注册一个 Instapaper 账号并登录,点击右上角你的用户名,再选 “Settings”(或者在地址栏里直接访问这里),往下翻到 Kindle 的相关设置部分。

这里需要注意的是有两点:

  1. 需要在 Kindle 个人文档设置 里将 Instapaper 的发件地址(类似于 ‘[email protected]’ 这样,具体点击 “Your Kindle Email Address” 旁边链接:”what’s this?” 查看)加到白名单里去。
  2. “Your Kindle Email Address” 是填你 Kindle 设备收文档的地址,在 Kindle 个人文档设置 里可以找到。

运行环境

硬件

这个很正常,你在哪里准备 Python 环境?你的程序写好了在哪里跑?我是跑在一个 VPS 上的。

软件

这里也没什么,也就是各种依赖的包的安装,Python 版本也没啥要求,2 或 3 都应该可以,我用的是 2.7

code

这部分已经更新,详见: 用 Kindle 追网文之二
下面才是真正的戏肉部分,废话不说,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import time
import requests
import re
import os.path
import pickle
import logging
import sys
from datetime import datetime
from bs4 import BeautifulSoup
from pyinstapaper.instapaper import Instapaper, Folder, Bookmark

reload(sys)
sys.setdefaultencoding('utf8')

# 以下四个变量根据自己的情况填写
INSTAPAPER_KEY = '************************'
INSTAPAPER_SECRET = '*********************'
INSTAPAPER_LOGIN = '[email protected]'
INSTAPAPER_PASSWORD = 'password'

# 几本书,用来做例子
novel_list = ["苏厨", "王老实的幸福生活", "大魔王又出手了"]
novel_url = ['392_392855', '7_7669', '431_431648']

instapaper = Instapaper(INSTAPAPER_KEY, INSTAPAPER_SECRET)
instapaper.login(INSTAPAPER_LOGIN, INSTAPAPER_PASSWORD)

def fetch_novel(novel_list, novel_url):
if os.path.isfile('url.pkl'):
with open('url.pkl') as f:
last_url = pickle.load(f)
f.close()
else:
last_url=[[],[],[],[]]

url_archve = []
for j in range(0,len(novel_list)):
old_url=last_url[j]
url = 'https://www.xinxs.la/'+novel_url[j]+'/'
urlm = 'https://m.xinxs.la/'+novel_url[j]+'/'
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
page = requests.get(url)
soup = BeautifulSoup(page.content,'lxml')
soup_text = soup.find_all("a", href=re.compile("\d+\.html"), style="")
latest_url=[]
latest_title=[]
for i in range(0,len(soup_text)):
if "/" in soup_text[i]['href']:
continue

latest_url.append(urlm + soup_text[i]['href'])
latest_title.append(novel_list[j]+'---'+soup_text[i].string.encode('utf-8'))

for k in range(0,len(latest_url)):
if latest_url[k] in old_url:
continue
data = { 'time': time.time(), 'progress_timestamp': 0, 'title': latest_title[k], 'url': latest_url[k] }
bookmark = Bookmark(instapaper, **data)
bookmark.add()

old_url=latest_url
url_archive.append(old_url)

with open('url.pkl', 'w') as f:
pickle.dump(url_archive,f)
f.close()

# 每次抓取新的文章之前,先把以前的删掉
bookmarks = instapaper.get_bookmarks('unread')
for ct, bookmark in enumerate(bookmarks):
bookmark.archive()
bookmark.delete()

fetch_novel(novel_list, novel_url)

待改进的地方

  1. 目前抓链接是通过 www.xinxs.la 来直接抓的,由于其 html 代码不够规范,只能用 lxml 模块丑陋的实现了查找更新链接的工作,后来才发现了原来还有移动端适配版本:m.xinxs.la,如果这个 html 代码规范的话,我想用更优雅的方式来实现查找链接的工作