代码是抓取百度贴吧帖子的回复内容的。包括帖子标题、帖子回复数量,帖子页码,回复楼层、回复时间,也可以只查看楼主的回复信息。最后将获取到的帖子信息记录到记事本中。
具体结果看图:

上面的图片打印的是帖子的回复总数140,总共5页。这5页信息是只有楼主的回复,没有包含全部的回复。帖子标题。第一页数量30个回复,下面依次打印每一楼的回复信息,每楼层之间用*号隔开。


这个记事本保存的是楼主的回复内容,包括每次回复的楼层。


这是保存的记事本文档信息截图


这是全部回复,包括不是楼主的回复内容


控制台打印的最后一楼信息。


最后一楼回复的网页截图信息。

第一步:获取帖子html代码内容

#获取页面html文本内容def getPageContent(self,url):request = urllib2.Request(url)response = urllib2.urlopen(request)return response.read().decode('UTF-8')

在这里需要指定解码格式,具体的html文本解码格式,需要具体查看html页面的格式。如下图:

第二步:获取帖子标题和帖子回复总数、页码

箭头指向分别指向了三个信息。正则表达式如下:

#获取帖子标题def decodeTieziTitle(self,pagecontent):pattern = re.compile('<h\d.*?class="core_title_txt.*?>(.*?)</h\d>',re.S)title = re.findall(pattern, pagecontent)return title[0]
#获取页面回复数量和总页码def decodePageContentNum(self,pagecontent):patten = re.compile('<li class="l_reply_num".*?<span class="red".*?>(.*?)'+'</span>.*?<span class="red".*?>(.*?)</span>',re.S)num =re.search(patten, pagecontent);return num
num = self.decodePageContentNum(pagecontent)print num.group(1),u'回复贴,共',num.group(2),u'页'

通过返回num值,group()方法来获取页码和回复帖子数量

第四步:解析文档内容,获取有用信息

#获取四个信息,用户名,内容,楼层,时间def decodePageContent(self,pagecontent):#获取四个信息,用户名d,内容,(),楼层,时间
#         pattern = re.compile('<div.class="d_author">.*?<ul class="p_author">.*?'+
#                              '<li class="d_name.*?<a.*?target="_blank">(.*?)</a>.*?'+
#                              '<div class="d_post_content_main.*?<div class="p_content ".*?<cc>.*?'+
#                              '<div.*?class="d_post_content j_d_post_content.*?>(.*?)'+
#                               '</div>.*?</cc>.*?'+
#                              '<div class="core_reply j_lzl_wrapper">.*?'+
#                              '<div class="core_reply_tail clearfix">.*?'+
#                              '<div class="post-tail-wrap">.*?<span class="j_jb_ele">.*?</span>'+
#                              '(.*?)'+
#                              '<span class="tail-info">(.*?)'+'[\u697c]'+'</span>.*?'+
#                              '<span class="tail-info">(.*?)</span>.*?</div>.*?'+
#                              '<ul class="p_props_tail props_appraise_wrap"></ul>',re.S)pattern = re.compile('<div.class="d_author">.*?<ul class="p_author">.*?'+'<li class="d_name.*?<a.*?target="_blank">(.*?)</a>.*?'+'<div class="d_post_content_main.*?<div class="p_content'+' ".*?<cc>.*?'+'<div.*?class="d_post_content j_d_post_content.*?>(.*?)'+'</div>.*?</cc>.*?'+'<div class="core_reply j_lzl_wrapper">.*?'+'<div class="core_reply_tail clearfix">.*?'+'<div class="post-tail-wrap">'+'(.*?)</div>',re.S)
#         pattern = re.compile('<div class="d_author">.*?<ul class="p_author">.*?'+
#                              '<li class="d_name".*?<a.*?'+
#                              'target="_blank">(.*?)</a>',re.S)
#         pattern = re.compile('<li class="d_name" data-field=".*?<a data-field=".*?'+
#                              'target="_blank">(.*?)</a>.*?</li>',re.S)
#         pattern = re.compile('<div class="d_author">(.*?)</div>',re.S)content = re.findall(pattern, pagecontent)print "len=",len(content)ls = []tail2 = re.compile('<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>', re.S)tail3 = re.compile('<span class="tail-info">.*?</span>.*?'+'<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>',re.S)import sys;reload(sys);sys.setdefaultencoding('utf8');for item in content:n = re.subn('tail-info', 'tail', item[2])if n[1]==4:group3 = re.search(tail3, item[2])ls.append((item[0],item[1],group3.group(1),group3.group(2)))elif n[1]==3:group2 = re.search(tail2, item[2])ls.append((item[0],item[1],group2.group(1),group2.group(2)))else:print 'n error n=',n[1],'=='+item[2].decode('utf-8')return ls

