昨天在豆瓣看到有人发状态问如何把豆瓣日志保存到本地,正好最近在学python,就想到用python写一段小程序,练练手。
解析HTML用的是BeautifulSoup库,看了一下文档,还算简单,但是有些奇怪的问题我一时弄不清楚为什么,所以部分功能是用了比较曲折的方法实现的……
用法:运行这段程序时,将用户名作为参数,如果你没有设置豆瓣的用户名,那就是一串数字,也就是你个人主页的网址里“people”后面那一串,例如(以当初提问的这位同学为例):
~$ python crawl.py duanzhang >> blogbackup.txt
效果如下:
有个功能缺陷是,如果日记里有图片,只能抓到那部分的HTML代码,有兴趣的同学可以继续扩充,但是估计就要想着保存为网页文件了,以便原貌呈现图文混排,当然,也可以仅仅作为备份,把图片抓下来保存在同一个目录里,大家根据自己需求修改吧。
好了,少废话,上代码:
from bs4 import BeautifulSoup
import urllib2
import re
import sys
def get_each_blog(url):
content = urllib2.urlopen(url)
soup = BeautifulSoup(content)
header = soup.find_all("div", attrs={"class": "note-header"})
title = header[0].h1.get_text()
date = header[0].span.get_text()
print(title.encode("UTF-8"))
print(date.encode("UTF-8"))
print('\n')
body = soup.find_all("div", attrs={"class": "note"})
body = str(body[1])
body = body.replace("""<div class="note" id="link-report">""", "")
body = body.replace("</div>", "")
body = body.replace("\n", "")
body = body.replace("<br/>", "\n")
print(body)
print('\n')
print('\n')
def link_list(pageurl):
content = urllib2.urlopen(pageurl)
soup = BeautifulSoup(content)
urllist = soup.find_all("div", attrs={"class": "rr"})
for i in urllist:
blog_url= ('http://www.douban.com/note/'+(i['id'].split('-'))[1])
get_each_blog(blog_url)
baseurl = "http://www.douban.com/people/{0}/notes/".format(sys.argv[1])
content = urllib2.urlopen(baseurl)
soup = BeautifulSoup(content)
link_list(baseurl)
page_list = soup.find_all("link", rel="next")
while page_list != []:
pageurl = page_list[0]['href']
link_list(pageurl)
page_list = BeautifulSoup(urllib2.urlopen(pageurl)).find_all("link", rel="next")
Java党表示用jsoup毫无压力啊,使用类似jquery select的语法来查找元素。不过频繁请求会有验证码,这点比较讨厌。
看到java心里就发怵啊。。。。