返回索引页

【原创】自己写个python小程序下载忙总老井履虎尾等人的文章

瓦斯

2011-09-22 22:07:00



缘由:

忙总的学识确实令人佩服,他可以在很短时间内就胸有成竹地写出一篇完整的了好文章来,连错别字都几乎找不到。

1、不止一位网友制作了忙总的文集,供大家免费下载,特别感动。不知道他们是手工还是编程完成,总之都要花费不少精力和时间。

2、看到Adol自己编程手机西西河的数据,也很感兴趣。

3、忙总在丰言不断地有新帖子发出,我们需要一个自动程序来下载。

4、想自己也学一点这方面的技术,那就试着写一点小程序来自动下载忙总的帖子吧。



思路:

1、获取忙总的所有主题帖子的链接;
2、对每个链接,获取其html文本,回帖中的好文暂时不考虑;
3、把html文本转换成txt,保存在硬盘上,方便手机等阅读方式。


平台:

Adol用的是perl,可是我不大熟悉。查了一下资料,python在这方面也很强,就用python吧。


python升级到3.0以后,有些地方做了改进,资料上查到的命令要做相应的改变,我这里就直接用最新的命令了。



一些具体细节:

1、到忙总的家园,点击"查看他的全部主题"可以获得忙总所有主题帖的链接(http://www.fengyanforum.org/forum/search.php?action=finduserthreads&uid=68),一切都将从这个链接开始。将来忙总有新帖了,也还是从这里开始搜索所有的主题帖子的链接。
顺便提一下,忙总是丰言的第68位注册的ID,算是元老级人物了。

2、python有个FancyURLopener的类,可以用来打开网页获取html文本,生了我们很多事,把链接的url送进去,就得到了html。如果你只想保存具有格式的html那么技术工作到此就完成了。lol

3、python有个HTMLParser的类,可以对html进行句法分析,从中获得各种链接、图片、文字等内容,就可以各取所需了。我们需要获取对忙总的所有主题帖子的链接,然后在对每个具体的链接去获取它的html,然后再做处理。

4、对每个具体的主题帖链接,我们要从中读取忙总写的标题,把这个标题加上txt后缀当作文本文件的文件名,把html转换成txt之后保存到这个文本文件中去。当然,我们还需要实现创建和指定一个目录,用来存储所有下载的忙总文集,这里我设置为d:\wxmang。

5、所有忙总主题链接都遍历过了之后,在d:\wxmang目录中预计就该产生一系列的文本文件,文件名是忙总帖子的标题,内容就是帖子中第一页的内容的,其余页的内容暂不考虑。
___

6、目前我把程序的基本部分写出来了,不到80行,感觉python是很强。目前的功能还只能对指定的若干忙总主题帖的链接表分别进行下载保存,也就是程序中的urls。下一步需要完善的就是自动分析建立一个忙总帖子链接表urls,不要人工指定就全部自动化了。

7、这个程序很粗陋,尤其是精简字符串功能cleanline很蹩脚,效果不是很好,欢迎大家帮忙改进。lol

8、这个程序理所当然可以用来下载其他人的好帖子,完成之后只要提供家园首页中的所有主题帖的链接就可以了。

python程序,我就抛砖引玉了,请高手们帮助优化和并提供下一步的建议:




这是09-26-2011, 02:13 AM修改的保存为html的版本:
.zip__wxmang_etc.zip (大小: 1.84 KB / 下载: 56)
.zip__wxmang.zip (大小: 1.46 KB / 下载: 71)

使用方法:
1、下载和安装python3.2
2、下载
.zip__wxmang_etc_ALL_pages.zip (大小: 2.14 KB / 下载: 133)
.zip__wxmang_allpages.zip (大小: 2 KB / 下载: 91)
.zip__wxmang_etc.zip (大小: 1.84 KB / 下载: 56)
.zip__wxmang.zip (大小: 1.46 KB / 下载: 71) ,解压放在d:\wxmang中,得到wxmang_etc.py或wxmang.py
3、资源管理器中双击wxmang_etc.py或wxmang.py(或在DOS窗口中运行python wxmang.py)

09-26-2011, 05:50 PM补充说明:
受到老井的点拨,做了一个做了一个配置文件config.txt,使用者可以根据自己的需要指定下载谁的帖子,放到不同的目录中去。目前我测试已下载履虎尾的40篇主题帖子。
在config.txt写下了三个作者的参数,每人三列,
第一列是id可以随便写,方便记忆就可以了;
第二列是存放目录请根据例子格式修改,最好是事先建立好那个目录;
第三列是该作者的搜索起始链接。列之间用TAB分割:
引用:老井 D:\\laojing\\ http://www.fengyanforum.org/forum/search...s&uid=68
履虎尾 D:\\lvhuwei\\ http://www.fengyanforum.org/forum/search...ds&uid=68
忙总 D:\\wxmang\\ http://www.fengyanforum.org/forum/search...ads&uid=68
如何获取不同作者的作者的搜索起始链接?
到他的家园,看到"查看他的全部主题"的蓝色链接,用右键菜单复制链接,粘贴到config.txt的第三列就可以了。
你可以随便添加很多作者。
目前忙总的文章总多,我把他放在最后处理,别的作者目前帖子相对少一些可以较快处理完。


09-26-2011, 11:04 PM:
增加
.zip__wxmang_allpages.zip (大小: 2 KB / 下载: 91) 一个功能版本,对于每个主题帖子除了首页,还附带下载其余页的内容,保存的文件也会大几倍。

新增完整版保存每个主题所有页的内容:

.zip__wxmang_etc_ALL_pages.zip (大小: 2.14 KB / 下载: 133)

01-03-2012, 06:54 PM更新2012版:

.zip__wxmang_etc_all_pages_2012.zip (大小: 2.14 KB / 下载: 45) (这个帖子最后修改于: 01-03-2012 06:55 PM by 瓦斯.)

12 条留言

1900-01-01 00:00:00
这个厉害,我都是笨办法,一页页拷贝,累死人。赞赞捂嘴笑

(09-22-2011 10:07 PM)瓦斯 提到: _缘由:

忙总的学识确实令人佩服,他可以在很短时间内就胸有成竹地写出一片完整的了好文来,连错别字都几乎找不到。

1、不止一位网友制作了忙总的文集,供大家免费下载,特别感动。不知道他们是手工还是编程完成,总之都要花费不少精力和时间。

2、看到Adol自己编程手机西西河的数据,也很感兴趣。

想自己也学一点这方面的技术,那就试着写一点小程序来自�......
2011-09-22 23:14:00 回复
瓦斯
2011-09-23 17:59:00
程序改好了,在我这里试验10分钟之内可以下载忙总在丰言的121篇主题帖子。自动用忙总的帖子标题加上.txt作为文件名,默认保存到d:\wxmang目录中去。
如果你想试用,可以将下面的程序复制保存成d:\wxmang\wxmang.py,然后在一个DOS窗口中打入python d:\wxmang\wxmang.py就可以自动获得忙总所有的帖子了。

前提要求:你的电脑安装了python,这个程序不大,免费的,到处都可以下载到。

本程序设计默认下载忙总在丰言的主题帖子,如果要下载别人的,将其中的搜索链接改掉就可以了。

如果要用到丰言之外的论坛,需要稍作修改。

源程序贴在下面,欢迎报告错误,欢迎提出改进意见。

PHP 代码:
#!/usr/bin/python
#_-*-_coding:_UTF-8_-*-
import_io,sys,re
import_urllib
.request,_urllib.parse,_urllib.error_#Python3
from_urllib.request_import_FancyURLopener
from_html
.parser_import_HTMLParser
from_io_import_StringIO

output_path
="D:\\wxmang\\"
url_author="http://www.fengyanforum.org/forum/search.php?action=results&sid=5499aced95b497d5fb8a7f3f937b3ac2"
_
#_搜索忙总所有主题帖子,搜索别人的修改此链接

def_get_web_content(url):
____
myopener_=_FancyURLopener()__
____print(
"reading_%s..."_%(url))
____
content_=_myopener.open(url).read().decode("utf-8")
____return_
content
_
class_MyHTMLParser(HTMLParser):
____
def___init__(self):_
________
HTMLParser.__init__(self)
________
self.text_=_StringIO()
________
self.js=0
________self
.links=[]
____
def_handle_starttag(self,_tag,_attrs):
________if_
tag=='a'_and_attrs:
____________
link=attrs[0][1]
____________if_
link_not_in_self.links_\
____________and_((
"showthread.php?"_in_link_and_"page"_not_in_link_and_"lastpost"_not_in_link)_\
________________or_
"search.php?"_in_link_and_"page"_in_link):
________________
self.links.append(link)
____
def_handle_data(self,_data):
________if_
"<!--"_in_data:
____________
#_print("js_tag_begin")
____________
self.js=1
________elif_
"-->"_in_data:
____________
#_print("js_tag_end")
____________
self.js=0
________
else:_#_self.js==0:
____________
self.text.write(data)
____
def_get_text(self):
________return_
self.text.getvalue()
____
def_get_link(self):
________return_
self.links

def_cleanline
(line):
____
line1=""
____
while_1:
________
line1=line.replace('\r\n\r\n\r\n','').replace('\t','').replace('\n\n\r','').replace('\r\n\r','').replace('\n\r\n','')
________if_
line1!=line:
____________
line=line1
________
else:
____________break
____return_
line1
________
def_save_list2file
(filename,mylist):
____print(
"writing_%s_bytes_to_[_%s_]..."_%(len(mylist),filename))
____
f_=_open(filename,"w")
____for_
line_in_mylist:
________try:
____________
f.write("%s"_%line)
________
except_ValueError_as_e:
____________print(
e)
____
f.close()
____
#_print("[_%s_]_closed."_%filename_)
____
def_save_url2file(output_path,url):
____
content=get_web_content(url)
____
title=content.splitlines()[3].replace("<title>","").replace("</title>","").replace(":","").lstrip()
____
#获取主帖标题,当作文件名
____
p=MyHTMLParser()_
____
p.feed(content)
____
text_=_cleanline(p.get_text())
____
save_list2file(output_path+title+".txt",text)

def_get_link2file(output_path,url_author):
____
content=get_web_content(url_author)
____
p=MyHTMLParser()_
____
p.feed(content)
____
links_=p.get_link()
____
#_save_list2file(output_path+"urls.txt",links)
____
return_links

links_page1
=get_link2file(output_path,url_author)_#用搜索忙总主题的首页链接搜索,返回第一页的所有链接
url_authors=[]_#其余主题页的链接
urls=[]_#_具体主题帖子的具体链接
for____link_in_links_page1:
____if_
"showthread.php?"_in_link:
________
urls.append(link)_#_保存搜索结果第一页中的每个主题帖链接
____
else:
________
url_authors.append(link)_#保存搜索结果第一页中显示的其余页的链接
#第一页的主帖链接搞定,其余搜索页的链接搞定
for_link_in_url_authors:_#对每个其余搜索页处理
____
links_restpage=get_link2file(output_path,"http://www.fengyanforum.org/forum/"+link)_#_读取其余页的所有帖子链接
____
for____link_in_links_restpage:
________if_
"showthread.php?"_in_link:_#_只需要主帖子的链接了,不需要其余页的链接
____________
urls.append(link)_
#至此所有页的主帖链接搜集完毕
for_url_in_urls:_#对每个主帖的链接处理,保存结果到主帖标题的文件名中去
____
save_url2file(output_path,"http://www.fengyanforum.org/forum/"+url)_
___ (这个帖子最后修改于: 09-23-2011 06:07 PM by 瓦斯.)
井底望天
2011-09-24 14:26:00
(09-22-2011 10:07 PM)瓦斯 提到: _缘由:

忙总的学识确实令人佩服,他可以在很短时间内就胸有成竹地写出一篇完整的了好文章来,连错别字都几乎找不到。

1、不止一位网友制作了忙总的文集,供大家免费下载,特别感动。不知道他们是手工还是编程完成,总之都要花费不少精力和时间。

2、看到Adol自己编程手机西西河的数据,也很感兴趣。

3、忙总在丰言不断地有新帖子发出,我们需要一个自动程......

这两天,我正想着用python写个程序,往上贴帖子呢,呵呵。

忙兄,要是有兴趣学python,我可以教你。

对了前几天写一个管理VMware的程序,丫居然不支持python,害得我只好用Perl写了一个接口,痛苦啊,每一句都要加分号。
谢谢,我暂时还是骑自行车吧,太快了我还控制不住。等你们把宝马开得顺畅了,我再来试试夏利。泪流晕可怜


(09-24-2011 02:26 PM)井底望天 提到: _[quote='瓦斯' pid='29882' dateline='1316700449']
缘由:

忙总的学识确实令人佩服,他可以在很短时间内就胸有成竹地写出一篇完整的了好文章来,连错别字都几乎找不到。

1、不止一位网友制作了忙总的文集,供大家免费下载,特别感动。不知道他们是手工还是编程完成,总之都要花费不少精力和时间。

2、看到Adol自己编程手机西西河的数据,也很感兴趣。

3、忙总在丰言不��......
2011-09-24 16:32:00 回复
madercf
2011-10-12 16:23:00
盛赞楼主的工作!
提两点需求:
1)这个程序要是用到其它网站,比如西西河里会怎样?
2)对于一些人,可否设置定时或每隔一断时间去下载文章呢?

