设为首页 收藏本站
查看: 952|回复: 0

[经验分享] Python抓取单个网页中所有的PDF文档

[复制链接]

尚未签到

发表于 2015-4-23 09:12:19 | 显示全部楼层 |阅读模式
Github博文地址,此处更新可能不是很及时。

1.背景
  最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构与算法。结合最近在学英语,然后干脆就用英文喽。然后选定一本参考书籍《Data Structures and Algorithms in Java》。
刚开始看还是蛮吃力的,慢慢来。由于之前有翻录书籍附录的习惯,于是就去书籍附带的官网看了下,发现http://ww0.java4.datastructures.net/handouts/ 里面附带的PDF文档居然不错,图文并茂,作为理解是个不错的材料,果断要下载啊。但是,尼玛,结果发现,好多个,这一个一个另存为真是要命,想想还是用什么办法下载下来吧。

2.实现
  考虑目前学过的了解的所有语言,可以用来实现的,排列一下程度:


  • Java/Android 熟悉
  • C# 熟悉
  • Python 了解语法
  • Javascript 了解一些
  • C/C++ 了解语法
  为了实现这个,当然是最简单最快最好了。考虑到大学一直用C#,要不用它?但发现OSX平台只能用Mono了,还得重新熟悉。Java实现也不快,从需要的时间考虑。Javascript不熟,貌似可以用node.js去写(atom就是用的它)。不熟。C/C++好多年没用过了,而且,实现起来代码一大堆,特别麻烦。再考虑之前一段时间正好在Codecademy学过语法,就拿它来练手吧。
OK,确定了用Python。后续就是怎么去请求网络了,解析网页html标签,提取下载链接,下载文件了。虽然不懂这些在Python里面是怎么实现的,但是流程是确定的,按照流程去网站找现成的,此处不研究原理,实现功能即可。
接下来就是各种搜索引擎搜索东西了,Google可,百度亦可(不同引擎侧重不一样)。不要忘了目的是什么,搜索相关的资料。
好了,搜索之后,确定请求网络下载网页用requests,解析html用BeautifulSoup,提取下载链接BeautifulSoup,下载文档(stackoverflow中找到了一段下载文件的代码)。
然后就是把她们一起组合了。组合之后的代码如下:


DSC0000.gif DSC0001.gif


1 #file-name: pdf_download.py
2   __author__ = 'rxread'
3   import requests
4   from bs4 import BeautifulSoup
5
6
7   def download_file(url, index):
8       local_filename = index+"-"+url.split('/')[-1]
9       # NOTE the stream=True parameter
10       r = requests.get(url, stream=True)
11       with open(local_filename, 'wb') as f:
12           for chunk in r.iter_content(chunk_size=1024):
13               if chunk: # filter out keep-alive new chunks
14                   f.write(chunk)
15                   f.flush()
16       return local_filename
17
18   #http://ww0.java4.datastructures.net/handouts/
19   root_link="http://ww0.java4.datastructures.net/handouts/"
20   r=requests.get(root_link)
21   if r.status_code==200:
22       soup=BeautifulSoup(r.text)
23       # print soup.prettify()
24       index=1
25       for link in soup.find_all('a'):
26           new_link=root_link+link.get('href')
27           if new_link.endswith(".pdf"):
28               file_path=download_file(new_link,str(index))
29               print "downloading:"+new_link+" -> "+file_path
30               index+=1
31       print "all download finished"
32   else:
33       print "errors occur."
View Code  运行以下代码便可以把所有的pdf文档下载到本地。





1 python pdf_download.py
View Code  
  
  3.优化
  30多行代码,全部搞定,真是简洁明了,果然做Python用来一些脚本任务还是不错的。利用它下载了41个文档。
最开始下载下来的文档没有序号,这样看的时候就不知道先后,于是我给文件名前面加了个序号。
其他的优化部分可以参考如下:


  • 考虑现在函数的一些异常出错没有处理,后续需要处理。
  • 函数没有完全封装,下载的文件类型支持不多,这个后续可以根据自己的需求进行扩展。
  • 下载的文件少的时候可能这样就行了,但是文件多的话,是有必要使用多个线程(适量的数量)或者线程池去下载,从而加快下载速度。
  • 有些写法可能不符合python语法规范,当然写了与没写已经是0和1的区别了。
  • 其他细节,比如pdf有可能是大写的PDF。

4.附录


  • 《Data Structures and Algorithms in Java》(Michael T. Goodrich, Roberto Tamassia)下载 http://bookzz.org/ 或者http://it-ebooks.info/
    以下两个网站都是不错的书籍下载网站,有条件还是买本正版书籍支持一下作者吧。
    一般我会先下载电子书看下,合适就买纸质版。
  • Python语法入门 http://www.codecademy.com/zh/tracks/python
  以上,便是如此了。
  本文来自RxRead’s Blog,欢迎转载,转载请注明。
欢迎一起交流探讨。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59870-1-1.html 上篇帖子: 话说我和python的一两事 下篇帖子: Python基础(9)--正则表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表