Github博文地址,此处更新可能不是很及时。

1.背景

最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构与算法。结合最近在学英语,然后干脆就用英文喽。然后选定一本参考书籍《Data Structures and Algorithms in Java》。
刚开始看还是蛮吃力的,慢慢来。由于之前有翻录书籍附录的习惯,于是就去书籍附带的官网看了下,发现http://ww0.java4.datastructures.net/handouts/ 里面附带的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中找到了一段下载文件的代码)。
然后就是把她们一起组合了。组合之后的代码如下:

 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个文档。
最开始下载下来的文档没有序号,这样看的时候就不知道先后,于是我给文件名前面加了个序号。
其他的优化部分可以参考如下:

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

4.附录

  1. 《Data Structures and Algorithms in Java》(Michael T. Goodrich, Roberto Tamassia)下载 http://bookzz.org/ 或者http://it-ebooks.info/
    以下两个网站都是不错的书籍下载网站,有条件还是买本正版书籍支持一下作者吧。
    一般我会先下载电子书看下,合适就买纸质版。
  2. Python语法入门 http://www.codecademy.com/zh/tracks/python

以上,便是如此了。

本文来自RxRead’s Blog,欢迎转载,转载请注明。
欢迎一起交流探讨。

转载于:https://www.cnblogs.com/waylife/p/python_webpage_crawling.html

Python抓取单个网页中所有的PDF文档相关推荐

  1. 批量下载网页中所有的PDF文档

    某日要下载网页中所有的PDF文档,大约400个.作为计算机专业的学生,显然不能手工去下载啊!!!于是在网上找到了相关的批量下载文档脚本,众里寻他千百度,终于在一篇博客http://blog.csdn. ...

  2. 抓取蜂鸟网游记并且制作成PDF文档

    周六,周日闲暇无事,但又想起了在外面野营时,不能上网时的尴尬. 我喜欢蜂鸟网的游记,但又没有网卡在野外冲浪,也是一种无奈!如果能把蜂鸟网站上的精品游记能够随时随地翻阅是一件多么牛B的事情呀. 于是说干 ...

  3. 多端手机网页中直接打开PDF文档

    1. 需求 接到一个需求,客户想在手机端的网页里直接能查看到 pdf 文档,一开始我的思路是加一个<a>标签让他跳转链接到 pdf 文档的地址,经过测试发现在 IOS 系统中,网页跳转之后 ...

  4. 利用pdf.js在手机端网页中直接打开PDF文档

    在项目中用到了需要在手机端直接打开PDF文档的情况,借鉴网友们的意见使用了pdf.js,测试了一下简单好用,下面是使用例子 <!DOCTYPE html> <html> < ...

  5. Python 抓取动态网页表格信息

    五一假期,研究了下Python抓取动态网页信息的相关操作,结合封面的参考书.网上教程编写出可以满足需求的代码.由于初涉python,过程中曲折很多,为了避免以后遇到问题找不到相关的信息创建本文. 准备 ...

  6. python 抓取的网页默认是bytes的,要转码

    python 抓取的网页默认是bytes的,要转码. 查看网页源码可以看到,我本次抓取的网页的编码方式是utf-8的. req = urllib.request.Request(url=myurl,h ...

  7. python mysql 遍历_Python自动化办公系列六(pdf文档处理)

    PDF 表示 Portable Document Format,使用 .pdf 作为文件扩展名.虽然 PDF 支持许多功能,但现在我们专注于最常做的两件事:从 PDF 读取文本内容和从已有的文档生成新 ...

  8. 如何在ASP.NET Core 中快速构建PDF文档

    比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...

  9. mysql适合储存高清电影的数据类型_下列数据类型中适合存储PDF文档的是( ) (5.0分)_学小易找答案...

    [单选题]咯血的特点不正确的是 [单选题]下面关于SHOW TABLES LIKE 't%'描述错误的是( ) (5.0分) [单选题]下列删除itcast数据库的sql语句中,正确的是 (5.0分) ...

最新文章

  1. VS 2010中对WPF4有哪些多点触摸支持?
  2. 用Matplotlib轻松复刻分析图,看看哪个城市买房最自由
  3. Kubernetes的共享GPU集群调度
  4. [ 浙江大学 程序设计专题 ] 四个专题代码 报告 PPT共享
  5. 标记一下被自己遗忘的java基础
  6. Excel 常见公式
  7. Hadoop三大核心组件及需求催生大数据技术的背景
  8. python工厂模式 django_python设计模式-工厂方法模式
  9. 会话创建过程-创建Executor
  10. mui.init方法配置
  11. 一日一技:安装Python第三方库的几种姿势
  12. #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE *)0)-MEMBER)
  13. 20200806:Java拓扑排序实现力扣210课程表Ⅱ
  14. ftp同步软件android,[Android ]FTP/SCP/FTPS客户端AndFTP v4.5专业版 开心版
  15. 谭浩强 C语言程序设计第五版 第六章 习题 答案
  16. python如何下载包_怎么在python中下载包
  17. HMM和Viterbi算法
  18. python练习题5:货币转换 I
  19. 【WLAN】【测试】WLAN相关测试软件一览
  20. 【组合数学】递推方程 ( 递推方程解与特征根之间的关系定理 | 递推方程解的线性性质定理 | 递推方程解的形式 )

热门文章

  1. Android Http客户端如何选择?
  2. OUTLOOK 的PST文件和OST文件的区别
  3. pda连接电脑无法存取文件_手机无法连接电脑怎办
  4. linux 进程0 写时复制,linux 写时复制 COW 过程梳理
  5. Linux安装MySQL8.0
  6. 4 初学入门_2020年最新版,如何挑选入门级,进阶级和专业级网球拍(12月更新)...
  7. 河北省计算机网络技术专接本考什么,河北计算机专接本考什么
  8. edge css兼容,CSS输入错误样式在Edge浏览器中无法正确显示
  9. 分子动力学aimd_研究人员在沸石分子筛活性调控研究方面取得新进展
  10. Fiddler 详尽教程与抓取移动端数据包