(09-23-2011 05:59 PM)瓦斯 提到: _程序改好了,在我这里试验10分钟之内可以下载忙总在丰言的121篇主题帖子。自动用忙总的帖子标题加上.txt作为文件名,默认保存到d:\wxmang目录中去。
如果你想试用,可以将下面的程序复制保存成d:\wxmang\wxmang.py,然后在一个DOS窗口中打入python d:\wxmang\wxmang.py就可以自动获得忙总所有的帖子了。

前提要求:你的电脑安装了python,这个程序不大,免费的,到处都可以下载到。
......
瓦斯
2011-10-12 16:49:00
(10-12-2011 04:23 PM)madercf 提到: _盛赞楼主的工作!
提两点需求:
1)这个程序要是用到其它网站,比如西西河里会怎样?
2)对于一些人,可否设置定时或每隔一断时间去下载文章呢?

感谢反馈!

1、现在还不能直接用到西西河,如果熟悉编程的人在此基础上修改后用到西西河应该没问题。

对于我这个凡人来说,用到西西河还有一个技术问题没有解决,就是如果直接输入西西河的网址,首先返回的是西西河那个临时的页面:“载入中...必要时请刷新页面”。我还没有找到一个方式,让程序等待到载入完整的页面之后才把结果保存下来。

2、这应该是可以做到的,可以有两种方式:
a、这个下载程序就要一直开着,那我需要修改内容,让它定时重复下载。(其实你自己重复定时运行下载也很快)
b、在windows的任务中自己添加一个任务项,就像设置每周有一天半夜自动扫描病毒那样,自己设置什么时间自动启动这个下载程序。
madercf
2011-10-12 17:46:00
解答真快!
我现在碰到的一些问题,在楼里下了几个版本都是这个情况,不知道是什么原因,只有0个链接;而且明明配置文件也在,不知道为什么说找不到。
问题的截图见下




