标签:
从大神这儿静觅 ? Python爬虫实战二之爬取百度贴吧帖子讲的很不错,按照步骤一步一步的做效果很明显。第一次真正做出一个小爬虫程序,所以在csdn写出来也是对自己的一种鞭策一种鼓励,不喜勿喷,还请大神不吝赐教。
因为大神博文讲的很详细(真心详细),所以步骤我就不一一细说了
先把自己的代码贴出来(大部分一样):
#!/usr/bin/env python # coding=utf-8 import urllib2 import urllib import re class Tool(object): removeImg = re.compile('img.*?| {7}') removeAddr = re.compile('<a.8?>|</a>') replaceLine = re.compile('<tr>|<div>|</div>|</p>') replaceTd = re.compile('<td>') replacePara = re.compile('<p.*?>') replaceBr = re.compile('<br>|<br><br>') removeExtraTag = re.compile('<.*?>') def replace(self, x): x = re.sub(self.removeImg,'',x) x = re.sub(self.removeAddr, '', x) x = re.sub(self.replaceLine, '\n', x) x = re.sub(self.replaceTd, '\t', x) x = re.sub(self.replacePara, '\n', x) x = re.sub(self.replaceBr, '\n', x) x = re.sub(self.removeExtraTag, '', x) return x.strip() class Bdtb(object): def __init__(self, baseurl, seeLZ): self.baseurl = baseurl self.seeLZ = '?see_lz='+str(seeLZ) self.tool = Tool() self.defaulttitle = u'百度贴吧' self.four = 1 self.file = None def getPage(self, pageNum): try: url = self.baseurl + self.seeLZ+'&pn='+str(pageNum) request = urllib2.Request(url) response = urllib2.urlopen(request) #print response.read() return response.read().decode('utf-8') except urllib2.URLError, e: if hasattr(e, 'reason'): print u'连接百度贴吧失败, 原因', e.reason return None def gettitle(self): page = self.getPage(1) pattern = re.compile(r'.*?<head>.*?<title>(.*?)</title>', re.S) result = re.search(pattern, page) # print 'asa\n' if result: return result.group(1).strip() else: return None def getPageNum(self): page = self.getPage(1) pattern = re.compile(r'.*?<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>', re.S) result = re.search(pattern, page) if result: return result.group(1).strip() else: return None def getContent(self, page): pattern = re.compile(r'<div id="post_content_.*?>(.*?)</div>', re.S) items = re.findall(pattern, page) contents=[] for item in items: content = '\n'+self.tool.replace(item)+'\n' #print '*'*30 + str(self.four) + '楼'+'*'*30 contents.append( content.encode('utf-8')) return contents def fileTitle(self): title = self.gettitle() if title: self.file = open(title+'.txt', 'w+') else: self.file = open(self.defaulttitle+'.txt', 'w+') def start(self): self.fileTitle() pages = int(self.getPageNum()) print '共有'+str(pages)+'页' for i in range(pages): print '正在写入第',i+1,'页' items = self.getContent(self.getPage(i)) for item in items: try: fou = '\n'+'-'*30+str(self.four)+'楼'+'-'*30+'\n' self.file.write(fou) self.file.write(item) self.four = self.four+1 except IOError, e: if hasattr(e, 'reason'): print '写入出错, 原因', e.reason break print '完成\n' self.file.close() # print 'asa\n' #for i in items: # print i #print self.tool.replace(items[1]) baseUrl = raw_input('请输入需要看的贴:')#'http://tieba.baidu.com/p/3842558811' choice = raw_input('是否只看楼主 (y|n)') if not choice in ('N', 'n'): batb = Bdtb(baseUrl, 1) else: batb = Bdtb(baseUrl, 0) #print batb.gettitle() batb.start()
总体对爬虫的感觉就是,确定url,-》获取url页面-》从页面中找出要提取的数据-》确定处理页面内容正则表达式-》初步提取所需数据-》额外的交互与修饰
第一 获取页面: 对于获取页面来说,不难,而且也有一定的模式
request = urllib2.Request(url) #这儿就是返回一个Request类 response = urllib2.urlopen(request) #这儿就是得到了要获取的页面response #print response.read()#如果要打印输出的时候,要用内置的read函数读取 return response.read().decode('utf-8')
第二 从页面中提取所需要的数据: 这个是爬取的核心,个人觉的是个难点。
提取数据就需要用到正则表达式,以前不清楚什么是正则表达式,不过自从看了django的部分文档和python核心编程之后,对正则表达式有了一些了解。所谓的正则表达式就是对文本处理的一种方式,而且非常的强大与神奇,通过正则表达式,我们可以快速的对文本进行处理,从而达到目的。网络上将正则表达式的也有很多,我就不一一介绍了。
在这个小程序中我学会的是如何对网页中的数据如何提取。因为我们爬取的页面一般都是html,各种tag充斥其中。但是繁多的tag中有一定的规律。比如说:打开http://www.qiushibaike.com/hot/page
查看源码(我没有举百度贴吧的例子,举的是糗事百科的一个例子,因为糗事的例子特别明显~_~),我们就可以发现,所有段子都是以下面的格式出现的
<div class="content"> 今天去拜佛了,八大处的寿星石,见着全家得长寿! <!--1440408912--> </div>并且每一个段子都是由下面的div分节的
我们只要设置好对应处理的正则表达式模式就可以轻松提取数据了。
所以提取数据的心得就是仔细分析网页源码,设置好对应的正则表达式即可
最后就是额外的交互,自己就可以搞定了!!
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/shengweisong/article/details/47979769