用 Python 做了一个豆瓣用户读书短评下载工具

491 查看

简介

朋友问我能不能做一个下载他在豆瓣读书上的短评的工具,于是就做了这个“豆瓣用户读书短评下载工具”。

GitHub链接:https://github.com/xiaff/dbc-downloader。

这个小工具使用Python3.4编写,其工作流程为:

用户输入其豆瓣ID;

抓取用户评论列表网页

对网页进行解析;

存储评论相关信息;

将Markdown格式文件转换为Html。

用到的库主要有:

urllib.request

BeautifulSoup4

markdown

抓取网页

所需要抓取的信息在这样的网页中:http://book.douban.com/people/ahbei/collect?

sort=time&start=0&filter=all&mode=grid&tags_sort=count,URL中包含了用户ID(people/之后)、评论序号(start=)等信息

url_1=’http://book.douban.com/people/’

url_2=’/collect?sort=time&start=’

url_3=’&filter=all&mode=grid&tags_sort=count’

url=url_1+uId+url_2+index+url_3,其中 UID 为豆瓣用户ID,index 为评论序号。评论序号从0开始编号,每页显示15条,因为每

个url中的序号依次为0、15、30……15*i。 i的最大值即为 网页页数-1,在解析第一张网页的时候可以获取页数。

在抓取网页的时候可以选择使用代理服务器,因此使用urllib.request设置代理:

proxyInfo=input(‘Please type in your HTTP Proxy: ‘)

proxySupport=urllib.request.ProxyHandler({‘http’:proxyInfo})

opener=urllib.request.build_opener(proxySupport)

urllib.request.install_opener(opener)

不过,如果只设置了代理就访问豆瓣的用户读书评论列表,豆瓣会返回403 Forbidden。

解决办法就是添加请求标头(Request Headers)来模拟浏览器访问。 标头信息可以在浏览器中打开网页时按F12进入控制台,在Network选项卡中找到 请求标头(Request Headers) 。

比如,这是我在Edge浏览器中访问豆瓣的请求标头。

然后在访问网页的时候加上header信息:

这样就可以正确抓取到网页内容了。

解析网页

在我之前一篇文章《从豆瓣电影批量获取看过某部电影的用户列表》讲过了使用 BeautifulSoup 解析网页了,其实只要看看官方文档就很容易上手了。 这里就不再赘述了。

Markdown转Html
最后一步是将以Markdown格式保存的文件转换成Html文件,这样可以让不熟悉Markdown的人在浏览器中直接查看或者另存为PDF文件。
markdown包可以做到这一点:

md = markdown.markdown(contents)
html = ‘<html><meta charset=”UTF-8″>’
html+='<title>’+title+'</title>’
html += “<body>” + md + “</body></html>”
md = markdown.markdown(contents)转换出来的md是不包含<html>标签的,因此需要自己加上这些标签后再保存。

源代码