├── README.md
├── main.py
└── 廖雪峰python教程HTML版
├── 0Python教程.html
├── 100Day 12 - 编写日志列表页.html
├── 101Day 13 - 提升开发效率.html
├── 102Day 14 - 完成Web App.html
├── 103Day 15 - 部署Web App.html
├── 104Day 16 - 编写移动App.html
├── 10使用list和tuple.html
├── 11条件判断和循环.html
├── 12使用dict和set.html
├── 13函数.html
├── 14调用函数.html
├── 15定义函数.html
├── 16函数的参数.html
├── 17递归函数.html
├── 18高级特性.html
├── 19切片.html
├── 1Python简介.html
├── 20迭代.html
├── 21列表生成式.html
├── 22生成器.html
├── 23函数式编程.html
├── 24高阶函数.html
├── 25匿名函数.html
├── 26装饰器.html
├── 27偏函数.html
├── 28模块.html
├── 29使用模块.html
├── 2安装Python.html
├── 30安装第三方模块.html
├── 31使用__future__.html
├── 32面向对象编程.html
├── 33类和实例.html
├── 34访问限制.html
├── 35继承和多态.html
├── 36获取对象信息.html
├── 37面向对象高级编程.html
├── 38使用__slots__.html
├── 39使用@property.html
├── 3Python解释器.html
├── 40多重继承.html
├── 41定制类.html
├── 42使用元类.html
├── 43错误、调试和测试.html
├── 44错误处理.html
├── 45调试.html
├── 46单元测试.html
├── 47文档测试.html
├── 48IO编程.html
├── 49文件读写.html
├── 4第一个Python程序.html
├── 50操作文件和目录.html
├── 51序列化.html
├── 52进程和线程.html
├── 53多进程.html
├── 54多线程.html
├── 55ThreadLocal.html
├── 56进程 vs. 线程.html
├── 57分布式进程.html
├── 58正则表达式.html
├── 59常用内建模块.html
├── 5使用文本编辑器.html
├── 60collections.html
├── 61base64.html
├── 62struct.html
├── 63hashlib.html
├── 64XML.html
├── 65HTMLParser.html
├── 66常用第三方模块.html
├── 67PIL.html
├── 68图形界面.html
├── 69网络编程.html
├── 6输入和输出.html
├── 70TCP IP简介.html
├── 71TCP编程.html
├── 72UDP编程.html
├── 73电子邮件.html
├── 74SMTP发送邮件.html
├── 75POP3收取邮件.html
├── 76访问数据库.html
├── 77使用SQLite.html
├── 78使用MySQL.html
├── 79使用SQLAlchemy.html
├── 7Python基础.html
├── 80Web开发.html
├── 81HTTP协议简介.html
├── 82HTML简介.html
├── 83WSGI接口.html
├── 84使用Web框架.html
├── 85使用模板.html
├── 86协程.html
├── 87gevent.html
├── 88实战.html
├── 89Day 1 - 搭建开发环境.html
├── 8数据类型和变量.html
├── 90Day 2 - 编写数据库模块.html
├── 91Day 3 - 编写ORM.html
├── 92Day 4 - 编写Model.html
├── 93Day 5 - 编写Web框架.html
├── 94Day 6 - 添加配置文件.html
├── 95Day 7 - 编写MVC.html
├── 96Day 8 - 构建前端.html
├── 97Day 9 - 编写API.html
├── 98Day 10 - 用户注册和登录.html
├── 99Day 11 - 编写日志创建页.html
└── 9字符串和编码.html
/README.md:
--------------------------------------------------------------------------------
1 | # 一个python爬虫小程序
2 |
3 | ## 起因
4 | 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊、“多线程”啊都没有学到。
5 |
6 | 想到廖雪峰大神的python教程很经典、很著名。就想找找有木有pdf版的下载,结果居然没找到!!CSDN有个不完整的还骗走了我一个积分!!尼玛!!
7 |
8 | 怒了,准备写个程序直接去爬廖雪峰的教程,然后再html转成电子书。
9 |
10 |
11 | ## 过程
12 |
13 | 过程很有趣呢,用浅薄的python知识,写python程序,去爬python教程,来学习python。想想有点小激动……
14 |
15 | 果然python很是方便,50行左右就OK了。直接贴代码:
16 |
17 | # coding:utf-8
18 | import urllib
19 |
20 | domain = 'http://www.liaoxuefeng.com' #廖雪峰的域名
21 | path = r'C:\Users\cyhhao2013\Desktop\temp\\' #html要保存的路径
22 |
23 | # 一个html的头文件
24 | input = open(r'C:\Users\cyhhao2013\Desktop\0.html', 'r')
25 | head = input.read()
26 |
27 | # 打开python教程主界面
28 | f = urllib.urlopen("http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000")
29 | home = f.read()
30 | f.close()
31 |
32 | # 替换所有空格回车(这样容易好获取url)
33 | geturl = home.replace("\n", "")
34 | geturl = geturl.replace(" ", "")
35 |
36 | # 得到包含url的字符串
37 | list = geturl.split(r'em;">')
41 |
42 | # 开始遍历url List
43 | for li in list:
44 | url = li.split(r'">')[0]
45 | url = domain + url #拼凑url
46 | print url
47 | f = urllib.urlopen(url)
48 | html = f.read()
49 |
50 | # 获得title为了写文件名
51 | title = html.split("")[1]
52 | title = title.split(" - 廖雪峰的官方网站")[0]
53 |
54 | # 要转一下码,不然加到路径里就悲剧了
55 | title = title.decode('utf-8').replace("/", " ")
56 |
57 | # 截取正文
58 | html = html.split(r'')[1]
59 | html = html.split(r'您的支持是作者写作最大的动力!
')[0]
60 | html = html.replace(r'src="', 'src="' + domain)
61 |
62 | # 加上头和尾组成完整的html
63 | html = head + html+"