基于Python实现的百度贴吧网络爬虫实例


Posted in Python onApril 17, 2015

本文实例讲述了基于Python实现的百度贴吧网络爬虫。分享给大家供大家参考。具体如下:

完整实例代码点击此处本站下载。

项目内容:

用Python写的百度贴吧的网络爬虫。

使用方法:

新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行。

程序功能:

将贴吧中楼主发布的内容打包txt存储到本地。

原理解释:

首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了:
http://tieba.baidu.com/p/2296712428?see_lz=1&pn=1

可以看出来,see_lz=1是只看楼主,pn=1是对应的页码,记住这一点为以后的编写做准备。
这就是我们需要利用的url。
接下来就是查看页面源码。
首先把题目抠出来存储文件的时候会用到。
可以看到百度使用gbk编码,标题使用h1标记:

<h1 class="core_title_txt" title="【原创】时尚首席(关于时尚,名利,事业,爱情,励志)">【原创】时尚首席(关于时尚,名利,事业,爱情,励志)</h1>

同样,正文部分用div和class综合标记,接下来要做的只是用正则表达式来匹配即可。

运行截图:

基于Python实现的百度贴吧网络爬虫实例

生成的txt文件:

基于Python实现的百度贴吧网络爬虫实例

# -*- coding: utf-8 -*- 
#--------------------------------------- 
#  程序:百度贴吧爬虫 
#  版本:0.5 
#  作者:why 
#  日期:2013-05-16 
#  语言: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>") 
  # 将一些html的符号实体转变为原始符号 
  replaceTab = [("<","<"),(">",">"),("&","&"),("&","\""),(" "," ")] 
  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) 
    for t in self.replaceTab:  
      x = x.replace(t[0],t[1])  
    return x  
class Baidu_Spider: 
  # 申明相关的属性 
  def __init__(self,url):  
    self.myUrl = url + '?see_lz=1' 
    self.datas = [] 
    self.myTool = HTML_Tool() 
    print u'已经启动百度贴吧爬虫,咔嚓咔嚓' 
  # 初始化加载页面并将其转码储存 
  def baidu_tieba(self): 
    # 读取页面的原始信息并将其从gbk转码 
    myPage = urllib2.urlopen(self.myUrl).read().decode("gbk") 
    # 计算楼主发布内容一共有多少页 
    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() 
      # 将myPage中的html代码处理并存储到datas里面 
      self.deal_data(myPage.decode('gbk')) 
  # 将内容从页面代码中抠出来 
  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.replace("\n","").encode('gbk')) 
      self.datas.append(data+'\n') 
 
#-------- 程序入口处 ------------------ 
print u"""#--------------------------------------- 
#  程序:百度贴吧爬虫 
#  版本:0.5 
#  作者:why 
#  日期:2013-05-16 
#  语言:Python 2.7 
#  操作:输入网址后自动只看楼主并保存到本地文件 
#  功能:将楼主发布的内容打包txt存储到本地。 
#--------------------------------------- 
""" 
# 以某小说贴吧为例子 
# bdurl = 'http://tieba.baidu.com/p/2296712428?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程序设计有所帮助。

Python 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
python修改文件内容的3种方法详解
Nov 15 Python
Python实现word2Vec model过程解析
Dec 16 Python
关于Tensorflow分布式并行策略
Feb 03 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
Python使用扩展库pywin32实现批量文档打印实例
Apr 09 Python
Python+PyQt5实现灭霸响指功能
May 25 Python
使用Python构造hive insert语句说明
Jun 06 Python
python中判断文件结束符的具体方法
Aug 04 Python
Python 操作 MySQL数据库
Sep 18 Python
python中dir函数用法分析
Apr 17 #Python
python传递参数方式小结
Apr 17 #Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 #Python
python类继承与子类实例初始化用法分析
Apr 17 #Python
python中split方法用法分析
Apr 17 #Python
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 #Python
python字典get()方法用法分析
Apr 17 #Python
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
js 巧妙去除数组中的重复项
2010/01/25 Javascript
jQuery.validate 常用方法及需要注意的问题
2013/03/20 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
JavaScript预解析及相关技巧分析
2016/04/21 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
JavaScript订单操作小程序完整版
2017/06/23 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
微信小程序实现消息框弹出动画
2020/04/18 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
浅析Python中的join()方法的使用
2015/05/19 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
pyqt5的QComboBox 使用模板的具体方法
2018/09/06 Python
python中树与树的表示知识点总结
2019/09/14 Python
python定义类self用法实例解析
2020/01/22 Python
Python 如何对文件目录操作
2020/07/10 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
Canvas高级路径操作之拖拽对象的实现
2019/08/05 HTML / CSS
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
计算机毕业大学生推荐信
2013/12/01 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
小学教师师德师风演讲稿
2014/08/22 职场文书
行政撤诉申请书
2015/05/18 职场文书
经营场所使用证明
2015/06/19 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang