python简单爬虫nlcdownloader笔记

by windviki 2012/02/06
转载请注明出处。

元宵节快乐。

我个人是个国学兼考据爱好者,但是又不习惯国学数典和川大儒藏的那种氛围,所以在几个国学论坛都是游民,只限偶尔逛逛,没在上面下过什么东西。

后来查谱牒资料的时候需要查阅简阳县志,仁寿县志,井研县志,麻城县志等,发现整个网上都很难找。几个国学论坛上可以找到部分,限制也非常的多。微博求助,百度高分悬赏无果。后来看到了国家数字图书馆(http://res4.nlc.gov.cn),个人感觉是“国”字头的为数不多的做得不错的网站之一。不错之处不在于网站的设计和技术,而是肯把咱祖宗的东西拿出来分享的精神。不再藏着掖着,这才能真正把国学发扬光大,把文化传承下去。

数字图书馆阅览方志的时候是在线pdf形式,通过Adobe acrobat的active X插件进行加载。每看一页都要重新加载下一个对象,相当的慢。本身又不可能全文检索,目录看起来都很吃力。所以根本无法耐下心来一页页翻阅,查找。查了几次资料后痛苦至极。

过年后没美剧看了(放假7天的时候给消灭光了),比较无聊,就用python做了一个国家数字图书馆数字方志资源的下载器,大概800行(包括url数据),算一个很简单的单网站爬虫。下完了我想收集的几套地方志,感觉甚爽。写之前还专程搜过下载器,发现有两个不怎么知名的程序可以下载nlc资源,但是需要注册收费。后来没找到程序文件,也就没仔细研究了。自己分析html,抓包,调试,搞定。

主要思路是:

1.找到包含书籍章节信息的页面(我称之为search_url,因为一般都是通过关键字搜索点进去的),如 http://res4.nlc.gov.cn/home/search.trs?method=showDetail&channelid=8&id=312001075157&searchWord=%28+bookname%3D+%27%C2%E9%B3%C7%27++%29

该页面可以看到分为本书有多少卷,每一卷第一页的查看链接等。

2.程序读取search_url的列表文件,处理每本书。请求该search_url的页面,对得到的html结果进行分析。分析的时候用到了额BeautifulSoup库,很好用。

3.得到了每个卷的链接后(我称之为chapter_url),照样请求页面,对返回的html结果进行分析。可以发现这是一个复杂的(简单的?)frame页面,嵌了好多个页面在里面。右下角的才是主体展示pdf的页面(detail_url),是我们重点关注的对象。而顶上的页面(tophead_url)显示有当前页数和总页数,可以供我们分析取得下一页pdf的方法。

4.查看html源代码之后可以很容易的用BeautifulSoup分析出来pdf object的url(object_url)。请求之后应该可以接收到二进制数据了。

5.这里用到的http库可以有很多选择,由于分析的时候要改header,于是选用了low-level的httplib2。

遇到的问题和经验总结:

1.必须要处理cookie才能正常保持连接。至于如何处理的话,在用浏览器在线看的时候自己抓包看一下就知道了(wireshark或者firedebug均可)。

2.之前以为要检查reference,走了不少弯路,多了很多请求。后来发现根本不用。

3.windows下使用httplib2得到response的时候要注意,内容会被转换为win下的换行格式(\r\n),pdf流也没能幸免,导致下下来的文件坏掉。这问题不是httplib2本身的(大概看了下,好像在httplib里面)。read的时候没有文本模式和二进制模式的区分,所以出问题。最后通过cygwin下运行脚本解决。

4.得到一本书的几千个pdf文件之后,发现pdf是加密的(权限限制,不准编辑等)。需要用到解密的软件进行批处理操作。尝试了N个,没一个中意的。最后发现AdvancedPDFTools很不错,因为它提供命令行版本,操作简洁方便。网上有GUI版本的破解可用,不知道好用不。因为我需要在python中进行工具的调用,以便批量处理,所以我需要的是命令行版本。杯具的是命令行版本没有破解,所以我可耻的对其进行了爆破,得到了全功能版。爆破过程没啥好提的,属于最基础的IDA/OD/HXD操作。

5.解密之后的图片提取和合并,这里推荐PDF补丁丁这款软件。.NET写的,功能很不错。作者博客提供下载。http://pdfpatcher.cnblogs.com/

6.得到图片后可以进行降质操作(批量处理图片和转换格式)。图片批量处理我是手动进行的,用到了XnView的批量转换。其实完全可以用python的pil库完成。

7.处理后的图片转换为单个的pdf文件。除了可以用PDF补丁丁来做,还可以用老马的FreePic2Pdf,也是很不错的一款软件。

8.尝试了用pyPdf进行pdf的合并和修改。后来发现该库还不具备修改pdf页面内容的能力。图片解码的DCTDecode Filter没实现,还多其他的Filter也还没有。后面有空的时候打算改改,加这么几个Filter应该不是很困难。

nlcdownloader本身的代码不提供下载。这么一个还不错的在线文献网站要是被拖垮,或者说爬数据的人多了,改了验证方式。这都不是好事情。

python是很强大的,如果有想法,不妨去动手实现:)

posted on 2012-02-06 14:40  windviki  阅读(785)  评论(2编辑  收藏  举报