这里的正则表达式比较长,需要根据具体的html代码进行调整。我想说的是,大家在写正则表达式的时候,一点点的测试,不要一下子就写很长的正则表达式,一次是写不对的,保证一点点的扩展,慢慢的增加内容,不断缩小获取信息的范围。
值的一提的是,上面的例子中,在获取楼层,时间信息的时候,有点麻烦,原因在有些楼层的回复是手机端回复的,html代码中是这样的:

就会有三个tail-info的span节点,如果是电脑端回复的帖子,就没有第一个节点span,只有后面两个span节点,并且,tail-info节点不止这三个,如图:

对于这种情况,无法再正则表达式中进行匹配,所以,我把中间的信息使用(.*?)获取到,之后替换tail-info字符串,如果替换的次数有四次,说明是客户端app发的帖子,直接取后面两个span节点信息。如果替换次数是三次,说明是电脑端发的帖子。分别使用正则表达式进行匹配获取信息。

tail2 = re.compile('<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>', re.S)tail3 = re.compile('<span class="tail-info">.*?</span>.*?'+'<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>',re.S)import sys;reload(sys);sys.setdefaultencoding('utf8');for item in content:n = re.subn('tail-info', 'tail', item[2])if n[1]==4:group3 = re.search(tail3, item[2])ls.append((item[0],item[1],group3.group(1),group3.group(2)))elif n[1]==3:group2 = re.search(tail2, item[2])ls.append((item[0],item[1],group2.group(1),group2.group(2)))else:print 'n error n=',n[1],'=='+item[2].decode('utf-8')

这就是代码中的逻辑部分。

完成了这部分内容之后,最后一步,就是循环页码,获取每页帖子回复的信息记录到记事本中:

for i in range(int(self.pagenum)+1):#range函数不包括最大的值pagecontent = self.getPageContent(\self.baseUrl+urlid+self.seellz+str(see_lz)+self.urlpn+str(i))content = self.decodePageContent(pagecontent)picpattern = re.compile('<img class="BDE_Image" src="(.*?)".*?',re.S)#获取四个信息,用户名,内容,楼层,时间for con in content:print '*'*20strcon = '*'*20+os.linesepprint u'楼层:',con[2]strcon += '楼层:'+con[2].encode('utf-8')+os.linesepprint u'时间:',con[3]strcon += '时间:'+con[3].encode('utf-8')+os.linesepprint u'用户名字:',con[0]strcon += '用户名字:'+con[0].encode('utf-8')+os.linesepli = re.findall(picpattern, con[1])if li is not None:for l in li:print u'内容图片:',lstrcon += '内容图片:'+l.encode('utf-8')+os.linesepprint u'内容:',self.tool.replace(con[1])strcon += '内容:'+self.tool.replace(con[1]).encode('utf-8')+os.linesepself.writeTxt(strcon+os.linesep,f)
#帖子的每一个回复内容写入文件中
def writeTxt(self,strs,f):f.writelines(strs)

之后给出整个代码如下:

#_*_encoding=utf8_*_
'''
Created on 2015年11月22日@author: 15361
'''
import urllib2
import re
import os
from scr.tool import Toolclass BDTB:def __init__(self):
#       'http://tieba.baidu.com/p/3138733512?see_lz=1&pn=1'  百度贴吧URL地址self.baseUrl = 'http://tieba.baidu.com/p/'self.seellz = '?see_lz=' #=1只看楼主 =0查看全部self.urlpn = '&pn=' #代表页码self.tool =Tool()#帖子的每一个回复内容写入文件中def writeTxt(self,strs,f):f.writelines(strs)#获取四个信息,用户名,内容,楼层,时间def decodePageContent(self,pagecontent):#获取四个信息,用户名d,内容,(),楼层,时间
#         pattern = re.compile('<div.class="d_author">.*?<ul class="p_author">.*?'+
#                              '<li class="d_name.*?<a.*?target="_blank">(.*?)</a>.*?'+
#                              '<div class="d_post_content_main.*?<div class="p_content ".*?<cc>.*?'+
#                              '<div.*?class="d_post_content j_d_post_content.*?>(.*?)'+
#                               '</div>.*?</cc>.*?'+
#                              '<div class="core_reply j_lzl_wrapper">.*?'+
#                              '<div class="core_reply_tail clearfix">.*?'+
#                              '<div class="post-tail-wrap">.*?<span class="j_jb_ele">.*?</span>'+
#                              '(.*?)'+
#                              '<span class="tail-info">(.*?)'+'[\u697c]'+'</span>.*?'+
#                              '<span class="tail-info">(.*?)</span>.*?</div>.*?'+
#                              '<ul class="p_props_tail props_appraise_wrap"></ul>',re.S)pattern = re.compile('<div.class="d_author">.*?<ul class="p_author">.*?'+'<li class="d_name.*?<a.*?target="_blank">(.*?)</a>.*?'+'<div class="d_post_content_main.*?<div class="p_content'+' ".*?<cc>.*?'+'<div.*?class="d_post_content j_d_post_content.*?>(.*?)'+'</div>.*?</cc>.*?'+'<div class="core_reply j_lzl_wrapper">.*?'+'<div class="core_reply_tail clearfix">.*?'+'<div class="post-tail-wrap">'+'(.*?)</div>',re.S)
#         pattern = re.compile('<div class="d_author">.*?<ul class="p_author">.*?'+
#                              '<li class="d_name".*?<a.*?'+
#                              'target="_blank">(.*?)</a>',re.S)
#         pattern = re.compile('<li class="d_name" data-field=".*?<a data-field=".*?'+
#                              'target="_blank">(.*?)</a>.*?</li>',re.S)
#         pattern = re.compile('<div class="d_author">(.*?)</div>',re.S)content = re.findall(pattern, pagecontent)print "len=",len(content)ls = []tail2 = re.compile('<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>', re.S)tail3 = re.compile('<span class="tail-info">.*?</span>.*?'+'<span class="tail-info">(.*?)</span>.*?'+'<span class="tail-info">(.*?)</span>',re.S)import sys;reload(sys);sys.setdefaultencoding('utf8');for item in content:n = re.subn('tail-info', 'tail', item[2])if n[1]==4:group3 = re.search(tail3, item[2])ls.append((item[0],item[1],group3.group(1),group3.group(2)))elif n[1]==3:group2 = re.search(tail2, item[2])ls.append((item[0],item[1],group2.group(1),group2.group(2)))else:print 'n error n=',n[1],'=='+item[2].decode('utf-8')return ls#获取帖子标题def decodeTieziTitle(self,pagecontent):pattern = re.compile('<h\d.*?class="core_title_txt.*?>(.*?)</h\d>',re.S)title = re.findall(pattern, pagecontent)return title[0]#获取页面回复数量和总页码def decodePageContentNum(self,pagecontent):patten = re.compile('<li class="l_reply_num".*?<span class="red".*?>(.*?)'+'</span>.*?<span class="red".*?>(.*?)</span>',re.S)num =re.search(patten, pagecontent);return num#获取页面html文本内容def getPageContent(self,url):request = urllib2.Request(url)response = urllib2.urlopen(request)return response.read().decode('UTF-8')def start(self):urlid = raw_input("输入贴吧帖子ID:").strip()see_lz = raw_input("是否只看楼主的帖子(是输入1,否输入0):")sss = self.baseUrl+urlid+self.seellz+str(see_lz)+self.urlpn+str(1)
#         sss = 'http://tieba.baidu.com/p/3138733512?see_lz=0&pn=1'print 'url=',ssspagecontent = self.getPageContent(\sss)num = self.decodePageContentNum(pagecontent)print num.group(1),u'回复贴,共',num.group(2),u'页'self.pagenum = num.group(2)  #保存页码数量self.title = self.decodeTieziTitle(pagecontent)import sys;reload(sys);sys.setdefaultencoding('utf8');if see_lz==1:f = open(self.title+'-楼主.txt'.encode('utf-8'),'w+')else:f = open(self.title+'-全部.txt'.encode('utf-8'),'w+')self.writeTxt(num.group(1)+' post number,'+num.group(2)+'page number'+os.linesep,f)print u'帖子标题:%s' %self.titlefor i in range(int(self.pagenum)+1):#range函数不包括最大的值pagecontent = self.getPageContent(\self.baseUrl+urlid+self.seellz+str(see_lz)+self.urlpn+str(i))content = self.decodePageContent(pagecontent)picpattern = re.compile('<img class="BDE_Image" src="(.*?)".*?',re.S)#获取四个信息,用户名,内容,楼层,时间for con in content:print '*'*20strcon = '*'*20+os.linesepprint u'楼层:',con[2]strcon += '楼层:'+con[2].encode('utf-8')+os.linesepprint u'时间:',con[3]strcon += '时间:'+con[3].encode('utf-8')+os.linesepprint u'用户名字:',con[0]strcon += '用户名字:'+con[0].encode('utf-8')+os.linesepli = re.findall(picpattern, con[1])if li is not None:for l in li:print u'内容图片:',lstrcon += '内容图片:'+l.encode('utf-8')+os.linesepprint u'内容:',self.tool.replace(con[1])strcon += '内容:'+self.tool.replace(con[1]).encode('utf-8')+os.linesepself.writeTxt(strcon+os.linesep,f)
bdtb = BDTB()
bdtb.start()