(10-12-2011 04:49 PM)瓦斯 提到: _感谢反馈!

1、现在还不能直接用到西西河,如果熟悉编程的人在此基础上修改后用到西西河应该没问题。

对于我这个凡人来说,用到西西河还有一个技术问题没�......


附件 图片
___
瓦斯
2011-10-12 23:27:00
(10-12-2011 05:46 PM)madercf 提到: _解答真快!
我现在碰到的一些问题,在楼里下了几个版本都是这个情况,不知道是什么原因,只有0个链接;而且明明配置文件也在,不知道为什么说找不到。
问题的截图见下

问题出在最近为了节省带宽把丰言的logo动态改成静态的时某些地方的修改。
把程序修改了一下,你式一下看可以吗?

.zip__wxmang_etc_ALL_pages.zip (大小: 2.14 KB / 下载: 29)
现在忙总帖子有些都到了50页之后了,下载起来是很花时间了。
madercf
2011-10-13 09:41:00
试过,可以的!

但是仍有两个问题:
1)wxmang_etc_all_page.py和config.txt两个文件明明是放在同一个文件夹下的,为什么还是显示找不到config.txt呢?
2)查看已经下载的文件,发现点开的那一页可以打开;如果是第1页,那么点第2页、第n页,则打不开




(10-12-2011 11:27 PM)瓦斯 提到: _问题出在最近为了节省带宽把丰言的logo动态改成静态的时某些地方的修改。
把程序修改了一下,你式一下看可以吗?

