Python抓取单个网页中所有的PDF文档
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中找到了一段下载文件的代码)。
然后就是把她们一起组合了。组合之后的代码如下:
#file-name: pdf_download.py
__author__ = 'rxread'
import requests
from bs4 import BeautifulSoup def download_file(url, index):
local_filename = index+"-"+url.split('/')[-1]
# NOTE the stream=True parameter
r = requests.get(url, stream=True)
with open(local_filename, 'wb') as f:
for chunk in r.iter_content(chunk_size=1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.flush()
return local_filename #http://ww0.java4.datastructures.net/handouts/
root_link="http://ww0.java4.datastructures.net/handouts/"
r=requests.get(root_link)
if r.status_code==200:
soup=BeautifulSoup(r.text)
# print soup.prettify()
index=1
for link in soup.find_all('a'):
new_link=root_link+link.get('href')
if new_link.endswith(".pdf"):
file_path=download_file(new_link,str(index))
print "downloading:"+new_link+" -> "+file_path
index+=1
print "all download finished"
else:
print "errors occur."
运行以下代码便可以把所有的pdf文档下载到本地。
python pdf_download.py
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,欢迎转载,转载请注明。
欢迎一起交流探讨。
Python抓取单个网页中所有的PDF文档的更多相关文章
- Python 爬取单个网页所需要加载的地址和CSS、JS文件地址
Python 爬取单个网页所需要加载的URL地址和CSS.JS文件地址 通过学习Python爬虫,知道根据正式表达式匹配查找到所需要的内容(标题.图片.文章等等).而我从测试的角度去使用Python爬 ...
- 如何在ASP.NET Core 中快速构建PDF文档
比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...
- python抓取中文网页乱码通用解决方法
注:转载自http://www.cnpythoner.com/ 我们经常通过python做采集网页数据的时候,会碰到一些乱码问题,今天给大家分享一个解决网页乱码,尤其是中文网页的通用方法. 首页我们需 ...
- 如何使用JAVA语言抓取某个网页中的邮箱地址
现实生活中咱们常常在浏览网页时看到自己需要的信息,但由于信息过于庞大而又不能逐个保存下来. 接下来,咱们就以获取邮箱地址为例,使用java语言抓取网页中的邮箱地址 实现思路如下: 1.使用Java.n ...
- 在网页中在线浏览ppt文档
方法一: 把ppt文件的扩展名直接修改为pps,嵌入到网页中 缺点:这种方式浏览器会提示是打开,还是下载,选择打开的话会直接在浏览器中打开,并且客户端一定要安装Office PowerPoint才能打 ...
- 第一个python抓取单网页的例子
#!/usr/bin/env python # coding=utf-8 import requests from bs4 import BeautifulSoup import pymysql im ...
- 【转】详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)
转自:http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_ ...
- 将w3cplus网站中的文章页面提取并导出为pdf文档
最近在看一些关于CSS3方面的知识,主要是平时看到网页中有很多用CSS3实现的很炫的效果,所以就打算系统的学习一下.在网上找到很多的文章,但都没有一个好的整理性,比较凌乱.昨天看到w3cplus网站中 ...
- ABBYY PDF Transformer+从文件选项中创建PDF文档的教程
可使用OCR文字识别软件ABBYY PDF Transformer+从Microsoft Word.Microsoft Excel.Microsoft PowerPoint.HTML.RTF.Micr ...
随机推荐
- 【C++基础】 指针&字符串&数组
先贴代码,总结以后再写,和5中内存分配方式密切相关 PS: str 返回整个字符串,str[0],*str返回首字符h char *strA(){ char str[]="hello!&qu ...
- change Username for SVN(Subclipse) in Eclipse
Subclipse does not own the information about users and passwords (credentials), so there is no way f ...
- Java 理论和实践: 了解泛型
转载自 : http://www.ibm.com/developerworks/cn/java/j-jtp01255.html 表面上看起来,无论语法还是应用的环境(比如容器类),泛型类型(或者泛型) ...
- Codeforces400D Dima and Bacteria
题意:给你一个无向有权的图,图上的点被分成了几类,对于同类的点你需要判断它们之间相互的最短距离是不是0.满足这个条件之后要输出的是类与类之间的最短距离的矩阵.点给到10^5这么多,判断同类的点显然不能 ...
- NSString+URLEncoding.h --使用Obj-C对数据等进行URLEncoding编码
在Objective-c进行网络编程时,经常需要把数据转换成URLEncoding编码,如对+号编码后,变成%2b.这里我们给出一种实现. //NSString+URLEncoding.h #impo ...
- Oracle的学习三:java连接Oracle、事务、内置函数、日期函数、转换函数、系统函数
1.java程序操作Oracle java连接Oracle JDBC_ODBC桥连接 1.加载驱动: Class.forName("sun.jdbc.odbc.JdbcodbcDriver& ...
- [三分]HDOJ 5531 Rebuild
题意:给n个点,以这n个点为圆心画圆,使得所有的圆与其相邻的圆相切. 求n个圆最小的面积和. 分析:很容易想到确定了其中一个圆的半径之后,其他的圆的半径也能随之确定了. 画一画三个点的和四个点的,会发 ...
- cojs EX_香蕉 题解报告
这道题目是香蕉的加强版 当m=100w时矩阵会很大,而且又有多组询问,所以这道题用原来香蕉的程序会T 所以我们需要更好点的做法 我们考虑优化我们的状态 首先考虑这道题的隐藏性质,考虑不合法的情况 那么 ...
- utf-8中的汉字占用多少字节
转载:http://blog.csdn.net/chummyhe89/article/details/7777613 占2个字节的:〇 占3个字节的:基本等同于GBK,含21000多个汉字 占4个字节 ...
- 224. Basic Calculator
题目: Implement a basic calculator to evaluate a simple expression string. The expression string may c ...