最近买了个kindle,为了方便阅读,写了个程序抓取网页内容发送到Kindle

主要觉得往kindle里加书籍太麻烦了,要下载下来,还要通过邮件发送,特别一些网页文字版的书籍没办法放到kindle里,所以想着还不如自己动手丰衣足食,写一个程序直接抓取网页内容,制作成书籍,然后自动发送到kindle里。

程序首先操作简单“一键推送”,还有就是书籍要带目录。

先做了个winform版的,有时间再编写个Web版的。

程序相关的技术:

1.使用NSoup分析网页

2.爬虫规则设计

3.多线程爬网页

4.生成txt文本和pdf文件

5.使用邮件推送到自己的kindle设备

程序界面效果:

生成的TXT文件

生成的pdf文件

BookRule.xml配置文件

<BookSite Name="纵横小说网" Url="http://book.zongheng.com" charset="utf-8">
    <title>.read_con h1</title>
    <auther>.read_con a.fb</auther>
    <cover></cover>
    <introduction></introduction>
    <catalog>.read_con .chapterBean a</catalog>
    <content>#chapterContent</content>
  </BookSite>

<SearchSite Name="纵横网搜索" SearchUrl="http://search.zongheng.com/search/bookName/{0}/1.html" charset="utf-8" list=".search_text">
    <title>h2</title>
    <auther>.rela a</auther>
    <cover></cover>
    <introduction>.j_info</introduction>
    <bookurl eq="1">.search_oprate p span a</bookurl>
  </SearchSite>

多线程爬网页参考:http://www.cnblogs.com/kakake/p/4151691.html

生成pdf文件使用了itextsharp.dll组件

public void SavePdf(string filename)
        {
            FileInfo fileinfo = new FileInfo(filename);
            if (fileinfo.Directory.Exists == false)
                Directory.CreateDirectory(fileinfo.DirectoryName);

            Document doc = new Document(PageSize.A5, 10, 10, 10, 10);
            PdfWriter.GetInstance(doc, new FileStream(filename, FileMode.Create));
            doc.Open();

            //指定字体库,并创建字体
            BaseFont baseFont = BaseFont.CreateFont(
                "C:\\WINDOWS\\FONTS\\SIMYOU.TTF",
                BaseFont.IDENTITY_H,
                BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font font1 = new iTextSharp.text.Font(baseFont, 18);
            iTextSharp.text.Font font2 = new iTextSharp.text.Font(baseFont, 20);

            Chapter chapter1 = new Chapter(title, 1);
            chapter1.Add(new Paragraph(title, font2));
            chapter1.Add(new Paragraph(auther, font1));
            chapter1.Add(new Paragraph(introduction, font1));
            for (int i = 0; i < catalogs.Count; i++)
            {
                Section section1 = chapter1.AddSection(catalogs[i].text);
                section1.Add(new Paragraph(catalogs[i].page.text, font1));
                section1.TriggerNewPage = true;
                section1.BookmarkOpen = false;
            }

            chapter1.BookmarkOpen = false;
            doc.Add(chapter1);
            doc.Close();
        }

发送邮件使用的System.Net.Mail中微软封装好的MailMessage类,由于没有自己的邮件服务器,使用QQ邮箱推送到kindle非常不稳定,有时候可以有时候又发送失败。

 /// <summary>
        /// 发送kindle的EMail
        /// </summary>
        /// <param name="toEmail">kindle的EMail地址</param>
        /// <param name="type">发送的文件 0:pdf;1:txt</param>
        /// <param name="filename">文件名</param>
        public void SendMail(string toEmail, int type, string filename)
        {
            //确定smtp服务器地址。实例化一个Smtp客户端
            System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.qq.com");
            //生成一个发送地址
            string strFrom = "****@qq.com";

            //构造一个发件人地址对象
            MailAddress from = new MailAddress(strFrom, "kakake", Encoding.UTF8);
            //构造一个收件人地址对象
            MailAddress to = new MailAddress(toEmail, "kindle", Encoding.UTF8);

            //构造一个Email的Message对象
            MailMessage message = new MailMessage(from, to);

            if (type == 0)
                SaveTxt(filename);
            else if (type == 1)
                SavePdf(filename);

            //得到文件名
            string fileName = filename;
            //判断文件是否存在
            if (File.Exists(fileName))
            {
                //构造一个附件对象
                Attachment attach = new Attachment(fileName);
                //得到文件的信息
                ContentDisposition disposition = attach.ContentDisposition;
                disposition.CreationDate = System.IO.File.GetCreationTime(fileName);
                disposition.ModificationDate = System.IO.File.GetLastWriteTime(fileName);
                disposition.ReadDate = System.IO.File.GetLastAccessTime(fileName);
                //向邮件添加附件
                message.Attachments.Add(attach);
            }
            else
            {
                throw new Exception("[" + fileName + "]文件没找到!");
            }

            //添加邮件主题和内容
            message.Subject = "书籍发送到kindle";
            message.SubjectEncoding = Encoding.UTF8;
            message.Body = "";
            message.BodyEncoding = Encoding.UTF8;

            //设置邮件的信息
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.IsBodyHtml = false;

            //如果服务器支持安全连接,则将安全连接设为true。
            //gmail支持,163不支持,如果是gmail则一定要将其设为true
            client.EnableSsl = true;

            //设置用户名和密码。
            //string userState = message.Subject;
            client.UseDefaultCredentials = false;
            string username = "user";
            string passwd = "****";
            //用户登陆信息
            NetworkCredential myCredentials = new NetworkCredential(username, passwd);
            client.Credentials = myCredentials;
            //发送邮件
            client.Send(message);
        }
    }

