基于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 相关文章推荐
Python isinstance函数介绍
Apr 14 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
May 24 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
Mar 04 Python
Python中的pack和unpack的使用
Mar 12 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
May 22 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
python requests指定出口ip的例子
Jul 25 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
python中setuptools的作用是什么
Jun 19 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
用Python selenium实现淘宝抢单机器人
Jun 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP Undefined index报错的修复方法
2011/07/17 PHP
php中选择什么接口(mysql、mysqli)访问mysql
2013/02/06 PHP
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
基于PHP实现邮箱验证激活过程详解
2020/10/28 PHP
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
用JavaScript实现对话框的教程
2015/06/04 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
React全家桶环境搭建过程详解
2018/05/18 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
浅析JavaScript中的事件委托机制跟深浅拷贝
2021/01/20 Javascript
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
Python整型运算之布尔型、标准整型、长整型操作示例
2017/07/21 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
2018/01/09 Python
Python生成器以及应用实例解析
2018/02/08 Python
python学生管理系统代码实现
2020/04/05 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
值得收藏的HTML5资源(学习html5的朋友可以收藏下)
2010/07/20 HTML / CSS
德国高品质男装及配饰商城:Cultizm(Raw Denim原色牛仔裤)
2018/04/16 全球购物
升职自荐信
2013/11/28 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
产品包装策划方案
2014/05/18 职场文书