Python3 简单爬虫爬取百度贴吧帖子
使用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 简单爬虫爬取百度贴吧帖子相关推荐
- java 百度贴吧 爬虫,爬取百度贴吧帖子
依然是参考教程 Python爬虫实战一之爬取百度贴吧帖子.作者崔庆才写了很多关于Python爬虫的文章,大家有兴趣的话可以去他的个人博客静觅学习. 这次将爬取的数据写入了文本文件中,并用到了re模块中 ...
- python爬取百度百科词条-python简单爬虫爬取百度百科python词条网页
目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...
- python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页
目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...
- python爬虫吧-python爬虫-爬取百度贴吧帖子加图片
1.[代码][Python]代码 # -*- coding: utf-8 -*- """ 百度贴吧帖子抓取 """ import urlli ...
- python3爬虫爬取百度贴吧下载图片
python3爬虫爬取百度贴吧下载图片 学习爬虫时没事做的小练习. 百度对爬虫还是很友好的,在爬取内容方面还是较为容易. 可以方便各位读者去百度贴吧一键下载每个楼主的图片,至于是什么类型的图片,就看你 ...
- python3网络爬虫--爬取b站用户投稿视频信息(附源码)
文章目录 一.准备工作 1.工具 二.思路 1.整体思路 2.爬虫思路 三.分析网页 1.分析数据加载方式 2.分词接口url 3.分析用户名(mid) 四.撰写爬虫 五.得到数据 六.总结 上次写了 ...
- python爬虫代码实例-Python爬虫爬取百度搜索内容代码实例
这篇文章主要介绍了Python爬虫爬取百度搜索内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 搜索引擎用的很频繁,现在利用Python爬 ...
- python爬虫爬取百度文档
使用python爬虫爬取百度文档文字 话不多说,直接上代码! import requests import reheaders = {"User-Agent": "Moz ...
- Python爬虫实战之爬取百度贴吧帖子
Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...
最新文章
- 滑轨声源定向的理论模型与参数估计
- 9.切换 iframe
- 紧随时代发展 安防消费也在悄然发生改变
- 架构评审方法和思路总结
- JDK中提供的实现——通过 java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现它们的子类就可以编写观察者模式实例
- 【Mysql Docker】备份 docker mysql 脚本
- 计算机专业新老生交流会ppt,铜陵学院实践部新老生交流会.ppt
- OAuth的MVC实现(微软)
- Unity3d中使用自带动画系统制作下雨效果(一)
- 一个简单servlet程序
- 统计范围内不含‘7‘的数字个数(洛谷P1590题题解,Java语言描述)
- asp.net中DataGrid双行跨列表头设计心得
- oracle 11g grid下载地址
- FFmpeg 视频裁剪
- ssis使用Excel目标的坑
- windowsxp下载python下载视频_Python实现视频下载功能
- WAITED TOO LONG FOR A ROW CACHE ENQUEUE LOCK
- navicat ssh postgresql 报错:no password supplied
- 手摸手带你学移动端WEB开发
- MySQL学习笔记(3)--(DQL查询、MySQL函数)
热门文章
- Linux: 目录和文件
- 【fastadmin 如何根据用户角色 显示/隐藏 自定义按钮】
- 计算机硬件和工作原理,计算机硬件及基本工作原理ppt课件.ppt
- 阅读Hierarchical Graph Representation Learning with Differentiable Pooling(NeurIPS 2018)
- Markdown笔记利器:Typora主题-最美的模板
- 最新小米易支付系统源码
- mysql转换年月日_mysql日期转换和数字格式转换实例
- php 限定字符长度,php 字符串长度限制
- 高防CDN在防御DDoS攻击中必不可少?简析高防CDN针对防御DDoS攻击的可行方案
- 零停机给Kubernetes集群节点打系统补丁