【python】抄写大神的百度贴吧代码

原文链接: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()

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

敏捷开发组织【北京及其他地区QQ群】【长三角QQ群】【珠三角QQ群】

【北京及其他地区QQ群】http://qun.qq.com/#jointhegroup/gid/95849986 上限500人&#xff0c;创建日期2011-03-20&#xff0c;当前人数393&#xff0c;多数来自CSDN&#xff0c;包括北京约100人&#xff0c;长三角100人&#xff0c;珠三角100人&#xff0c;其他地区100人。未来…

保送北大,连发三篇Science,这位80后川妹子近日再发重磅级研究成果!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术2020年9月21日&#xff0c;启函生物杨璐菡博士等在 Nature 子刊 Nature Biomedical Engineering杂志上发表了题为&#xff1a;Extensive germline genome engineering in pigs 的研究论文。杨璐菡杨璐菡带领的研究团队成…

TCP/IP 协议简单分析(建立连接握手过程)

原文&#xff1a;http://hi.baidu.com/wuguoyana/blog/item/38c04d3bcf047ce43a87ce55.html 首先TCP和IP是两种不同的协议&#xff0c;它们来七层网络模型中分别在不同的层次&#xff0c;IP协议是网络层的协议&#xff0c;TCP是更高一层的传输层的协议&#xff0c;TCP是建立在I…

java 继承接口语法_java的继承、接口方面的语法及知识

}父类的属性子类中都存在&#xff0c;只是有没有权限访问的问题根据名字找谁是谁&#xff1f;1.变量-> 类型 (类、接口)->接口2.已经确定是变量局部变量、形参->类的属性-> 外部类的属性就近原则构造方法&#xff1a;注意默认的那个无参构造方法优先调用父类的构造…

Linq 下的 Take() 方法内部机制是怎样的?

咨询区 Rahul Kishore&#xff1a;我的web需要访问数据库&#xff0c;但是表比较大&#xff0c;我仅仅想要获取该表中 N 条数据&#xff0c;我查阅了 MSDN 文档&#xff0c;看到了一个 Take() 方法&#xff0c;我现在很疑惑它的运行机制是下面哪一种&#xff1f;先从数据库中获…

【2】开发环境的搭建,Ubuntu14.04

这里使用的是Ubuntu14.04 Unity 更新源 首先&#xff0c;将更新源更换为国内更新源&#xff0c;我这里使用的是网易的更新源 sudo gedit /etc/apt/sources.list 1 deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse2 deb http://mirrors.163.com…

如何直接soap字符串,访问webservice

