简介
朋友问我能不能做一个下载他在豆瓣读书上的短评的工具,于是就做了这个“豆瓣用户读书短评下载工具”。
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作流程为:
用到的库主要有:
抓取网页所需要抓取的信息在这样的网页中: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设置代理:
不过,如果只设置了代理就访问豆瓣的用户读书评论列表,豆瓣会返回403 Forbidden。 解决办法就是添加请求标头(Request Headers)来模拟浏览器访问。 标头信息可以在浏览器中打开网页时按F12进入控制台,在Network选项卡中找到 请求标头(Request Headers) 。 比如,这是我在Edge浏览器中访问豆瓣的请求标头。
然后在访问网页的时候加上header信息:
这样就可以正确抓取到网页内容了。 解析网页在我之前一篇文章《从豆瓣电影批量获取看过某部电影的用户列表》讲过了使用 BeautifulSoup 解析网页了,其实只要看看官方文档就很容易上手了。 这里就不再赘述了。 Markdown转Html
源代码
|