抓取网页生成电子书(后续就是怎么去请求网络了,解析网页html标签(组图))
优采云 发布时间: 2022-03-17 19:26抓取网页生成电子书(后续就是怎么去请求网络了,解析网页html标签(组图))
Github 博文地址,这里的更新可能不是很及时。1.背景
最近发现算法和数据结构都落后了很多(其实我大学也没学好,囧rz)。考虑到最近项目结构越来越复杂,我用它来实践我的想法,我打算复习一下数据结构和算法。. 结合最近学习的英语,然后干脆自己用英语。然后选择参考书《Java 中的数据结构和算法》。
一开始看很累,所以慢慢来。因为之前有撕书本附录的习惯,所以去附书的官网,发现附上的PDF文档其实还不错,有图有文。很好理解的资料,果断下载下来。不过尼玛,原来是有很多,一个一个存为一个,实在是太可怕了。想想怎么下载。
2.实现
考虑一下到目前为止你已经学过的所有可以用来实现的语言,并按程度对它们进行排名:
Java/Android 熟悉 C# 熟悉 Python 了解语法 Javascript 了解一些 C/C++ 了解语法
为了实现这一点,当然是最简单、最快的。考虑到大学一直在使用C#,我应该使用它吗?但是我发现OSX平台只能使用Mono,我得重新熟悉一遍。考虑到所需的时间,Java 实现也不快。对Javascript不熟悉,貌似可以用node.js来写(atom用)。陌生。C/C++已经很多年没用了,实现一大堆代码很麻烦。考虑到前段时间刚好在 Codecademy 学过语法,就用它来练习吧。
OK,下定决心用Python。后续是如何请求网络,解析网页的html标签,提取下载链接,下载文件。虽然我不知道这些是如何在 Python 中实现的,但过程是确定的。按照流程去网站找到现成的。这里不研究原理,只实现功能。
接下来是各种搜索引擎搜索的东西,谷歌可以,百度也可以(不同的引擎侧重不同)。不要忘记目的是什么,搜索相关资料。
好了,搜索后,确保使用requests从网络下载网页,使用BeautifulSoup解析html,提取下载链接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。4.附录“Java 中的数据结构和算法”(Michael T. Goodrich, Roberto Tamassia)下载或
下面两本网站都是好书下载网站,可以的话买正版书支持作者。
通常,我会先下载电子书阅读,然后在适合我的时候购买纸质版。Python 语法入门
以上,就是这样。
本文来自RxRead的博客,欢迎转载,转载请注明。
欢迎大家一起交流讨论。