简书下载器——使用BeautifulSoup4解析网页

虽然名字是下载器,不过实际上就是用python写的一个网络爬虫,通过某种规则将网页爬完,然后进行解析,获得自己想要获得信息。

而简书上的文章的集合方式大概有3种:

  • 文集(notebook),url为http://www.jianshu.com/notebooks/文集id/latest
  • 专题(collection),url为http://www.jianshu.com/collection/专题id
  • 用户(users),url为http://www.jianshu.com/users/用户id/latest_articles

下载器主要也就是批量下载这三种集合中的文章。

下面用一篇文章来解释下大概的工作原理。

这篇文章的url是http://www.jianshu.com/p/8862a4250944,可以看出来并没有像某些网页一样,带有.html/.php/.asp之类的后缀,是因为服务器有某些机制可以知道在访问这种没有后缀的url的时候,究竟是想访问哪些文件。

以chrome为例,如果按下F12打开Developer Tools,然后再刷新上面那篇文章,那么可以在Network下看到http://www.jianshu.com/p/8862a4250944.html这个文件的GET请求。如果将这个html文件下载下来,看代码的话,会发现我们想要的文章的内容都在这个html文件中有所体现。

就像wikipedia中说的一样,html只是一种组织信息的一种方法,我们所需要的文章中的信息(包括图片、引用等等)都在html文件中有所体现。我们所需要做的,就是通过html tag的类型,将信息分门别类,并下载到本地。最终再通过某种方式,按其性质制作回pdf文件当中去。

所以工作流程大概就是:获得html文件内容,解析html文件,重新排列内容,并制作成pdf文件。

获得html文件的内容可以使用python内置模块urllib/urllib2,我使用了urllib2(其实对于这么小的问题两个用起来差不多)。

import urllib2
html = urllib2.urlopen("http://www.jianshu.com/p/8862a4250944").read()
print html

这面那段代码可以将那片文章的html文件打开,并读出内容。如果便于理解的话,类似于open()和readlines(),只不过readlines()会返回一个list,这个会返回一个str。看输出的话就会发现str对象html的__str__()方法会返回html文件的内容,第一步完成。

解析html文件使用了BeautifulSoup4,安装方法在这片短文中已经简要介绍了。这个工具的功能就像一个筛子,通过html tag的不同,筛出使用者想要的内容。

from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen("http://www.jianshu.com/p/8862a4250944").read()
soup = BeautifulSoup(html)
print soup.title

运行上面一段代码,就会发现输出内容为html文件的title标签的内容:

<title>简书干货内容推荐 - 简书</title>

所谓的筛子的功能,大概就是这样,所需要做的就是先预先找好要筛出来的tag的范围,然后用bs4筛出来。通过观察html的结构,可以看出文章的内容集中在<div class="show-content"></div>中,所以我们所需要做的也就只是找到class是show-content的标签,然后将其从html里面提取出来而已。这样第二步也就完成了。

之后也可以再一次通过标签的内容(比如<strong>、<a>、<blockquote>)再次筛选内容。即完成第三步。不过由于目前制作pdf的方法还在学习当中,输出的文件格式还是txt,也就没有必要进行第三步第四步了。所以现在是通过正则表达式直接删除了所有的html标签,丢掉了格式信息。在学习完了pdf制作方法后应该会再次进行第三步和第四步。

写了个批量下载简书文章的工具

前言:这个脚本目前只能用来下载文本,也就是说下载下来的都是txt文件。以后可能会写输出pdf文件的脚本,以后的事以后再说啦┐(´_`)┌

前几天zhihu上有人问怎么批量下简书上的文章到kindle上看,恰好上个学期用了beautifulsoup,趁着手热,写了个简书的批量下载工具。以下是简单的使用方法,linux平台下使用很简单,就不细说了,主要记录下windows的使用过程。

1.首先从这里下载python2,安装就是各种下一步,没什么好说的。

2.从这里右键另存为下载get-pip.py,安装方法就按照网页上的安装。

get-pip

比如下载到了桌面上,就先进入桌面的路径,然后python get-pip.py即可。

3.安装BeautifulSoup,这东西大概理解可以理解为一个筛子,把网页中需要的东西筛选出来。安装方法是在cmd中运行安装命令:

pip install beautifulsoup4

bs4

至此脚本的运行环境已经安装完毕了。

4.从这里下载脚本,下载完解压出来。比如解压到了一个名叫jianshuDownloader-master的文件夹下。在jianshuDownloader-master中新建两个空文件——userlist.txt和notebooklist.txt。

userlist.txt中存放批量下载的用户名。比如我们想批量下载该用户的文章,url为http://www.jianshu.com/users/5104d005424d/latest_articles,我们需要的就是users/和/latest_articles中间的那串字符。简单来说可以把它看成用户的『身份证号』,能唯一识别出是哪个用户。

userlist.txt中可以存放多个用户的『身份证号』,比如我们想下载5104d005424d、7041c064cbd2、2659558557cc三位用户的所有文章,就把他们的『身份证号』每行存一个就行了。

userlist

userlist.txt中存放用户的『身份证号』

 

同理,notebooklist.txt中用来存放文集的编号。比如我们想下载这个这个这个三个文集中的所有文章。就把这三个文集的编号存到notebooklist.txt中,存的方法和userlist.txt的一样,也是一行一个。

notebook

notebooklist.txt里面存文集的编号

 

5.最后一步就是双击main.py,按照提示选择是按用户下载还是按文集下载了。

输入1按用户下载,输入2按文集下载。

由于现在是用正则直接把html里面的标签去掉,所以比较慢,不过既然是为了省鼠标,运行起来别管就好了...以后可能会抛弃这种做法,不过以后的事以后再说啦┐(´_`)┌

另外我也不知道为啥linux下和windows下速度差那么多...

还有windows的cmd里面一涉及到中文就烦得不行,直接用英文了...

下载完成之后会自动退出,然后下载好的txt就放在jianshuDownloader-master\data文件夹下了,在然后拷进kindle里看就好了。

IMG_20150212_052232

随便拷进去一篇文章,大概效果就是这样了

 

后记:这玩意儿纯属一个代码爱好者的练手作,请各位老爷要求不要太高。如果有问题我尽量修改