用 Python 做了一个豆瓣用户读书短评下载工具
admin
2023-07-31 00:24:21
0

简介

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

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浏览器中访问豆瓣的请求标头。

1234567 head= {   \’Accept\’:\’text/html, application/xhtml+xml, image/jxr, */*\’,   \’Accept-Language\’: \’zh-Hans-CN, zh-Hans; q=0.5\’,   \’Connection\’:\’Keep-Alive\’,   \’Cookie\’:\’bid=lkpO8Id/Kbs; __utma=30149280.1824146216.1438612767.1440248573.1440319237.13; __utmz=30149280.1438612767.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); as=http://book.douban.com/people/133476248/; ll=108288; viewed=26274009_1051580; ap=1; ps=y; ct=y; __utmb=30149280.23.10.1440319237; __utmc=30149280; __utmt_douban=1; _pk_id.100001.3ac3=b288f385b4d73e38.1438657126.3.1440319394.1440248628.; __utma=81379588.142106303.1438657126.1440248573.1440319240.3; __utmz=81379588.1440319240.3.2.utmcsr=movie.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _pk_ses.100001.3ac3=*; __utmb=81379588.23.10.1440319240; __utmt=1; __utmc=81379588; _pk_ref.100001.3ac3=%5B%22%22%2C%22%22%2C1440319240%2C%22http%3A%2F%2Fmovie.douban.com%2F%22%5D\’,   \’Host\’:\’book.douban.com\’,   \’User-Agent\’:\’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240\’}

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

123 full_url=urllib.request.Request(url,headers=head)response=urllib.request.urlopen(full_url)html=response.read()

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

解析网页

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

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

md = markdown.markdown(contents)
html = ‘
html+=\'’+title+\'
html += “” + md + “”
md = markdown.markdown(contents)转换出来的md是不包含标签的,因此需要自己加上这些标签后再保存。

源代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115作流程为:

用户输入其豆瓣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浏览器中访问豆瓣的请求标头。

1234567 head= {   \’Accept\’:\’text/html, application/xhtml+xml, image/jxr, */*\’,   \’Accept-Language\’: \’zh-Hans-CN, zh-Hans; q=0.5\’,   \’Connection\’:\’Keep-Alive\’,   \’Cookie\’:\’bid=lkpO8Id/Kbs; __utma=30149280.1824146216.1438612767.1440248573.1440319237.13; __utmz=30149280.1438612767.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); as=http://book.douban.com/people/133476248/; ll=108288; viewed=26274009_1051580; ap=1; ps=y; ct=y; __utmb=30149280.23.10.1440319237; __utmc=30149280; __utmt_douban=1; _pk_id.100001.3ac3=b288f385b4d73e38.1438657126.3.1440319394.1440248628.; __utma=81379588.142106303.1438657126.1440248573.1440319240.3; __utmz=81379588.1440319240.3.2.utmcsr=movie.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/; _pk_ses.100001.3ac3=*; __utmb=81379588.23.10.1440319240; __utmt=1; __utmc=81379588; _pk_ref.100001.3ac3=%5B%22%22%2C%22%22%2C1440319240%2C%22http%3A%2F%2Fmovie.douban.com%2F%22%5D\’,   \’Host\’:\’book.douban.com\’,   \’User-Agent\’:\’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240\’}

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

123 full_url=urllib.request.Request(url,headers=head)response=urllib.request.urlopen(full_url)html=response.read()

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

解析网页

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

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

md = markdown.markdown(contents)
html = ‘
html+=\'’+title+\'
html += “” + md + “”
md = markdown.markdown(contents)转换出来的md是不包含标签的,因此需要自己加上这些标签后再保存。

源代码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...