Python抓取单个⽹页中所有的PDF⽂档
,此处更新可能不是很及时。
1.背景
最近发现算法以及数据结构落下了不少(其实还是⼤学没怎么好好学,囧rz),考虑到最近的项⽬结构越来越复杂了,⽤它来练练思路,就打算复习下数据结构与算法。结合最近在学英语,然后⼲脆就⽤英⽂喽。然后选定⼀本参考书籍《Data Structures and Algorithms in Java》。
刚开始看还是蛮吃⼒的,慢慢来。由于之前有翻录书籍附录的习惯,于是就去书籍附带的官⽹看了下,发现⾥⾯附带的PDF⽂档居然不错,图⽂并茂,作为理解是个不错的材料,果断要下载啊。但是,,结果发现,好多个,这⼀个⼀个另存为真是要命,想想还是⽤什么办法下载下来吧。
2.实现
考虑⽬前学过的了解的所有语⾔,可以⽤来实现的,排列⼀下程度:
1. Java/Android 熟悉
2. C# 熟悉
3. Python 了解语法
4. Javascript 了解⼀些
5. C/C++ 了解语法
为了实现这个,当然是最简单最快最好了。考虑到⼤学⼀直⽤C#,要不⽤它?但发现OSX平台只能⽤Mono了,还得重新熟悉。Java实现也不快,从需要的时间考虑。Javascript不熟,貌似可以⽤node.js去写(atom就是⽤的它)。不熟。C/C++好多年没⽤过了,⽽且,实现起来代码⼀⼤堆,特别⿇烦。再考虑之前⼀段时间正好在Codecademy学过语法,就拿它来练⼿吧。
OK,确定了⽤Python。后续就是怎么去请求⽹络了,解析⽹页html标签,提取下载链接,下载⽂件了。虽然不懂这些在Python⾥⾯是怎么实现的,但是流程是确定的,按照流程去⽹站现成的,此处不研究原理,实现功能即可。
接下来就是各种搜索引擎搜索东西了,Google可,百度亦可(不同引擎侧重不⼀样)。不要忘了⽬的是什么,搜索相关的资料。
好了,搜索之后,确定请求⽹络下载⽹页⽤requests,解析html⽤BeautifulSoup,提取下载链接BeautifulSoup,下载⽂档(stackoverflow 中到了⼀段下载⽂件的代码)。
100个python练手项目然后就是把她们⼀起组合了。组合之后的代码如下:
1#file-name: pdf_download.py
2__author__ = 'rxread'
3import requests
4from bs4 import BeautifulSoup
5
6
7def download_file(url, index):
8 local_filename = index+"-"+url.split('/')[-1]
9# NOTE the stream=True parameter
10 r = (url, stream=True)
11 with open(local_filename, 'wb') as f:
12for chunk in r.iter_content(chunk_size=1024):
13if chunk: # filter out keep-alive new chunks
14 f.write(chunk)
15 f.flush()
16return local_filename
17
18#ww0.java4.datastructures/handouts/
19 root_link="ww0.java4.datastructures/handouts/"
20 (root_link)
21if r.status_code==200:
22 soup=)
23# print soup.prettify()
24 index=1
25for link in soup.find_all('a'):
26 new_link=root_('href')
27if dswith(".pdf"):
28 file_path=download_file(new_link,str(index))
29print"downloading:"+new_link+" -> "+file_path
30 index+=1
31print"all download finished"
32else:
33print"errors occur."
View Code
运⾏以下代码便可以把所有的pdf⽂档下载到本地。
1 python pdf_download.py
View Code
3.优化
30多⾏代码,全部搞定,真是简洁明了,果然做Python⽤来⼀些脚本任务还是不错的。利⽤它下载了41个⽂档。
最开始下载下来的⽂档没有序号,这样看的时候就不知道先后,于是我给⽂件名前⾯加了个序号。
其他的优化部分可以参考如下:
1. 考虑现在函数的⼀些异常出错没有处理,后续需要处理。
2. 函数没有完全封装,下载的⽂件类型⽀持不多,这个后续可以根据⾃⼰的需求进⾏扩展。
3. 下载的⽂件少的时候可能这样就⾏了,但是⽂件多的话,是有必要使⽤多个线程(适量的数量)或者线程池去下载,从⽽加快下载速
度。
4. 有些写法可能不符合python语法规范,当然写了与没写已经是0和1的区别了。
5. 其他细节,⽐如pdf有可能是⼤写的PDF。
4.附录
1. 《Data Structures and Algorithms in Java》(Michael T. Goodrich, Roberto Tamassia)下载或者
以下两个⽹站都是不错的书籍下载⽹站,有条件还是买本正版书籍⽀持⼀下作者吧。
⼀般我会先下载电⼦书看下,合适就买纸质版。
2. Python语法⼊门
以上,便是如此了。
本⽂来⾃,欢迎转载,转载请注明。
欢迎⼀起交流探讨。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论