现在忙总帖子有些都到了50页......
瓦斯
2011-10-13 15:03:00
(10-13-2011 09:41 AM)madercf 提到: _试过,可以的!

但是仍有两个问题:
1)wxmang_etc_all_page.py和config.txt两个文件明明是放在同一个文件夹下的,为什么还是显示找不到config.txt呢?
2)查看已经下载的文件,发现点开的那一页可以打开;如果是第1页,那么点第2页、第n页,则打不开
......

1、像你前面那个截图一样,如果你的当前目录是c:\python32那么程序也只在这里查找config.txt。如果你的当前目录在d:\wxmang那么config.txt也要放这里,运行命令可以是:c:\python32\python wxmang_etc_all_page.py。

2、因为网页上的第n页是相对链接,也就是说省略了前面很长的一串丰言网址(绝对地址),如果这个文件本身在丰言服务器上那么可以找到第n页,而放到你的机器上时因为少绝对地址就找不到了。不过你不用去点击第n页了因为我们的程序已经把所有的页都下载堆积成一整大页了,你只要逐渐往下翻看就可以到最后一页了。
s0158
2012-01-03 00:26:00
(10-13-2011 03:03 PM)瓦斯 提到: _1、像你前面那个截图一样,如果你的当前目录是c:\python32那么程序也只在这里查找config.txt。如果你的当前目录在d:\wxmang那么config.txt也要放这里,运行命令可以是:c:\python32\python wxmang_etc_all_page.py。

