简介
朋友问我能不能做一个下载他在豆瓣读书上的短评的工具,于是就做了这个“豆瓣用户读书短评下载工具”。
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浏览器中访问豆瓣的请求标头。
1 2 3 4 5 6 7 |
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信息:
1 2 3 |
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><meta charset=”UTF-8″>’
html+='<title>’+title+'</title>’
html += “<body>” + md + “</body></html>”
md = markdown.markdown(contents)转换出来的md是不包含<html>标签的,因此需要自己加上这些标签后再保存。
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 作流程为:
用到的库主要有:
抓取网页所需要抓取的信息在这样的网页中: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
源代码
|