原文链接:http://cuiqingcai.com/993.html

划重点:

  1.提取帖子内容时,对图片,贴吧自动增加的超链接,制表符,换行符要做删除或替换处理

  2.decode是把bytes转换为str, encode是把str转换为bytes  原帖中的代码第100行多了一个encode,导致出错

  3.代码中用到了文件相关操作

  4.原文中获取标题的正则表达式我觉得不太对,做了修改。原文只是提取了<h1></h1>直接的,但实际上有在<h3></h3>直接的

最终代码如下,在python3.4.3中实现

import urllib.request
import urllib.parse
import re#处理页面标签类
class Tool:#去除img标签,7位长空格removeImg = re.compile('<img.*?>| {7}')#删除超链接标签removeAddr = re.compile('<a.*?>|</a>')#把换行的标签换为\nreplaceLine = re.compile('<tr>|<div>|</div>|</p>')#将表格制表<td>替换为\treplaceTD = re.compile('<td>')#把段落开头换为\n加空两格replacePara = re.compile('<p.*?>')#将换行符或双换行符替换为\nreplaceBR = re.compile('<br><br>|<br>')#将其余标签剔除removeExtraTag = re.compile('<.*?>')def replace(self, x):x = re.sub(self.removeImg, "", x)x = re.sub(self.removeAddr, "", x)x = re.sub(self.replaceLine, "\n", x)x = re.sub(self.replaceTD, "\t", x)x = re.sub(self.replacePara, "\n    ", x)x = re.sub(self.replaceBR, "\n", x)x = re.sub(self.removeExtraTag, "", x)return x.strip()#百度贴吧爬虫类
class BDTB:#初始化,传入基地址,是否只看楼主的参数def __init__(self, baseUrl, seeLZ,floorTag):self.baseURL = baseUrlself.seeLZ = '?see_lz='+str(seeLZ)self.tool = Tool()self.file = Noneself.floor = 1self.defaultTitle = u"百度贴吧"self.floorTag = floorTag#传入页码,获取该页帖子的代码def getPage(self, pageNum):try:url = self.baseURL+self.seeLZ+'&pn='+str(pageNum)request = urllib.request.Request(url)response = urllib.request.urlopen(request)return response.read().decode('utf-8','ignore') #注意转换成字符串except urllib.error.URLError as e:if hasattr(e, "reason"):print(u"连接百度贴吧失败,错误原因:", e.reason)return None#获取帖子标题def getTitle(self):pageCode = self.getPage(1)pattern = re.compile('''<h\d class="core_title_txt.*?title="(.*?)" style="width:.*?</h\d>''', re.S)result = re.search(pattern, pageCode)if result:title = result.group(1).strip() #这里注意,获取分组的方法return titleelse:return None#提取帖子页数def getPageNum(self):pageCode = self.getPage(1)pattern = re.compile('''<span class=.*?</span>.*?回复贴,共.*?<span class=.*?>(.*?)</span>''', re.S)result = re.search(pattern, pageCode)if result:pageNum = result.group(1).strip()return pageNumelse: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 = "\n"+self.tool.replace(item)+"\n"contents.append(content)return contentsdef setFileTitle(self, title):if title is not None:self.file = open(title+".txt","w+")else:self.file = open(self.defaultTitle+".txt","w+")def writeData(self, contents):#向文件写入每一楼的信息for item in contents:if self.floorTag == '1':#楼之间的分隔符floorLine = "\n" + str(self.floor) + "楼-------------------------------------"self.file.write(floorLine)self.file.write(item)self.floor+=1def start(self):pageNum = self.getPageNum()title = self.getTitle()self.setFileTitle(title)if pageNum == None:print(u"URL已失效,请重试")return try:print("该帖子共有" + str(pageNum) + "页")for i in range(1, int(pageNum) + 1):print("正在写入第"+str(i)+"页数据")page = self.getPage(i)contents = self.getContent(page)self.writeData(contents)#出现写入异常except IOError as e:print("写入异常,原因"+e.message)finally:print("写入任务完成")print(u"请输入帖子代号")
baseURL = 'http://tieba.baidu.com/p/' + str(input(u'http://tieba.baidu.com/p/'))
seeLZ = input("是否只看楼主发言,是输入1,否输入0\n")
floorTag = input("是否写入楼层信息,是输入1,否输入0\n")
bdtb = BDTB(baseURL, seeLZ, floorTag)
bdtb.start()

