本次实战项目适合,有一定Python语法知识的小白学员。本人也是根据一些网上的资料,自己摸索编写的内容。有不明白的童鞋,欢迎提问。
目的:爬取百度小说吧中的原创小说《猎奇师》部分小说内容
链接:http://tieba.baidu.com/p/4792877734
首先,自己定义一个类,方便使用。其实类就像一个“水果篮”,这个“水果篮”里有很多的“水果”,也就是我们类里面定义的变量啊,函数啊等等,各种各样的。每一种"水果"都有自己的独特的口味,也即是各个函数实现的功能各不相同。
然后,按照这个思路,既然要爬取小说,那么肯定要有目标网页的地址,也就是上面我给的那个连接。其实就像买水果之前,我们要找到水果店。
打开目标贴吧后,会发现里面有很多的贴子,有楼主发的,还有读者评论的,很多很杂。不过,没关系。度娘给了我们一个强大的功能,只看楼主。这就是我们的切入点。点击只看楼主按钮,哈哈,此时呈现在眼前的就是楼主的主要内容啦。
相应的,此时的网页也有所改变,地址上多了一个只看楼主的标记 http://tieba.baidu.com/p/4792877734?see_lz=1
所以,我们在定义类中的初始化函数时,就要有这个标记。
接下来,我们开始在选择不同口味的水果。我们要先获取网页的源代码,就需要有一个getPage的函数。函数里需要有我们的页码,注意我们选择不同也的小说,会发现,我们的地址也是有稍稍变动的,比如:第二页连接:http://tieba.baidu.com/p/4792877734?see_lz=1&pn=2 多了&pn=2。这个我们要整合一下。
(未完>>>>>>>>>明晚继续)
下面是我的代码:
1 #-*- coding:utf-8 -*- 2 import urllib 3 import urllib2 4 import re 5 6 # 百度小说吧 原创小说《猎奇师》 7 # 连接http://tieba.baidu.com/p/4792877734?see_lz=1 8 # 第二页连接:http://tieba.baidu.com/p/4792877734?see_lz=1&pn=2 9 class LQS: 10 def __init__(self,daseUrl,seeLZ): 11 self.daseUrl = daseUrl 12 self.seeLZ ='?see_lz=' + str(seeLZ) 13 # 传入页码,获取网页源代码 14 def getPage(self,pageNum): 15 try: 16 # 拼接,地址 + 楼主参数 + 页数 17 url = self.daseUrl + self.seeLZ + '&pn=' + str(pageNum) 18 request = urllib2.Request(url) 19 response = urllib2.urlopen(request) 20 return response.read() 21 except Exception,e:# 处理异常 22 print e 23 # 获取标题 24 def getTitle(self,pageNum): 25 html = self.getPage(pageNum) 26 reg = re.compile(r'<title>【原创】恐怖故事 (.*?)_小说吧_百度贴吧</title>') 27 items = re.findall(reg,html) 28 # 将标题写入文件 29 for item in items: 30 f = open('lqshi.txt','w') # 文件名最好是英文,中文识别不了 31 f.write('标题' + ' ' + item) 32 f.close() 33 return items 34 # 获取正文 35 def getContent(self,pageNum): 36 html = self.getPage(pageNum) 37 reg = re.compile(r'class="d_post_content j_d_post_content "> (.*?)</div><br>') 38 req = re.findall(reg,html) 39 # 将标题写入文件 40 for i in req: 41 removeAddr = re.compile('<a.*?</a>') 42 i = re.sub(removeAddr,"",i)# 找到并替换 43 i = i.replace("<br>"," ") 44 f = open('lqshi.txt','a')# 此处是写入正文内容,所以用a 45 f.write( ' ' + i) 46 f.close() 47 return i 48 49 daseURL = 'http://tieba.baidu.com/p/4792877734' 50 lqShi = LQS(daseURL,1) 51 print "爬虫已启动..." 52 for i in range(4): 53 lqShi.getTitle(i) 54 lqShi.getContent(i) 55 print "正在抓取第%s页的内容" % (i+1)