当前位置: 首页 > news >正文

百度贴吧帖子

#! usr/bin/env python
# -*- coding: utf-8 -*-

'''
1.对百度贴吧的任意帖子进行抓取

2.指定是否只抓取楼主发帖内容

3.将抓取到的内容分析并保存到文件
'''

import urllib2
import re

class BDTB(object):
# 初始化、传入基本url,是否只看楼主
def __init__(self,url, seelz, floorTag):
self.url = url
# 是否只看楼主
self.seelz = '?see_lz=' + str(seelz)
# 全局file变量,文件写入操作对象
self.file = None
# 楼层标号,初始为1
self.floor = 1
# 默认的标题,如果没有成功获取到标题的话则会用这个标题
self.defaultTitle = u"百度贴吧"
# 是否写入楼分隔符的标记
self.floorTag = floorTag

# 传入页码,获取该页面的代码
def getHtml(self, pageNum):
try:
url = self.url + self.seelz + '&pn=' + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
#print response.read()
return response.read()
except urllib2.URLError as e:
if hasattr(e,'reason'):
print (e.reason)
return None

# 获取帖子的标题
def getTitle(self, pageIndex):
pattern = re.compile('<h3 class="core_title.*?">(.*?)</h3>', re.S)
result = re.search(pattern,pageIndex)
if result:
title = result.group(1)
return title
else:
return None

# 获取帖子的页数
def pageNum(self):
html = self.getHtml(1)
pattern = re.compile('<li class="l_reply_num".*?<span class="red">(.*?)</span>', re.S)
result = re.search(pattern, html)
if result:
return result.group(1)
else:
return None

# 传入指定页数 获取正文内容
def getContent(self, page):
pattern = re.compile('<div id="post_content_.*?>(.*?)</div>',re.S)
items = re.findall(pattern, page)
contents = []
for item in items:
content = self.replace(item)
contents.append(content)
return contents

def replace(self,x):
'''
处理页面标签
'''

# 去除img标签,7位长空格
removeImg = re.compile('<img.*?>| {7}|')
# 删除超链接标签
removeAddr = re.compile('<a.*?>|</a>')
# 把换行的标签换为\n
replaceLine = re.compile('<tr>|<div>|</div>|</p>')
# 将表格制表<td>替换为\t
replaceTD= re.compile('<td>')
# 把段落开头换为\n加空两格
replacePara = re.compile('<p.*?>')
# 将换行符或双换行符替换为\n
replaceBR = re.compile('<br><br>|<br>')
# 将其余标签剔除
removeExtraTag = re.compile('<.*?>')
x = re.sub(removeImg,"",x)
x = re.sub(removeAddr,"",x)
x = re.sub(replaceLine,"\n",x)
x = re.sub(replaceTD,"\t",x)
x = re.sub(replacePara,"\n ",x)
x = re.sub(replaceBR,"\n",x)
x = re.sub(removeExtraTag,"",x)
# strip()将前后多余内容删除
return x.strip()

def setTitleFile(self, title):
if title:
self.file = open('%s.txt', 'w+')%title
else:
self.file = file(self.defaultTitle+'.txt', 'w')

def writeData(self,contents):
for content in contents:
if self.floorTag:
floorLine = '\n楼层' + str(self.floorTag) + '-'*50 +'\n'
self.file.write(floorLine)
self.file.write(content)
self.floor += 1
self.file.close()

def start(self):
indexPage = self.getHtml(1)
pageNum = int(self.pageNum())
title = self.getTitle(indexPage)
self.setTitleFile(title)
if not pageNum:
print ('帖子已失效!')
return None
try:
print ('该帖子共有%s页'%(pageNum))
for i in range(pageNum):
print ("正在写入第" + str(i+1) + "页数据……")
page = self.getHtml(i)
contents = self.getContent(page)
self.writeData(contents)
except IOError as e:
print (e.message)
finally:
print ('写入完成')





baseUrl = 'https://tieba.baidu.com/p/5074437851'
seelz = raw_input('是否只查看楼主,输入0为否:\n')
floorTag = raw_input("是否写入楼层信息,是输入1,否输入0\n")
bdtb = BDTB(baseUrl, seelz, floorTag)
bdtb.start()

转载于:https://www.cnblogs.com/Emai76/p/6716072.html

相关文章:

  • 离散傅里叶变换蝶形运算分析
  • php基础知识(三)---常用函数--2017-04-16
  • js继承之一(借用构造函数)
  • 【转】使用SecureCRT连接ubuntu
  • 第八周总结
  • 函数初步接触
  • 2017.4.17 定制Eclipse的Content assist(代码补全),比如空格键 =键不上屏
  • Director.js路由
  • Java实现八进制正整数转化为十进制数
  • vim 设置默认显示行号
  • iOS APNs远程推送流程精简版
  • python面向对象01
  • css3边框背景写法及简写。待续
  • 逻辑分析题汇总(一)
  • python/文件操作
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 10个最佳ES6特性 ES7与ES8的特性
  • 2017年终总结、随想
  • iOS编译提示和导航提示
  • JAVA SE 6 GC调优笔记
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • java多线程
  • js ES6 求数组的交集,并集,还有差集
  • k8s 面向应用开发者的基础命令
  • Lsb图片隐写
  • Nacos系列:Nacos的Java SDK使用
  • Nodejs和JavaWeb协助开发
  • Redux系列x:源码分析
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue-cli3搭建项目
  • 从零搭建Koa2 Server
  • 多线程事务回滚
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 和 || 运算
  • 缓存与缓冲
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端之React实战:创建跨平台的项目架构
  • 区块链共识机制优缺点对比都是什么
  • 算法---两个栈实现一个队列
  • 听说你叫Java(二)–Servlet请求
  • 我有几个粽子,和一个故事
  • 以太坊客户端Geth命令参数详解
  • 用Canvas画一棵二叉树
  • 怎么将电脑中的声音录制成WAV格式
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Linux·i2c驱动架构​
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十) 初识 Docker file