Python抓取单个网页中所有的PDF文档

发布时间:2017-09-09 11:07:48
Python抓取单个网页中所有的PDF文档 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中找到了一段下载文件的代码)。

然后就是把她们一起组合了。组合之后的代码如下:

复制代码

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."

复制代码

运行以下代码便可以把所有的pdf文档下载到本地。

1 python pdf_download.py

3.优化

30多行代码,全部搞定,真是简洁明了,果然做Python用来一些脚本任务还是不错的。利用它下载了41个文档。

最开始下载下来的文档没有序号,这样看的时候就不知道先后,于是我给文件名前面加了个序号。

其他的优化部分可以参考如下:

考虑现在函数的一些异常出错没有处理,后续需要处理。

函数没有完全封装,下载的文件类型支持不多,这个后续可以根据自己的需求进行扩展。

下载的文件少的时候可能这样就行了,但是文件多的话,是有必要使用多个线程(适量的数量)或者线程池去下载,从而加快下载速度。

有些写法可能不符合python语法规范,站群,当然写了与没写已经是0和1的区别了。

其他细节,比如pdf有可能是大写的PDF。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网络营销 https://www.feimao666.com