使用Python3.x的版本 对http://tieba.baidu.com/p/2005436135,该百度贴吧帖子进行爬取操作。

一.使用到的库。

1.   urllib.request   :对链接进行解析,以及图片的保存

参考资料:http://www.jb51.net/article/42630.htm

http://www.cnblogs.com/Lands-ljk/p/5447127.html

2.   re   :正则表达式的处理模块

参考资料:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

3.   os   :文件的操作模块

参考资料:http://developer.51cto.com/art/201003/186045.htm

二.对帖子链接的分析。

该帖子是对部分美剧的分析和推荐。

原始链接为:http://tieba.baidu.com/p/2005436135

如果只看楼主的话会变成:http://tieba.baidu.com/p/2005436135?see_lz=1

如果选择第几页的话变成:http://tieba.baidu.com/p/2005436135?see_lz=1&pn=2

可以看出:?see_lz=1是选择只看楼主,?see_lz=0,取消只看楼主,&pn=x , x就是第几页。

三.使用urllib.request模块获取到网页源码。

1.urllib.request.open()  可以直接使用Url作为参数,或者一个Request对象作为参数。

在此使用Request对象作为参数。

request = urllib.request.Request(Url)
response = urllib.request.urlopen(request)

2.read() 方法   将得到的源码显示出来,并且使用decode('utf-8'),进行解码,得到网页源码。

response.read().decode('utf-8')

四.构造方法,得到网页源码。

根据需求可分为只看楼主或者不只看楼主,根据输入的链接Url,是否只看楼主SeeLZ,开始的页数Num,做参数,得到如下代码。

    def getPage(self,Url,SeeLZ,Num):if(SeeLZ == 1):Url = Url.strip() + '?see_lz=1' + '&pn=' + str(Num)  # strip()去掉字符串左右两边的空格if(SeeLZ == 0):Url = Url.strip() + '?see_lz=0' + '&pn=' + str(Num)try:request = urllib.request.Request(Url)response = urllib.request.urlopen(request)return response.read().decode('utf-8')except urllib.request.URLError as e:if hasattr(e,'reason'):print('连接错误:',e.reason)return None

根据传入的参数,完善整个Url,然后返回整个网页源码,在这里使用异常捕捉,来捕捉异常。

五.运用正则表达式得到帖子的题目和回复的数目和页数。

1.得到帖子的题目。

<h1class="core_title_txt member_thread_title_pb" title="【30部屌丝必备美剧】逆袭吧,屌丝。"style="width: 470px">【30部屌丝必备美剧】逆袭吧,屌丝。</h1>

在网页源码中可以找到,帖子的题目在这里出现。

编写正则表达式,得到帖子的题目。

    def getTitle(self,page): #得到帖子的题目pattern = re.compile(r'<h1 class=".*?>(.*?)</h1>')result = pattern.search(page)          #可用re.search(pattern,self.page)替换print('帖子名称:',result.group(1))self.name = result.group(1)             #得到帖子的名字,位创建文件夹和文件做准备

page是传入的网页源码,search在源码中进行匹配,如果匹配到相应的内容则返回一个Match对象,使用group可得到内容。

2.得到帖子的回复数目和页数。

与得到帖子题目的做法一致,在网页源码中找到位置,编写正则表达式进行匹配即可。

    def getPageNumAndReply(self,page):   #得到帖子的回复数目和页数pattern = re.compile(r'<li class="l_reply_num.*?><span class=".*?>(\d+)</span>.*?>(\d+)</span>')result = pattern.search(page)print('该帖子共',result.group(1),'回复 ; 共',result.group(2),'页数')self.pageReply = result.group(1)    #得到帖子的总回复self.pageNum = result.group(2)      #得到帖子的总页数

六.得到回复的内容和回复者的名字。

1.得到原始的回复的内容。

