在基于Python爬虫实战二之爬取百度贴吧帖子的项目–崔庆才(http://cuiqingcai.com/993.html),该项目最终爬取一个贴子的所有楼层或者只看楼主。
想到自己可以爬取一个用户的所有帖子,只需修改写入文件的方式,和正则表达式,以及一些微小改动就可以。
爬取的用户为http://tieba.baidu.com/home/main?un=%E6%B3%95%E5%9F%8E%E5%A0%A1%E9%A2%A4%E6%8A%96&ie=utf-8&fr=pb
具体思路为,爬取用户主页的信息,从中提取去每一帖子的ID,放入list中,再根据baseurl加上一些个人需求(如是否只看楼主)生成实际可爬取的url,,下面就可以按照上面的教程一样,稍作修改,爬取的信息都写入一个文件中。

问题:
1.百度贴吧的个人主页是动态加载,无法根据用户的url爬取所有的帖子,而只是爬取一部分。
2.爬取的帖子是按照帖子发布的更新时间写入的。
如果要按照时间先后写入文件,那个可以在正则表达式中,匹配好时间,在对时间进行排序,依次写入内容:或者将urllist反向读取,依次写入内容。

最终结果:
http://download.csdn.net/download/sinat_36802840/9715688

# -*- coding:utf-8 -*-
import re
import urllib2#处理页面标签类
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)#strip()将前后多余内容删除return x.strip()#百度贴吧爬虫类
class BDTB(object):#初始化,传入基地址,是否只看楼主的参数def __init__(self,Urllist,seeLZ=1,floorTag=1):#base链接地址self.Urllist = Urllist#是否只看楼主self.seeLZ = '?see_lz='+str(seeLZ)#HTML标签剔除工具类对象self.tool = Tool()#全局file变量,文件写入操作对象self.file = None#楼层标号,初始为1self.floor = 1#默认的标题,如果没有成功获取到标题的话则会用这个标题self.defaultTitle = u"宰执天下"#是否写入楼分隔符的标记self.floorTag = floorTagself.filename = u'宰执天下'#传入页码,获取该页帖子的代码def getPage(self,pageNum,IDURL):try:#构建URLurl = IDURL+ self.seeLZ + '&pn=' + str(pageNum)request = urllib2.Request(url)response = urllib2.urlopen(request)#返回UTF-8格式编码内容return response.read().decode('utf-8')#无法连接,报错except urllib2.URLError, e:if hasattr(e,"reason"):print u"连接百度贴吧失败,错误原因",e.reasonreturn None#获取帖子标题def getTitle(self,page):#得到标题的正则表达式pattern = re.compile('<h3 class="core_title_txt.*?>(.*?)</h3>',re.S)result = re.search(pattern,page)if result:#如果存在,则返回标题return result.group(1).strip()else:return None#获取帖子一共有多少页def getPageNum(self,page):#获取帖子页数的正则表达式pattern = re.compile('<li class="l_reply_num.*?</span>.*?<span.*?>(.*?)</span>',re.S)result = re.search(pattern,page)if result:return result.group(1).strip()else:return None#获取每一层楼的内容,传入页面内容def getContent(self,page):#匹配所有楼层的内容pattern = re.compile('<div class="novel-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.encode('utf-8'))return contentsdef setTitle(self,title):#如果标题不是为None,即成功获取到标题if title is  None:title = self.defaultTitlereturn titledef writeData(self,contents):#向文件写入每一楼的信息for item in contents:if self.floorTag == '1':#楼之间的分隔符floorLine = "\n" + str(self.floor) + u"-----------------------------------------------------------------------------------------\n"self.file.write(floorLine)self.file.write(item)self.floor += 1def start(self):#i为该用户的第i帖子i = 1self.file = open(self.filename + ".txt", "w+")print '开始写入文件'for IDURL in self.Urllist:indexPage = self.getPage(1, IDURL)pageNum = self.getPageNum(indexPage)title = self.getTitle(indexPage).encode('utf-8')fengefu = '----------------------------'*6 +'\n'self.file.write(fengefu)self.file.write(title)if pageNum == None:print "URL已失效,请重试"returntry:print "第" + str(i) +"帖共有" + str(pageNum) + "页"for i in range(1, int(pageNum) + 1):print "正在写入第" + str(i) + "页数据"page = self.getPage(i,IDURL)contents = self.getContent(page)self.writeData(contents)i = i +1# 出现写入异常except IOError, e:print "写入异常,原因" + e.messagefinally:print "写入帖子完成"self.file.close()print '文件写入完成,关闭文件'#URL为该用户的贴吧主页
URL = 'http://tieba.baidu.com/home/main?un=%E6%B3%95%E5%9F%8E%E5%A0%A1%E9%A2%A4%E6%8A%96&ie=utf-8&fr=pb'
pattern = re.compile('<div class="n_right clearfix">.*?<div class="thread_name"><a href="/p/(.*?)pid=',re.S)
requestmain = urllib2.Request(URL)
responsemain = urllib2.urlopen(URL)
contentmain = responsemain.read()
#lists里放该用户帖子的ID数
lists = re.findall(pattern, contentmain)
#URLlist为帖子的地址
URLlist = []
baseURL = 'http://tieba.baidu.com/p/'
for i in range(len(lists)):urltem = baseURL + lists[i].strip('?')URLlist.append(urltem)bdtb = BDTB(URLlist)
bdtb.start()

