抓取百度博客文章的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、如果要下载的多,务必要学会使用多线程。
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 = '">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 | ' % (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) |
阅读(1432) | 评论(1) | 转发(0) |