【python】抄写大神的百度贴吧代码相关推荐

  1. python大神写的代码_【python】抄写大神的糗事百科代码

    importurllib.requestimporturllib.parseimportreimporttime#糗事百科爬虫类 classQSBK:#初始化方法,定义一些变量 def __init_ ...

  2. java大神请出来_求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因。...

    求java大神,请分析以下代码,写出执行结果,并解释每行结果输出的原因.classPlate{publicPlate(){System.out.println("inPlateconstru ...

  3. python外国大神有哪些_国外Python大牛们用什么互相沟通、聊天?

    原标题:国外Python大牛们用什么互相沟通.聊天? 答案是 IRC 问题 什么是IRC? 它其实就是一个文字版.但是全球通用的QQ.它很古老,诞生于1988年,所以老一辈程序员很多人习惯通过它来沟通 ...

  4. python老王卖西瓜_搞不懂Python?大神教你用Python买西瓜!

    什么是code? code就就是一种语言,一种计算机能读懂的语言.计算机是一个傻*,他理解不了默认两可的任何东西.比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总之 ...

  5. 大神碉堡!99 行代码实现的神奇效果

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 边策 鱼羊 发自 凹非寺量子位 报道 | 公众号 QbitAI 只用99行代码,你也可以像<冰雪奇缘>里的 ...

  6. 看完微软大神写的求平均值代码,我意识到自己还是too young了

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 博雯 发自 凹非寺 量子位 | 公众号 QbitAI 取整求个无符号整数的平均值,居然 ...

  7. 看完微软大神写的求平均值代码,我意识到自己还是 too young 了

    博雯 发自 凹非寺 量子位 | 公众号 QbitAI取整求个无符号整数的平均值,居然也能整出花儿来? 这不,微软大神Raymond Chen最近的一篇长文直接引爆外网技术平台,引发无数讨论: 无数人点 ...

  8. Google大神每天写多少行代码?真相让你吃惊!

    「 读者福利!2 TB 各类技术资源免费赠送 」 Quora上有个有趣的问题:Google工程师们每天写多少行代码? Google 的 AdMob 全栈工程师 Raymond Farias 在 Quo ...

  9. java杀毒软件_震宇大神的杀毒软件 (Java代码)

    解题思路: 注意事项: 参考代码: public class 震宇大神的杀毒软件_水到不能再水 { public static void main(String[] args) { // TODO A ...

最新文章

  1. 哪一类功率放大电路效率最高_最简单逆变器电路讲解计算,电工电子动手学技术,电路好案例推荐...
  2. 服务器论坛有哪些_SEO工作中,经常使用的无效外链有哪些?
  3. 解决go get 下载慢的问题
  4. 2015上半年软件设计师考点,难点3
  5. Matlab最短路学习
  6. ITK:可视化静态密集2D水平集零集
  7. chorme插件 ,在浏览器上模拟手机,pad 查看网页|前端技术开发必备插件
  8. 自动化测试框架cucumber_自动化测试框架cucumber-java操作手册_从配置到生成测报...
  9. 求两个不超过200位的非负整数积_必看:初一上册数学考试概念、定义全部公式总结!(两个版本)...
  10. multiprocessing python_Python教程:进程和线程amp;多进程
  11. Java扩展机制可加载所有JAR
  12. C/C++编程笔记:浅析 C 语言中宏定义的使用,知识点全解
  13. 【Spring Cloud】网关-gateway(2.x)
  14. 构建Postfix邮件系统(一) -- postfix+dovecot
  15. 微型计算机工作最小时间单位,2010~2011学年第1学期微机原理2试卷A(答案)
  16. html 自动阅读,自动阅读软件脚本
  17. Ace Admin中表格按钮的使用方法——表格导出为xls、pdf,表格打印预览等
  18. 新课程背景下高中化学实验室的硬件建设要求
  19. 知识表示-马尔科夫链(MC)
  20. 初识powerpoint的计算机教案,初识ppt教案.doc

热门文章

  1. WPF 实现 DataGrid/ListView 分页控件
  2. gcc 5.2.0 手动更新(亲测)
  3. 防止html标签转义
  4. Ajenti-Linux控制面板之自动化运维工具
  5. WeakHashMap和Java引用类型详细解析
  6. JavaScript中的一些特殊用法(一)
  7. LoadRunner中进程运行和线程运行区别
  8. STM32的FLASH ID加密
  9. MongoDb分片集群认证
  10. MAD huashi