最后需要提一点的是,以上代码是对于
http://tieba.baidu.com/p/3138733512?see_lz=0&pn=1
该地址的帖子的信息的获取,其中3138733512代表帖子ID值。
see_lz代表是否只看楼主的回复帖子
该值=0 查看全部回复帖子
该值=1 只查看楼主回复帖子
pn 代表页码

对于该网址信息下的网页 信息,以上代码是正确的。对于别的帖子的内容,本人试了一下好像需要做调整才行。

下载完整代码的,请猛戳这里!

Github地址,在这里!
该github地址下,不仅仅有该博客的内容,还有淘宝淘女郎、糗事百科网页信息的抓取内容,欢迎关注!^_^

Python抓取百度贴吧网页信息以及代码下载相关推荐

  1. Python抓取糗事百科网页信息以及源码下载

    最近学习了一段时间的python,看书觉得挺简单,但是到真正高代码实现,确实不熟,下面这个东西搞了一下午时间,在别人的基础上改的,就这样也搞了一下午.算是有点入门了吧,不过,学习新东西,最快的方法就是 ...

  2. Python抓取淘女郎网页信息以及代码下载

    上一篇Python抓取糗事百科网页信息以及源码下载 也是利用python抓取网页信息,轻车熟路,知道一个之后,轻轻松松就是实现啦. 淘女郎网页地址:https://mm.taobao.com/json ...

  3. Python爬虫之小试牛刀——使用Python抓取百度街景图像

    之前用.Net做过一些自动化爬虫程序,听大牛们说使用python来写爬虫更便捷,按捺不住抽空试了一把,使用Python抓取百度街景影像. 这两天,武汉迎来了一个德国总理默克尔这位大人物,又刷了一把武汉 ...

  4. python爬取地图地址_用Python抓取百度地图里的店名,地址和联系方式

    原标题:用Python抓取百度地图里的店名,地址和联系方式 每日干货好文分享丨请点击+关注 欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区. 对商业智能BI.大数 ...

  5. python语言翻译-教你用Python抓取百度翻译

    最近一直在一个平台学习Python,所以分享下课程里面抓取百度翻译的操作.原理其实也很简单,就是将浏览器请求的操作我们用python进行模拟,从而获取到返回的数据,我们将返回的数据进行提取,从而得到我 ...

  6. 教你用Python抓取百度翻译

    最近一直在一个平台学习Python,所以分享下课程里面抓取百度翻译的操作.原理其实也很简单,就是将浏览器请求的操作我们用python进行模拟,从而获取到返回的数据,我们将返回的数据进行提取,从而得到我 ...

  7. python抓取gb2312/gbk编码网页乱码问题

    做了个网络爬虫抓取网页,但如果网页是gbk/gb2312编码,则会出现乱码问题,如下: 取得文字后,直接打印,输出结果str如下:¹óÖÝÈËÊ¿¼ÊÔÐÅÏ¢Íø_¹óÖÝÈËÊ¿¼ÊÔÍø_¹ ...

  8. python抓取内存中的网页_『爬虫四步走』手把手教你使用Python抓取并存储网页数据!...

    爬虫是Python的一个重要的应用,使用Python爬虫我们可以轻松的从互联网中抓取我们想要的数据,本文将基于爬取B站视频热搜榜单数据并存储为例,详细介绍Python爬虫的基本流程.如果你还在入门爬虫 ...

  9. Python 抓取微信公众号账号信息

    搜狗微信搜索提供两种类型的关键词搜索,一种是搜索公众号文章内容,另一种是直接搜索微信公众号.通过微信公众号搜索可以获取公众号的基本信息及最近发布的10条文章,今天来抓取一下微信公众号的账号信息 爬虫 ...