2019独角兽企业重金招聘Python工程师标准>>> 1.Webservice.GetVcardByUserNo(String userId&#xff0c;String userNo);这个是封装了的webservice接口。 2.在程序中连续两次调用该接口时&#xff0c;ksoap2在解析第二次调用返回的结果时抛异常。 异常信息如下&…

百度对301的反应

http://www.admin5.com/article/20111228/400200.shtml转载于:https://www.cnblogs.com/tonykan/archive/2012/12/04/2801449.html

《哈利波特》电影全集+有声书免费领取!带你重返儿时魔法世界……

全世界只有3.14 % 的人关注了爆炸吧知识说到哈利波特系列&#xff0c;几乎人人皆知&#xff0c;享誉世界&#xff0c;风靡全球的哈利波特究竟有什么无穷魔力呢&#xff1f;《哈利波特》是英国作家JK罗琳的魔幻文学系列小说&#xff0c;共7集&#xff0c;其中前六部以霍格沃茨魔…

.NET6下周发布真的香,可不少人却只会.NET Framework!

倒计时7天&#xff0c;.NET6VS2022C#10将同时发布正式版&#xff0c;宣告.NET步入全新篇章&#xff0c;各种新语法、新框架、新技术都如约而至&#xff0c;令人期待&#xff01;近年来&#xff0c;.NET跨平台持续推出新版本&#xff0c;开源社区也不断涌现各种优秀框架&#xf…

oracle 选择最频繁出现之前,5文章数据

SELECT* FROM(SELECTPROJECT_LISTING.MATERIAL,COUNT (*) AS "出现次数"FROMPROJECT_LISTINGWHEREPROJECT_LISTING.MATERIAL IS NOT NULLGROUP BYPROJECT_LISTING.MATERIALORDER BYCOUNT (*) DESC) WHERE ROWNUM < 5ORDER BYCOUNT (*) DESC 是关键排序COUNT (*)…

java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题

Java子类在实例化时默认调用的是父类的无参构造函数&#xff0c;不论实例化时调用的是子类的有参还是无参构造函数&#xff0c;1、当父类没有显式定义构造方法时&#xff0c;编辑器会默认为此类添加一个隐式无参构造函数。此时子类可以有自己的无参和有参构造方法。不论实例化时…

收缩临时表空间

当排序操作、重建索引等大型操作无法在内存中完成时&#xff0c;临时表空间将为排序提供便利。一般情况下临时表空间为多个用户&#xff0c;多个会话所共 享。不能为会话分批空间配额。临时表空间耗用过度且在不能自动扩展的情形下将收到“ORA-1652:unable to extend temp segm…

v4L2编程

v4L2编程 v4L2是针对uvc免驱usb设备的编程框架&#xff0c;主要用于采集usb摄像头等&#xff0c;编程模式如下&#xff1a; 一&#xff0e;设置采集方式 打开视频设备后&#xff0c;可以设置该视频设备的属性&#xff0c;例如裁剪、缩放等。这一步是可选的。在Linux编程中&…

java环境怎样搭建_如何学习JAVA?怎么搭建JAVA环境?怎么安装JDK?

JAVA在学习JAVA前&#xff0c;我们必须了解并搭建好JAVA所需的开发环境&#xff0c;要让你写代码能让机器听得懂并执行&#xff0c;JDK(Java Developers Kits)自然是是必须的安装JDK前的准备首先我们要先知道自己的电脑系统是几位版本的&#xff0c;右键”此电脑“点击菜单里的…

神奇的机械动态图,看了一遍又一遍!最后一个真神奇~

全世界只有3.14 % 的人关注了爆炸吧知识神奇的机械科技动态图&#xff0c;看了一遍又一遍&#xff01;最后一个真神奇&#xff5e;▲金属切割的慢镜头&#xff0c;美&#xff01;▲齿轮变速原理演示▲塑料成型机器▲切丝的食品机器▲螺旋状的通心粉制造▲高温融化锁的过程▲一次…

Envoy实现.NET架构的网关(三)代理GRPC

.NET网关与Gateway实战-Envoy与kong课程Envoy实现.NET架构的网关&#xff08;一&#xff09;静态配置与文件动态配置Envoy实现.NET架构的网关&#xff08;二&#xff09;基于控制平面的动态配置什么是GRPCgRPC是一种与语言无关的高性能远程过程调用 (RPC) 框架。gRPC 的主要好处…

Linux 下用来查询安装包信息的RPM选项

Linux 下用来查询安装包信息的RPM选项RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的安装包。RHEL和基于它的系统使用rpm命令来完成这些功能。AD&#xff1a;RPM是RedHat的包管理器&#xff0c;用来安装、卸载、升级和查询基于RedHat Linux的…

C#_空值判断

(1) nullnull 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为null &#xff0c;如果 int inull,的话&#xff0c;是不可以的&#xff0c;因为Int是值类型的。(2)""、String.Empty、String.Length 0 这两个…

如何用Java讲一句话重复五遍_Java 0515 第二次课作业

import java.util.*;public class Work_01 {public static void main(String[] args) {Scanner scan new Scanner(System.in);System.out.println("上午是否合格?");String judge scan.next();//输入是否while(!"是".equals(judge)){//用equals方法判断…