依然是使用正则表达式对网页源码中的内容进行匹配,分析源码找到回复内容出现的地方。

        pattern = re.compile(r'<img username="(.*?)".*?<div id="post_content.*?>(.*?)</div>',re.S)      #re.S 模式下 . 可以匹配换行符result = pattern.findall(page)     #findall返回的是列表,因为该匹配的是两个内容,所以列表中的每个元素是一个元组,每个元组包含了两个元素(回复内容和回复者)

findall  会在整个源码中进行匹配,然后返回一个列表。

2.对回复的图片内容进行处理。

由于回复中可能会带有图片,所以需要对图片单独进行抓取。

同理,分析图片出现的地方的代码,编写正则表达式进行匹配。

pattern1 = re.compile(r'src="(.*?)"',re.S)      #用来匹配回复中的照片

该正则表达式用于在回复的内容中进行匹配。

若在回复中匹配到图片,则调用另一个保存图片的方法,将该图片进行保存。

    def savePicture(self,Picture,num):filepath = os.getcwd() + '\\' + self.name  # 得到文件的路径for url in Picture:a = 1temp = filepath + '\\' + str(num) + '(' + str(a) + ')L.jpg'urllib.request.urlretrieve(url, temp)  # 保存到本地文件中a += 1

3.对回复中的其他内容进行处理。

回复中除了图片以外,还有其他的hrml代码,需要将其转换成相应的内容。

将回复中的超链接删除掉,将换行符br替换成\n,同是将其他的一些内容删除掉。

    def removeOthers(self,page):removeImg = re.compile(r'<img .*?>')        #删除掉图片的链接removeAddr = re.compile(r'<a.*?>|</a>')     #删除掉超链接replaceBr = re.compile('<br>')              #替换换行符removeOthers = re.compile(r'<.*?>')         #删除其他的内容page = re.sub(removeImg,'',page)page = re.sub(removeAddr,'',page)page = re.sub(replaceBr,'\n',page)page = re.sub(removeOthers,'',page)return page

4.将回复的内容写入文件中。

写入文件比较简单,得到工作的目录,然后在目录下创建一个新的文件写入即可。

写入的同是可以添加一些内容使其看起来更为美观。

    def wiriteFile(self,name,content,num):          #对文件的路劲需要处理path = os.getcwd() + '\\' + self.name + '\\' + self.name + r'.txt'  #得到当前工作目录path = path.replace('\\','//',1)        #替换目录中的\ 为// ,为创建文件做准备file = open(path,'a')if num == 1:file.write('帖子名称:')file.write(self.name)file.write('   |   帖子总回复:')file.write(self.pageReply)file.write('   |   帖子总页数:')file.write(self.pageNum)file.write('\n----------------------------\n')file.write('第')num = str(num)file.write(num)file.write('楼\n\n')file.write(name)file.write('\n\n')file.write(content)print(num,'楼内容已爬取完成...')

5.整个得到回复内容的总结。

使用x变量是对楼层进行统计,在命名图片的时候使用。

    def getContent(self,page):   #得到帖子的回复的内容以及回复者,得到回复中的图片pattern = re.compile(r'<img username="(.*?)".*?<div id="post_content.*?>(.*?)</div>',re.S)      #re.S 模式下 . 可以匹配换行符result = pattern.findall(page)     #findall返回的是列表,因为该匹配的是两个内容,所以列表中的每个元素是一个元组,每个元组包含了两个元素(回复内容和回复者)pattern1 = re.compile(r'src="(.*?)"',re.S)      #用来匹配回复中的照片for x in result:content = self.removeOthers(x[1])  # 得到去除多余链接及图片后的内容self.wiriteFile(x[0], content, self.x)  # 将内容写入文件中result1 = pattern1.findall(x[1])        #匹配回复中的图片if result1 != []:           #findall没有匹配到内容返回值是一个空的列表self.savePicture(result1,self.x)        #保存图片self.x += 1

七.将整个内容进行整合。

可以使用input函数输入相应的Url,Num,SeeLZ等。

