贴吧的老历史想存下来,强行python爬取一波
队友太强,躺好别动,偶尔做点副业
假装会python
基本流程:
1.爬取页面,获取页面的html源码
2.分析源码 通过正则表达式 匹配到想要的内容
3.去掉不需要的
python中 re模块 提供对正则表达式的支持
1 # -*- coding:utf-8 -*- 2 import urllib2 3 import urllib 4 import re 5 class Tool: 6 #去除img标签,7位长空格 7 removeImg = re.compile('<img.*?>| {7}|') 8 #删除超链接标签 9 removeAddr = re.compile('<a.*?>|</a>') 10 #把换行的标签换为\n 11 replaceLine = re.compile('<tr>|<div>|</div>|</p>') 12 #将表格制表<td>替换为\t 13 replaceTD= re.compile('<td>') 14 #把段落开头换为\n加空两格 15 replacePara = re.compile('<p.*?>') 16 #将换行符或双换行符替换为\n 17 replaceBR = re.compile('<br><br>|<br>') 18 #将其余标签剔除 19 removeExtraTag = re.compile('<.*?>') 20 def replace(self,x): 21 x = re.sub(self.removeImg,"",x) 22 x = re.sub(self.removeAddr,"",x) 23 x = re.sub(self.replaceLine,"\n",x) 24 x = re.sub(self.replaceTD,"\t",x) 25 x = re.sub(self.replacePara,"\n ",x) 26 x = re.sub(self.replaceBR,"\n",x) 27 x = re.sub(self.removeExtraTag,"",x) 28 #strip()将前后多余内容删除 29 return x.strip() 30 class BDTB: 31 32 def __init__(self,baseUrl,seeLZ): 33 self.baseURL =baseUrl 34 self.seeLZ ='?see_lz'+str(seeLZ) 35 self.tool=Tool() 36 def getPage(self,pageNum):#抓取网页 第几页 37 try: 38 url=self.baseURL+self.seeLZ+'&pn='+str(pageNum) 39 request = urllib2.Request(url) 40 response =urllib2.urlopen(request) 41 #print response.read() 42 return response.read().decode('utf-8') 43 except urllib2.URLError,e: 44 if hasattr(e,"reason"): 45 print u"fail",e.reason 46 return None 47 def getTitle(self):#获取标题 48 page =self.getPage(1) 49 pattern = re.compile('<h3 class="core_title_txt.*?>(.*?)</h3>',re.S) 50 result =re.search(pattern,page) 51 #print result 52 if result: 53 print result.group(1) 54 return result.group(1).strip() 55 else : 56 return None 57 def getContent(self):#获取正文 58 page=self.getPage(1) 59 pattern =re.compile('<div id="post_content_.*?>(.*?)</div>',re.S) 60 items =re.findall(pattern,page) 61 for i in range(1,20):#前19个 62 print self.tool.replace(items[i]) 63 64 baseURL = 'http://tieba.baidu.com/p/5285925491'#任意一个网页的url 65 bdtb=BDTB(baseURL,1) 66 #bdtb.getTitle() 67 bdtb.getContent()