贴吧的老历史想存下来,强行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()