同是在爬取的开始应该建立一个新的文件夹,让得到的内容方便处理。

    def start(self):url = input("请输入所要爬取的帖子链接:")seeLZ = input("是否只看楼主:")Num = input("从第几页开始:")if(seeLZ == '是'):seeLZ = 1if(seeLZ == '否'):seeLZ = 0self.x = 1page = self.getPage(url,seeLZ,Num)self.getTitle(page)self.getPageNumAndReply(page)filepath = os.getcwd() + '\\' + self.name  # 得到文件的路径print(filepath)if os.path.exists(filepath) is False:print('Hlloasdk')os.mkdir(filepath)y1 = int(Num)y2 = int(self.pageNum) + 1for y in range(y1,y2):page = self.getPage(url, seeLZ, y)self.getContent(page)print('爬取完成,实际爬取到',self.x-1,'楼!')

代码:https://github.com/leafage666/SpiderBaiDuTieba/blob/master/Spider

Python3 简单爬虫爬取百度贴吧帖子相关推荐

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

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

  2. python爬取百度百科词条-python简单爬虫爬取百度百科python词条网页

    目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...

  3. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页

    目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...

  4. python爬虫吧-python爬虫-爬取百度贴吧帖子加图片

    1.[代码][Python]代码 # -*- coding: utf-8 -*- """ 百度贴吧帖子抓取 """ import urlli ...

  5. python3爬虫爬取百度贴吧下载图片

    python3爬虫爬取百度贴吧下载图片 学习爬虫时没事做的小练习. 百度对爬虫还是很友好的,在爬取内容方面还是较为容易. 可以方便各位读者去百度贴吧一键下载每个楼主的图片,至于是什么类型的图片,就看你 ...

  6. python3网络爬虫--爬取b站用户投稿视频信息(附源码)

    文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析数据加载方式 2.分词接口url 3.分析用户名(mid) 四.撰写爬虫 五.得到数据 六.总结 上次写了 ...

  7. python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例

    这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...

  8. python爬虫爬取百度文档

    使用python爬虫爬取百度文档文字 话不多说,直接上代码! import requests import reheaders = {"User-Agent": "Moz ...

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

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

最新文章

  1. 滑轨声源定向的理论模型与参数估计
  2. 9.切换 iframe
  3. 紧随时代发展 安防消费也在悄然发生改变
  4. 架构评审方法和思路总结
  5. JDK中提供的实现——通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例
  6. 【Mysql Docker】备份 docker mysql 脚本
  7. 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
  8. OAuth的MVC实现(微软)
  9. Unity3d中使用自带动画系统制作下雨效果(一)
  10. 一个简单servlet程序
  11. 统计范围内不含‘7‘的数字个数(洛谷P1590题题解,Java语言描述)
  12. asp.net中DataGrid双行跨列表头设计心得
  13. oracle 11g grid下载地址
  14. FFmpeg 视频裁剪
  15. ssis使用Excel目标的坑
  16. windowsxp下载python下载视频_Python实现视频下载功能
  17. WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK
  18. navicat ssh postgresql 报错:no password supplied
  19. 手摸手带你学移动端WEB开发
  20. MySQL学习笔记(3)--(DQL查询、MySQL函数)

热门文章

  1. Linux: 目录和文件
  2. 【fastadmin 如何根据用户角色 显示/隐藏 自定义按钮】
  3. 计算机硬件和工作原理,计算机硬件及基本工作原理ppt课件.ppt
  4. 阅读Hierarchical Graph Representation Learning with Differentiable Pooling(NeurIPS 2018)
  5. Markdown笔记利器:Typora主题-最美的模板
  6. 最新小米易支付系统源码
  7. mysql转换年月日_mysql日期转换和数字格式转换实例
  8. php 限定字符长度,php 字符串长度限制
  9. 高防CDN在防御DDoS攻击中必不可少?简析高防CDN针对防御DDoS攻击的可行方案
  10. 零停机给Kubernetes集群节点打系统补丁