python爬虫实战(2)--爬取百度贴吧
本篇目标
1.对百度贴吧的任意帖子进行抓取
2.指定是否只抓取楼主发帖内容
3.将抓取到的内容分析并保存到文件
1.URL格式的确定
先观察百度贴吧url格式,以中南财经政法大学迎新帖为例,URL我们划分基础部分是 http://tieba.baidu.com/p/5174106966,参数部分是 ?see_lz=1&pn=1
2.页面的抓取
一个初始化方法,一个获取页面的方法。另外,获取页面的方法我们需要知道一个参数就是帖子页码,所以这个参数的指定我们放在该方法中。
class Baidu_Spider:
# 申明相关的属性
def __init__(self, url):
self.myUrl = url + '?see_lz=1'
self.datas = []
self.myTool = HTML_Tool()
self.floor = 1
print u'已经启动百度贴吧爬虫' # 初始化加载页面并将其转码储存 def baidu_tieba(self):
# 读取页面的原始信息并将其从utf-8转码
myPage = urllib2.urlopen(self.myUrl).read().decode('utf-8')
# 计算楼主发布内容一共有多少页
endPage = self.page_counter(myPage)
# 获取该帖的标题
title = self.find_title(myPage)
print u'文章名称:' + title
# 获取最终的数据
self.save_data(self.myUrl, title, endPage) # 以中南财经政法大学迎新帖为例子
# bdurl = 'http://tieba.baidu.com/p/5174106966?see_lz=1&pn=1' print u'请输入贴吧的地址最后的数字串:'
bdurl = 'http://tieba.baidu.com/p/' + str(raw_input(u'http://tieba.baidu.com/p/'))
初始代码
3.提取相关信息
1)提取帖子页数
# 用来计算一共有多少页 def page_counter(self, myPage):
# 匹配 "共有<span class="red">12</span>页" 来获取一共有多少页
myMatch = re.search(r'class="red">(\d+?)</span>', myPage, re.S)
if myMatch:
endPage = int(myMatch.group(1))
print u'爬虫报告:发现楼主共有%d页的原创内容' % endPage
else:
endPage = 0
print u'爬虫报告:无法计算楼主发布内容有多少页!'
return endPage
提取页数
2)提取帖子标题
# 用来寻找该帖的标题 def find_title(self, myPage):
# 匹配 <h1 class="core_title_txt" title="">xxxxxxxxxx</h1> 找出标题
myMatch = re.search(r'<h1.*?>(.*?)</h1>', myPage, re.S)
title = u'暂无标题'
if myMatch:
title = myMatch.group(1)
else:
print u'爬虫报告:无法加载文章标题!'
# 文件名不能包含以下字符: \ / : * ? " < > |
title = title.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"',
'').replace(
'>', '').replace('<', '').replace('|', '')
return title
提取标题
3)获取信息并保存
# 用来存储楼主发布的内容 def save_data(self, url, title, endPage):
# 加载页面数据到数组中
self.get_data(url, endPage)
# 打开本地文件
f = open(title + '.txt', 'w+')
f.writelines(self.datas)
f.close()
print u'爬虫报告:文件已下载到本地并打包成txt文件'
print u'请按任意键退出...'
raw_input(); # 获取页面源码并将其存储到数组中 def get_data(self, url, endPage):
url = url + '&pn='
for i in range(1, endPage + 1):
print u'爬虫报告:爬虫%d号正在加载中...' % i
myPage = urllib2.urlopen(url + str(i)).read().decode('utf-8')
# 将myPage中的html代码处理并存储到datas里面
self.deal_data(myPage) # 将内容从页面代码中抠出来 def deal_data(self, myPage):
myItems = re.findall('id="post_content.*?>(.*?)</div>', myPage, re.S)
for item in myItems:
data = self.myTool.Replace_Char(item.encode('gbk'))
myFloor = (str(self.floor) + "楼--------------------------------------").decode('utf-8').encode('gbk')
self.datas.append(myFloor + '\n\n' + data + '\n\n')
self.floor += 1
提取信息
4.完善代码
# -*- coding: utf-8 -*-
# ---------------------------------------
# 程序:百度贴吧爬虫
# 作者:lzhc
# 日期:2017-12-11
# 语言:Python 2.7
# 操作:输入网址后自动只看楼主并保存到本地文件
# 功能:将楼主发布的内容打包txt存储到本地。
# --------------------------------------- import string
import urllib2
import re # ----------- 处理页面上的各种标签 -----------
class HTML_Tool:
# 用非 贪婪模式 匹配 \t 或者 \n 或者 空格 或者 超链接 或者 图片
BgnCharToNoneRex = re.compile("(\t|\n| |<a.*?>|<img.*?>)") # 用非 贪婪模式 匹配 任意<>标签
EndCharToNoneRex = re.compile("<.*?>") # 用非 贪婪模式 匹配 任意<p>标签
BgnPartRex = re.compile("<p.*?>")
CharToNewLineRex = re.compile("(<br>|</p>|<tr>|<div>|</div>)")
CharToNextTabRex = re.compile("<td>") def Replace_Char(self, x):
x = self.BgnCharToNoneRex.sub("", x)
x = self.BgnPartRex.sub("\n ", x)
x = self.CharToNewLineRex.sub("\n", x)
x = self.CharToNextTabRex.sub("\t", x)
x = self.EndCharToNoneRex.sub("", x)
return x class Baidu_Spider:
# 申明相关的属性
def __init__(self, url):
self.myUrl = url + '?see_lz=1'
self.datas = []
self.myTool = HTML_Tool()
self.floor = 1
print u'已经启动百度贴吧爬虫' # 初始化加载页面并将其转码储存 def baidu_tieba(self):
# 读取页面的原始信息并将其从utf-8转码
myPage = urllib2.urlopen(self.myUrl).read().decode('utf-8')
# 计算楼主发布内容一共有多少页
endPage = self.page_counter(myPage)
# 获取该帖的标题
title = self.find_title(myPage)
print u'文章名称:' + title
# 获取最终的数据
self.save_data(self.myUrl, title, endPage) # 用来计算一共有多少页 def page_counter(self, myPage):
# 匹配 "共有<span class="red">12</span>页" 来获取一共有多少页
myMatch = re.search(r'class="red">(\d+?)</span>', myPage, re.S)
if myMatch:
endPage = int(myMatch.group(1))
print u'爬虫报告:发现楼主共有%d页的原创内容' % endPage
else:
endPage = 0
print u'爬虫报告:无法计算楼主发布内容有多少页!'
return endPage # 用来寻找该帖的标题 def find_title(self, myPage):
# 匹配 <h1 class="core_title_txt" title="">xxxxxxxxxx</h1> 找出标题
myMatch = re.search(r'<h1.*?>(.*?)</h1>', myPage, re.S)
title = u'暂无标题'
if myMatch:
title = myMatch.group(1)
else:
print u'爬虫报告:无法加载文章标题!'
# 文件名不能包含以下字符: \ / : * ? " < > |
title = title.replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"',
'').replace(
'>', '').replace('<', '').replace('|', '')
return title # 用来存储楼主发布的内容 def save_data(self, url, title, endPage):
# 加载页面数据到数组中
self.get_data(url, endPage)
# 打开本地文件
f = open(title + '.txt', 'w+')
f.writelines(self.datas)
f.close()
print u'爬虫报告:文件已下载到本地并打包成txt文件'
print u'请按任意键退出...'
raw_input(); # 获取页面源码并将其存储到数组中 def get_data(self, url, endPage):
url = url + '&pn='
for i in range(1, endPage + 1):
print u'爬虫报告:爬虫%d号正在加载中...' % i
myPage = urllib2.urlopen(url + str(i)).read().decode('utf-8')
# 将myPage中的html代码处理并存储到datas里面
self.deal_data(myPage) # 将内容从页面代码中抠出来 def deal_data(self, myPage):
myItems = re.findall('id="post_content.*?>(.*?)</div>', myPage, re.S)
for item in myItems:
data = self.myTool.Replace_Char(item.encode('gbk'))
myFloor = (str(self.floor) + "楼--------------------------------------").decode('utf-8').encode('gbk')
self.datas.append(myFloor + '\n\n' + data + '\n\n')
self.floor += 1 # -------- 程序入口处 ------------------ print u"""#---------------------------------------
# 程序:百度贴吧爬虫
# 作者:lzhc
# 日期:2017-12-11
# 语言:Python 2.7
# 操作:输入网址后自动只看楼主并保存到本地文件
# 功能:将楼主发布的内容打包txt存储到本地。
#---------------------------------------
""" # 以中南财经政法大学迎新帖为例子
# bdurl = 'http://tieba.baidu.com/p/5174106966?see_lz=1&pn=1' print u'请输入贴吧的地址最后的数字串:'
bdurl = 'http://tieba.baidu.com/p/' + str(raw_input(u'http://tieba.baidu.com/p/')) # 调用
mySpider = Baidu_Spider(bdurl)
mySpider.baidu_tieba()
运行结果:
记入记事本中的内容:
python爬虫实战(2)--爬取百度贴吧的更多相关文章
- Python爬虫实战之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的任意帖子进行抓取 指定是否只抓取楼主发帖 ...
- 芝麻HTTP:Python爬虫实战之爬取百度贴吧帖子
本篇目标 1.对百度贴吧的任意帖子进行抓取 2.指定是否只抓取楼主发帖内容 3.将抓取到的内容分析并保存到文件 1.URL格式的确定 首先,我们先观察一下百度贴吧的任意一个帖子. 比如:http:// ...
- Python爬虫实战:爬取腾讯视频的评论
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 易某某 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
- Python 爬虫练习: 爬取百度贴吧中的图片
背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...
- Python爬虫实战之爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- Python爬虫实战之爬取糗事百科段子【华为云技术分享】
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- python爬虫实战之爬取智联职位信息和博客文章信息
1.python爬取招聘信息 简单爬取智联招聘职位信息 # !/usr/bin/env python # -*-coding:utf-8-*- """ @Author ...
- 芝麻HTTP:Python爬虫实战之爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...
- python 爬虫实战1 爬取糗事百科段子
首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 本篇目标 抓取糗事百科热门段子 过滤带有图片的段子 实现每按一次回车显示一个段子的发布时间,发布人 ...
- python 爬虫实战4 爬取淘宝MM照片
本篇目标 抓取淘宝MM的姓名,头像,年龄 抓取每一个MM的资料简介以及写真图片 把每一个MM的写真图片按照文件夹保存到本地 熟悉文件保存的过程 1.URL的格式 在这里我们用到的URL是 http:/ ...
随机推荐
- review14
日期的格式化 Formatter类的format方法: format(格式化模式, 日期列表) 按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示.“格式 ...
- 集成 ActiveMQ 到应用服务器
本章知识点 集成 ActiveMQ 和 Apache Tomcat 集成 ActiveMQ 和 Jetty 集成 ActiveMQ 和 Apache Geronimo 集成 ActiveMQ 和 JB ...
- hdu 2149 Public Sale(bash)
Public Sale Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 2509 Be the Winner(anti nim)
Be the Winner Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 一些蠕虫传播研究的文章——TODO
www.arocmag.com/getarticle/?aid=4e02d91c19b0cced Internet 蠕虫防范技术研究http://www.arocmag.com/article/100 ...
- python--关于if __name__==__main__的解释
在解释之前首先我们看下__name__这个变量存的是什么: #!/usr/bin/env python # -*- coding:utf-8 -*- print(__name__) 结果: __mai ...
- mysql 开发标准规范
一.表设计 1. 库名.表名.字段名使用小写字母,“_”分割. 2. 库名.表名.字段名不超过12个字符. 3. 库名.表名.字段名见名知意,尽量使用名词而不是动词. 4. 优先使用InnoDB存储引 ...
- ThinkPHP中的find和select的区别
ThinkPHP作为PHP中应用广泛又好用的框架,能比较快速的开发MVC架构的管理系统,获得了大量的应用.但是在ThinkPHP中select()和find()方法有什么区别呢? 事实上find()返 ...
- UVALive - 5031 Graph and Queries (并查集+平衡树/线段树)
给定一个图,支持三种操作: 1.删除一条边 2.查询与x结点相连的第k大的结点 3.修改x结点的权值 解法:离线倒序操作,平衡树or线段树维护连通块中的所有结点信息,加个合并操作就行了. 感觉线段树要 ...
- yum search/intall, Error: xz compression not available
转自:http://blog.hexu.org/archives/2060.shtml 遇到这个问题情景: 下午第一台系统是Centos7, 安装配置完成后,接着一台是Centos 6 系统,由于疏忽 ...