逛抗压吧的时候,看到了一篇有趣的的帖子,《猪狗恩仇录》明凯与简自豪的江湖往事!,于是本着没事爬一爬的原则(吃饱了那啥),就试着爬取一下,并存储到本地
爬取目标:
+ 对抗压吧进行爬取(理论上可以爬取任意贴)
+ 指定是否只抓取楼主的发帖内容
+ 将抓取到的内容进行分析并保存成文件
0、爬取效果
明明在pycharm中打开txt看得那么顺眼,在本地打开就GG了,所以把他转成了pdf格式
1、分析url
这次爬取的吧也是多页的,所以先来看一下url, 跳转多几页,是否只看楼主,就会发现?see_lz=表示是否只看楼主(1表示是,0表示不是),pn表示当前访问的页数,现开始分析页面的代码,爬取需要的贴子的标题和内容,还有贴吧的页数。
分析html代码可得爬取需要的正则为:
#page为整个页面的html代码
#贴子标题
pattern1 = re.compile(r'<h3 class="core_title_txt pull-left text-overflow.*?"(.*?)</h3>',re.S)
title = re.search(pattern,page)
pattern2 = re.compile(r'<li class="l_reply_num" .*?</span>.*?<span .*?>(.*?)</span>',re.S)
#贴子总页数
pageNum = re.search(pattern,page)
#贴子内容
pattern = re.compile(r'<div id="post_content_.*?>(.*?)</div>')
contents = re.findall(pattern,page)
2、优化爬取内容
爬取后发现有一些额外的标签输出,所以需要去掉标签(正则的方法)
def improve(self,content):
removeTag = re.compile(r'<.*?>')
replaceBr = re.compile(r'<br><br><br>|<br><br>|<br>') #将换行标签转换成\n
replaceP = re.compile(r'<p.*?>') #将段落标签装换成\n加两个空格
content = re.sub(replaceBr,"\n",content)
content = re.sub(replaceP,"\n ",content)
content = re.sub(removeTag,"",content)
return content.strip()
3、把爬取内容存到本地
这其实也就是文件的读入(以二进制写入的方式打开),要注意一下编码即可
#str.encode() = bytes
#bytes.decode() = str
file = open('《猪狗恩仇录》.txt','wb')
file.write((content+'\n').encode())
file.close()
4、优化代码
#coding:utf-8
from urllib.request import Request
from urllib.request import urlopen
from urllib.error import URLError
import re
"""
爬取百度贴吧之《猪狗恩仇录》明凯与简自豪的江湖往事!
1.对抗压吧进行爬取(理论上可以爬取任意贴)
2.指定是否只抓取楼主的发帖内容
3.将抓取到的内容进行分析并保存成文件
"""
file = open('《猪狗恩仇录》.txt','wb')
#百度贴吧类
class BDTB:
#构造函数
def __init__(self,baseUrl,see_lz):
self.baseUrl = baseUrl
self.see_lz = '?see_lz=' + str(see_lz)
self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' \
' AppleWebKit/537.36 (KHTML, like Gecko) ' \
'Chrome/54.0.2840.99 Safari/537.36'
self.headers = {'User-Agent':self.user_agent}
#传入页面,获取页面代码
def getPage(self,pageNum):
try:
url = self.baseUrl + self.see_lz +'&pn='+ str(pageNum)
#print(url)
request = Request(url,headers=self.headers)
response = urlopen(request)
#print(request)
return response.read().decode('utf-8')
except URLError as e:
if hasattr(e,'reason'):
print('连接百度贴吧失败,失败原因:%s' % e.reason)
return None
#获取帖子标题
def getTitle(self):
page = self.getPage(1)
pattern = re.compile(r'<h3 class="core_title_txt pull-left text-overflow.*?"(.*?)</h3>',re.S)
result = re.search(pattern,page)
if result:
#print(result.group(1))
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:
#print(result.group(1))
return result.group(1).strip()
else:
return None
#优化爬取内容
def improve(self,content):
removeTag = re.compile(r'<.*?>')
replaceBr = re.compile(r'<br><br><br>|<br><br>|<br>')
replaceP = re.compile(r'<p.*?>')
content = re.sub(replaceBr,"\n",content)
content = re.sub(replaceP,"\n ",content)
content = re.sub(removeTag,"",content)
return content.strip()
#提取正文内容
def getContent(self,index):
page = self.getPage(index)
pattern = re.compile(r'<div id="post_content_.*?>(.*?)</div>')
contents = re.findall(pattern,page)
for content in contents:
content = self.improve(content)
print(content)
file.write((content+'\n').encode())
#爬取开始
def start(self):
print("现爬取百度贴吧之《猪狗恩仇录》明凯与简自豪的江湖往事!")
print("\n《猪狗恩仇录》\n")
#print("按回车开始爬取。")
#op = input()
pageNum = self.getPageNum()
for i in range(int(pageNum)):
print('第%s页' % str(i + 1))
self.getContent(i + 1)
#op = input()
base_url = 'https://tieba.baidu.com/p/4735912130'
bdtb = BDTB(base_url,1)
bdtb.start()
file.close()