用 Python 做了一個豆瓣使用者讀書短評下載工具

發表於2015-10-11

簡介

朋友問我能不能做一個下載他在豆瓣讀書上的短評的工具,於是就做了這個“豆瓣使用者讀書短評下載工具”。

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>標籤的,因此需要自己加上這些標籤後再儲存。

原始碼

相關文章