从大神这儿静觅 » 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分节的
我们只要设置好对应处理的正则表达式模式就可以轻松提取数据了。
所以提取数据的心得就是仔细分析网页源码,设置好对应的正则表达式即可
最后就是额外的交互,自己就可以搞定了!!