爬取百度贴吧用户的帖子相关推荐

  1. 百度网盘外链采集分析 爬取百度网盘用户分享 问题记录

    采集的时候uk没什么问题,出错加延时1分钟就好了. 采集文件的时候,errno=-55 出错加延时约10分钟就可以.但还有下面几个问题. 1.文件,文件夹,多文件分享 都有短地址 shorturl , ...

  2. java爬取百度贴吧所有用户头像

    第一次写爬虫,觉得蛮有意思的 写了个爬取贴吧用户头像的工具类 如有问题,多多指教~ 爬虫工具类 package com.yq.spider;import java.io.BufferedInputSt ...

  3. python爬取贴吧所有帖子-Python爬虫实例(一)爬取百度贴吧帖子中的图片

    程序功能说明:爬取百度贴吧帖子中的图片,用户输入贴吧名称和要爬取的起始和终止页数即可进行爬取. 思路分析: 一.指定贴吧url的获取 例如我们进入秦时明月吧,提取并分析其有效url如下 ?后面为查询字 ...

  4. python爬取贴吧所有帖子-Python实现的爬取百度贴吧图片功能完整示例

    本文实例讲述了Python实现的爬取百度贴吧图片功能.分享给大家供大家参考,具体如下: #coding:utf-8 import requests import urllib2 import urll ...

  5. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  6. Scrapy 爬取百度贴吧指定帖子的发帖人和回帖人

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

  7. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  8. python爬虫(13)爬取百度贴吧帖子

    爬取百度贴吧帖子 一开始只是在网上看到别人写的爬取帖子的文章,然后自己就忍不住手痒自己锻炼一下, 然后照着别人的写完,发现不太过瘾, 毕竟只是获取单个帖子的内容,感觉内容稍显单薄,然后自己重新做了修改 ...

  9. java 百度贴吧 爬虫,爬取百度贴吧帖子

    依然是参考教程 Python爬虫实战一之爬取百度贴吧帖子.作者崔庆才写了很多关于Python爬虫的文章,大家有兴趣的话可以去他的个人博客静觅学习. 这次将爬取的数据写入了文本文件中,并用到了re模块中 ...

最新文章

  1. centos7上的图形化界面svn客户端_Git实战一:图形客户端规范用法小讲
  2. 主流微服务全链路监控系统之战
  3. DPI 设置过大该如何还原?
  4. 深入理解CSS计数器
  5. Spring Cloud构建微服务架构(一)服务注册与发现
  6. JavaWeb课程复习资料——中文乱码上下文处理
  7. HDU 1430 魔板(康托展开+BFS+预处理)
  8. SQL行列转换问题整理
  9. P2152 [SDOI2009]SuperGCD
  10. 重塑APM标杆,博睿数据战略升级助力企业数字化转型
  11. poj2229 基础的动态规划算法 挑战程序设计竞赛
  12. oracle emctl start
  13. 【报告分享】迈向更好的教育:未来教育的技术空间研究报告.pdf(附下载链接)
  14. Tiktok预计下半年开通购物车,你有想法做吗?
  15. 去小机化思维(二)--【软件和信息服务】2015.03
  16. 无线通信基础(二):高斯噪声中的检测
  17. 人类其实很脆弱,一个小小的条件变化,就能导致人没法享受元宇宙
  18. win7映射网络驱动器消失了_win7映射网络驱动器 找不到 - 卡饭网
  19. oracle11g dataguard安装实施
  20. “使用达芬奇软件实现Autosar架构:配置和注意事项“

热门文章

  1. 让低版本的IE浏览器支持HTML5
  2. 什么是光耦隔离?光耦隔离的主要作用
  3. 树莓派3B--控制继电器
  4. 追溯系统溯源二维码防伪码生成图片源代码
  5. 通达信接口怎么连接主机?
  6. 详解什么是跨链桥?你需要了解这六点 |Tokenview
  7. Unity3D 获取子孙物体并修改材质球属性
  8. 技嘉主BIOS检测错误
  9. 国际大会演讲ppt_大会演讲,透明公正
  10. 安卓基础:实现多线程下载本次服务器的图片