Chinaunix首页 | 论坛 | 博客
  • 博客访问: 205246
  • 博文数量: 48
  • 博客积分: 1935
  • 博客等级: 上尉
  • 技术积分: 491
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 00:59
文章分类

全部博文(48)

文章存档

2011年(1)

2010年(47)

我的朋友

分类: Python/Ruby

2010-09-21 00:37:21

抓取百度博客文章的Python脚本
2010-04-22 23:06
本文转载自:blog/item/38cdd3a26fb2baa7cbefd0af.html

翻出了去年的代码,这是在家里保存的比较老的了。最后的代码主要还是在公司完成的,没弄回来,所以这个代码就没有多线程了。从代码可以看出,我已经开始抛 弃sgmllib之类的东西了,也抛弃split、replace这样的低级操作,开始使用正则了,沿用到现在。

可能是百度空间发生了变化,我的正则表达式似乎已经失效了,需要看页面代码重写。再次总结一 下抓取的心得:

1、分析页面研究规律,想出一个抓取的思路。
例如百度空间,我可以按博客目录来,先枚举所有目录,然后找出在每个目录下的所有文章url,逐一下载下来。
我在代码里是另外一个思路,从http://hi.baidu.com/blog/index/0(最后的数字逐步加1)开始枚举,从每个页面中解析出博 客文章的url,直到解析出来没有文章url为止。
枚举获得博客文章的url,可以放在一个字典或者下载列表里,然后再通过多线程下载了。

一句话:获得要下载的链接,将所有的下载链接通过多线程下载。


2、尽量学会使用正则表达式。

3、如果要下载的多,务必要学会使用多线程。


'%(blogUrl,blogTitle,date)
downloadblog(username,url_hi,blogUrl)#下载博客,其实,最好用多线程+wget之类的做,省事
index+=1
time.sleep(5)

html+='Total blog:%d'%(totalblogs)
path='%s/index.html'%(username)
myfile=file(path,'w')
myfile.write(html)
myfile.close()
return

if__name__=="__main__":
url_hi=''
username='yyobin'
password=''#输入密码,主要是可以看到有权限才能看的文章
getbaidublog(url_hi,username,password)
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
import urllib2
import urllib
import httplib
import cookielib
import os
import re

import socket

#下载博客,其实,最好用多线程+wget之类的做,省事
def downloadblog(path = 'yobin',url_hi='',blogUrl = '5383d42a45378d2bd42af18b.html'):
#blog/item/5383d42a45378d2bd42af18b.html
url = url_hi + 'blog/item/' + blogUrl
print url
nFail = 0
while nFail < 5:
try:
sock = urllib.urlopen(url)
htmlSource = sock.read()
path += '/%s' % (blogUrl)
myfile = file(path,'w')#文件名是****.html
myfile.write(htmlSource)
myfile.close()
sock.close()
return
except:
nFail += 1
print 'download blog fail:%s' % (blogUrl)

def getbaidublog(url_hi='',username = 'yyobin',password = ''):
socket.setdefaulttimeout(30)
if not os.path.exists(username):
os.mkdir(username)

#login baidu
#-------------------------------------------------
cj = cookielib.CookieJar()
post_data = urllib.urlencode({'username':username,
'password':password,
'pwd':'1'})
path = ''

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('User-agent','Opera/9.23')]
urllib2.install_opener(opener)
req = urllib2.Request(path,post_data)
conn = urllib2.urlopen(req)
#-------------------------------------------------

#-------------------------------------------------
index = 0
totalblogs = 0
html = '

%s">Home


'
% (url_hi)

while 1:
url_blog = url_hi + 'blog/index/%d' % index
print url_blog
req2 = urllib2.Request(url_blog)
content = urllib2.urlopen(req2).read()

if content:
#解析一个index页,获取博客连接,时间太久远,似乎爬不下来了
matched_objs = re.findall('''\r\n\t
(.*)
'''
, content)
if len(matched_objs) == 0:
print "The end"
break
#下载每个链接,这里最好用多线程来写,这样会快很多
for matched_obj in matched_objs:
totalblogs += 1
blogUrl,blogTitle,date = matched_obj
html += '
%s" target="_blank">%s %s
阅读(945) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~