最新文章

  1. CISCO SECURE ACCESS CONTROL SERVER
  2. nmap 扫描常见漏洞
  3. Nginx压缩输出配置
  4. 如果有一天,我们和甲方交换身份…
  5. Java IO框架总揽--ObjectInputStream ObjectOutputStream源码解读
  6. linux删除指定端口的进程
  7. 【逆强化学习-0】Introduction
  8. messageformat.format() 自定义参数名_DedeCMS的Java版mcms 第四季之一: 自定义插件
  9. wc命令统计文件数据数量信息
  10. 操作excel方便么_【Excel好推荐】专业仪表板
  11. jenkins pipeline_Jenkins流水线(pipeline)实战之:从部署到体验
  12. iview 远程搜索选择器方法使用,选择之后清空选择的项
  13. c语言dll导出函数举例,DLL中导出函数的两种方式(dllexport与.def文件)
  14. 易语言WebUI教程 —— 入门简介
  15. HALCON 18.11 Progress 发布说明
  16. 让你轻松入门的编程学习窍门,JAVA、Python快速学习资料+练手项目
  17. SAP 采购信息记录BDC实现
  18. C++ | PaddleOCR GPU版使用步骤与测试时间对比(相对CPU)
  19. Svelte入门——Web Components实现跨框架组件复用(二)
  20. Life Restart 人生模拟器 网址

热门文章

  1. 使用scanf从键盘读取一个整数,并输出到屏幕
  2. 有杀气童话服务器维护9月,《梦幻西游》手游2015年9月23日维护公告
  3. PDF解密,在线解锁,解密,非常好用
  4. A share buffer infrastructure In Linux kernel through ION
  5. 燕山大学计算机网络实验(windows网络配置方法及基本网络命令、交换机和路由器的使用、小型校园网络模拟搭建)
  6. Arduino uno基础教程
  7. C#中AssemblyInfo.cs文件详解
  8. 电子商务门户解决方案(新网互联)
  9. 新概念英语第四册31-40课(转)
  10. 关于最近DNF刷图频繁出现验证码的解决方案