2、因为网页上的第n页是相对链接,也就是说省略了前面很长的一串丰言网址(绝对地址),如果这个文件本身在丰言......

老大,现在又不行了可怜泪流失望伤心抓狂,麻烦你再鼓捣一下吧。
瓦斯
2012-01-03 18:57:00
(01-03-2012 12:26 AM)s0158 提到: _老大,现在又不行了可怜泪流失望伤心抓狂,麻烦你再鼓捣一下吧。

呵呵,果然是,最近一段时间改版更新,有些参数变化了。
我相应修改了一下,这个2012版我使用了可以下载了:
2012版 (这个帖子最后修改于: 01-03-2012 06:58 PM by 瓦斯.)
s0158
2012-01-04 01:02:00
(01-03-2012 06:57 PM)瓦斯 提到: _呵呵,果然是,最近一段时间改版更新,有些参数变化了。
我相应修改了一下,这个2012版我使用了可以下载了:
2012版

谢谢老大,现在能用了,不过好像还有点问题。
比如程序发现忙总主贴共8页,181个帖子,但我运行几次都是在下载到第四页,“(新帖)管理短篇N则:十二、财务总监的几个职责”(第91个主题)时程序退出,不知是哪里的的问题。
另外,我试了试下载忙总“他的全部帖子”不成功,是我的原因还是程序的限制? (这个帖子最后修改于: 01-04-2012 01:04 AM by s0158.)
返回索引页