程序下载地址:http://pan.baidu.com/s/1dDndERB

时间: 2024-10-05 20:47:12

最近买了个kindle,为了方便阅读,写了个程序抓取网页内容发送到Kindle的相关文章

JAVA抓取网页内容、生成kindle支持的mobi格式的文件时可能会遇到的问题及解决方案

问题1:内容抓取Batch在解析rss时,有的网站的rss中明明有发布时间,但获取的发布时间始终为null. 原 因:那些网站的rss的发布时间格式不符合Rome.jar的要求,无法解析,所以返回null. 解决方案:修改Rome.jar的源码,在com/sun/syndication/rome.properties中增加             datetime.extra.masks属性,用于适应多种发布日期的格式.             如: datetime.extra.masks=y

抓取网页内容生成kindle电子书

参考: http://calibre-ebook.com/download_linux http://blog.codinglabs.org/articles/convert-html-to-kindle-book.html The Linux Command Line #TLCL.recipe from calibre.web.feeds.recipes import BasicNewsRecipe class The_Linux_Command_Line(BasicNewsRecipe):

用calibre抓取RSS新闻制作电子书及推送到kindle

calibre可以从RSS源抓取内容,转换成它所支持格式的电子书,还可以推送到阅读器设备.下面来看看在calibre图形界面和命令行下如何实现这些功能. 在图形界面抓取新闻 自定义新闻来源 看看我们自定义了什么 命令行下生成电子杂志 命令行推送到Kindle 简单定时推送的实现 一些要注意的问题 其它方法 参考 calibre可以从RSS源抓取内容,转换成它所支持格式的电子书,还可以推送到阅读器设备.下面来看看在calibre图形界面和命令行下如何实现这些功能. 在图形界面抓取新闻 打开cali

使用fiddler抓取微信公众号文章的阅读数、点赞数、评论数

1 设置fiddler支持https 打开fiddler,在菜单栏中依次选择 [Tools]->[Options]->[HTTPS],勾上如下图的选项: 单击Actions,选择Export Root Certificate to Desktop(导出证书到桌面)选项: 安装证书: 在桌面上找到FiddlerRoot.cer文件,双击进行安装直到导入成功. 2 配置fiddler抓取规则 在菜单栏中依次选择 [Rules]->[Customize Rules] 弹出Fiddler Scr

20.multi_协程方法抓取总阅读量

# 用asyncio和aiohttp抓取博客的总阅读量 (提示:先用接又找到每篇文章的链接) # https://www.jianshu.com/u/130f76596b02 import re import asyncio import aiohttp import requests import ssl from lxml import etree from asyncio.queues import Queue from aiosocksy import Socks5Auth from a

自定义日志阅读器——包括了一个load取Tomcat日志的分析器

最近在写往公司产品里添加Tomcat适配器,以支持Tomcat.有一些功能需要摘取到Tomcat的部分日志.没有合适的工具,也不想去网上找了,就自己写了一个. 简单的画了一下设计方案: 下面直接上代码了: 日志阅读器: 1 package com.fjn.tools.log.reader; 2 3 import java.io.File; 4 import java.util.LinkedList; 5 import java.util.List; 6 import java.util.Scan

kindle使用参考

转载链接:http://blog.sina.com.cn/nuanfengjia 今天买的kindle499刚刚到货了,体验略差,还有一个就是无按键,完全不会玩,只能自己慢慢摸索了. [新Kindle]499款新Kindle(new Kindle)最全的使用教程和小技巧 (2014-10-05 10:47:22) 转载▼ 标签: 文化 kindle6 新kindle kindle使用 kindle帮助 分类: [初相知]入门Kindle [温馨提示] 如果您还未购买New Kindle,您可以考

【开源一个小工具】一键将网页内容推送到Kindle

最近工作上稍微闲点,这一周利用下班时间写了一个小工具,其实功能挺简单但也小折腾了会. 工具名称:Simple Send to Kindle Github地址:https://github.com/zhanjindong/SimpleSendToKindle 功能:Windows下一个简单的将网页内容推送到Kindle的工具. 写这个工具的是满足自己的需求.自从买了Kindle paperwhite 2,它就成了我使用率最高的一个电子设备.相信很多Kindle拥有者和我一样都有这样一个需求:就是白

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的